Gibt es eine Möglichkeit, die mathematische Gleichheit zweier SQL-Anweisungen zu überprüfen?
Ich habe zwei SQL-Anweisungen:
- SQL_STATEMENT_1
- SQL_STATEMENT_2
Das Ausführen beider Anweisungen für Daten und das Vergleichen der Ausgabe hilft überhaupt nicht.
Die Mengenmathematik hinter den Anweisungen muss wie bei einem Gleichungslöser ausgewertet werden.
Außerhalb des Rahmens meiner Frage liegen Dinge wie:
- andere Vergleiche als Gleichheit (größer als, kleiner als, LIKE, ...)
- gespeicherte Prozeduren oder Trigger
- Allgemeine Tabellenausdrücke (WITH)
Im Rahmen:
- Unterauswahl: WHERE other_id IN (SELECT id FROM other WHERE ...)
- Tritt bei
database-theory
guettli
quelle
quelle
select * from foo where id = 4
wird mit Sicherheit den gleichen Ausführungsplan haben wieselect * from foo where id = 2
select * from foo where id = 4
undselect * from foo where id = 2
zu haben, wenn 1) die Indexstatistiken nicht aktuell sind und 2) selbst wenn die Indexstatistiken aktuell sind, die Schlüsselverteilung der ID schief ist (vorausgesetzt, die ID ist kein eindeutiger Schlüssel).Antworten:
Was ist die mathematische Gleichheit zweier SQL-Anweisungen? Für mich sind zwei Abfragen gleichwertig, wenn sie, wenn beide von einem Datensatz gleich sind, dieselbe Ergebnismenge zurückgeben.
Wie Sie bereits betont haben, können SQL-Abfragen, eine Obermenge der relationalen Algebra , sehr komplex sein. Wir können Unterabfragen mischen, gespeicherte Prozeduren und Funktionen ( deterministisch oder nicht) verwenden, sodass Ihre Abfrage eher wie echter Code aussieht . Wenn Sie über diese Art von Fragen sprechen, wird es wirklich schwierig sein. In der Tat ist es wahrscheinlich nicht anders als das Problem "Sind zwei Algorithmen äquivalent".
Unter diesen Bedingungen ist es wahrscheinlich unmöglich.
Jedoch...
... ist es möglicherweise möglich, wenn die beiden Abfragen, die Sie vergleichen möchten, strenge Set-Operationen sind. In diesem Fall können Sie die Abfragen in relationale Algebra konvertieren und anschließend nach Äquivalenzregeln ausarbeiten . Wenn Sie eine Auswahl / Einschränkung mit nichttrivialen booleschen Bedingungen haben, müssen Sie möglicherweise nachweisen, dass diese Bedingungen ebenfalls gleichwertig sind. Sie müssen sich dann auf die boolesche Algebra verlassen und werden wahrscheinlich eine Wahrheitstabelle erstellen .
Wie Sie sehen, wird dies eine Menge Arbeit sein, und soweit ich weiß, gibt es nichts, was all dies automatisch berechnen könnte. Trotzdem habe ich einige Tools gefunden, die Sie möglicherweise nützlich fanden, wenn Sie die Aufgabe angehen möchten:
quelle
Es ist unmöglich, die semantische Äquivalenz in endlicher Zeit per Definition zu überprüfen, siehe Rices Theorem :
quelle
Der dba-Benutzer Lennart hat mich auf dieses Projekt hingewiesen:
http://cosette.cs.washington.edu/
quelle
Eine Möglichkeit besteht darin, einen Parser zu erstellen oder besser einen vorhandenen zu verwenden. Ich glaube, C # hat eine TSQLParser-Klasse und eine Parse () -Methode. Der Parser teilt Ihre Abfrage in Unterklassen auf, die Sie dann vergleichen können.
quelle
Wenn Sie nach einem auf Mengenlehre basierenden Äquivalenztest suchen, ist es am besten, alle
WHERE
Bedingungen, die in eine Art vonJOIN
(innerer oder äußerer) umgewandelt werden können , umzuwandeln und die Anweisung überarbeiten zu lassen. Dies schließtIN subselect
undEXISTS subselect
und alle anderen Bedingungen in derWHERE
Klausel ein, die das Wort enthältSELECT
. Wenn Sie dies für beide SQL-Anweisungen ausführen, erhalten Sie eine neueFROM
Klausel, die die satzbasierte Logik / Mathematik darstellt, an der Sie interessiert sind. Anschließend können Sie die beiden Anweisungen nur visuell vergleichen. Wenn Sie nach einer automatisierten Methode suchen, um all dies zu tun, kenne ich kein Tool, das genau dies kann.quelle