İki SQL ifadesinin matematiksel eşitliği


9

İki SQL ifadesinin matematiksel eşitliğini kontrol etmenin bir yolu var mı?

İki SQL deyimim var:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

Verilerin her iki ifadesini de çalıştırmak ve çıktıyı karşılaştırmak hiç yardımcı olmuyor.

İfadelerin arkasındaki set matematiğinin, bir denklem çözücü gibi değerlendirilmesi gerekir.

Sorumun kapsamı dışında:

  • eşitlik dışındaki diğer karşılaştırmalar (LIKE'den daha büyük, daha küçük, ...)
  • saklı yordamlar veya tetikleyiciler
  • Ortak Tablo İfadeleri (WITH)

Bu kapsamda:

  • Alt seçimler: WHERE other_id IN (Diğer NEREDEN KİMİ SEÇ ...)
  • KATILIYOR

Kısmi bir çözüm, 2 sorgunun yürütme planlarını karşılaştırmak olacaktır. Eğer yürütme planları aynıysa, o zaman eşittir. Ancak ilişki her iki şekilde de çalışmaz. Farklı yürütme planlarına sahip 2 mantıksal olarak eşdeğer sorgu olabilir.
BuahahaXD

1
@BuahahaXD: bu doğru değil. select * from foo where id = 4kesinlikle aynı yürütme planına sahip olacakselect * from foo where id = 2
a_horse_with_no_name

@a_horse_with_no_name SQL Server'da test ettim ve 2 farklı XML dosyası aldım. Parametreler XML dosyasına bir <ParameterList> düğümü olarak dahil edildi. Görsel olarak, bu planlar aynıydı (tablo tarama + seçme). Ama yürütme planlarını karşılaştırma konusunda haklı olabileceğinize inanıyorum.
BuahahaXD

1
@a_horse_with_no_name, benzersiz anahtarlar söz konusu olduğunda doğrudur. Diğerleri için, 1) indeks istatistikleri güncel değilse ve 2) indeks istatistikleri güncel olsa bile, kimliğin anahtar dağılımı kaydırılmışsa, iki farklı yürütme planının olması select * from foo where id = 4ve olması mümkündür. select * from foo where id = 2(kimliğin benzersiz bir anahtar olmaması şartıyla).
RolandoMySQLDBA

Yanıtlar:


6

İki SQL ifadesinin matematiksel eşitliği nedir? Benim için, her iki veri kümesinin de aynısı verildiğinde aynı sonuç kümesini döndürürlerse iki sorgu eşdeğerdir.

Belirttiğiniz gibi, ilişkisel cebirin bir üst kümesi olan SQL sorguları çok karmaşık olabilir. Alt sorguları karıştırabilir, saklanmış yordamları ve işlevleri kullanabilir ( deterministik veya değil), bu da sorguyu daha çok gerçek koda benzetir . Bu tür sorgular hakkında konuşuyorsanız, o zaman gerçekten zor olacak. Aslında muhtemelen "iki algoritma eşdeğerdir" probleminden farklı değildir.

Bu koşullar altında muhtemelen imkansızdır.

Ancak...

... karşılaştırmak istediğiniz iki sorgunun katı küme işlemleri olması mümkün olabilir . Öyleyse, sorguları ilişkisel cebire dönüştürebilir ve denklik kurallarına göre çalıştırabilirsiniz . Önemsiz boolean koşullarıyla bir seçim / kısıtlamanız varsa, koşulların da eşdeğer olduğunu kanıtlamanız gerekebilir. Daha sonra boole cebirine güvenmeniz gerekecek ve muhtemelen bir doğruluk tablosu yapacaksınız .

Gördüğünüz gibi bu çok iş olacak ve bildiğim kadarıyla bunların hepsini otomatik olarak hesaplayacak hiçbir şey yok. Bununla birlikte, görevi yerine getirmek istiyorsanız yararlı bulabileceğiniz bazı araçlar buldum:


Benim sorum sadece set operasyonları ile ilgili. Soruyu güncelledim. "İki algoritma eşdeğerdir" sorunu ile ilgilidir. Ancak bağlam sınırlıdır, sadece kümelerin, birleşimlerin, alt seçimlerin temel işlemleri benim kapsamımdadır.
guettli

3

Anlamsal denkliği sonlu sürede tanımlamak mümkün değildir, bkz. Rice teoremi :

kısmi işlevlerin önemsiz olmayan özellikleri için, bir algoritmanın söz konusu özellikle kısmi bir işlevi hesaplayıp hesaplamayacağına karar vermenin genel ve etkili bir yöntemi yoktur.


2
Bu sadece bir yorum değil. Rice'ın bu bağlamda uygulanabilirliğini genişletebilir misiniz, lütfen.
Michael Green

Teorik olarak mümkün olsa bile, mevcut SQL standart sözdizimi çok baroktur, pratikte imkansız olurdu
James Anderson

1
OP açıklaması ile soru anlamsal eşdeğerlikten ziyade mantıksal eşdeğerlik hakkındadır. Asıl soru şudur: SQL ifadelerini matematiksel bir ifadeye dönüştürüp mantıksal denkliği değerlendirebilir miyiz?
ForguesR

2

dba kullanıcısı Lennart beni bu projeye işaret etti:

http://cosette.cs.washington.edu/

Cosette, SQL sorgularının denkliklerini kontrol etmek için otomatik bir kanıttır. Coq Proof Assistant ve Rosette sembolik sanal makinesinde SQL'in önemli bir parçasını resmileştirir. Verilen bir eşdeğerlik için resmi bir eşdeğerlik kanıtı veya bir karşı örnek örneği döndürür.


1

Bunu yapmanın bir yolu, bir ayrıştırıcı oluşturmak veya daha iyisi var olanı kullanmaktır. C # bir TSQLParser sınıfı ve bir Parse () yöntemi olduğuna inanıyorum. Ayrıştırıcı, sorgunuzu daha sonra karşılaştırabileceğiniz alt sınıflara böler.


1

Set Teorisi tabanlı bir denklik testi arıyorsanız, en iyi seçeneğiniz, WHEREbir tür JOIN(iç veya dış) biçime dönüştürülebilen ve ifadenin yeniden düzenlenmesi için herhangi bir koşulu dönüştürmektir . Bu, IN subselectve EXISTS subselectve WHEREyan tümcesinde kelimeyi içeren diğer koşulları içerir SELECT. Bunu her iki SQL deyiminde de gerçekleştirirseniz FROM, ilgilendiğiniz küme tabanlı mantığı / matematiği temsil eden yeni bir cümleniz olacaktır . Sonra iki ifadeyi görsel olarak karşılaştırabilirsiniz. Tüm bunları yapmanın otomatik bir yolunu arıyorsanız, bunu tam olarak yapabilen bir araç bilmiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.