Uguaglianza matematica di due istruzioni SQL


9

C'è un modo per verificare l'uguaglianza matematica di due istruzioni SQL?

Ho due istruzioni SQL:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

Eseguire entrambe le istruzioni sui dati e confrontare l'output non aiuta affatto.

La matematica impostata dietro le affermazioni deve essere valutata, come fa un risolutore di equazioni.

Fuori dalla portata della mia domanda ci sono cose come:

  • confronti diversi dall'uguaglianza (maggiore di, minore di, COME, ...)
  • stored procedure o trigger
  • Espressioni di tabella comuni (WITH)

Nel campo di applicazione:

  • Sottoselezioni: WHERE other_id IN (SELEZIONA ID DA altro DOVE ...)
  • SI UNISCE

Una soluzione parziale sarebbe quella di confrontare i piani di esecuzione di 2 query. Se i piani di esecuzione sono uguali, sono uguali. Tuttavia, la relazione non funziona in entrambi i modi. Possono esserci 2 query logicamente equivalenti che hanno piani di esecuzione diversi.
BuahahaXD

1
@BuahahaXD: non è vero. select * from foo where id = 4avrà sicuramente lo stesso piano di esecuzione diselect * from foo where id = 2
a_horse_with_no_name il

@a_horse_with_no_name L'ho provato su SQL Server e ho ottenuto 2 diversi file XML. I parametri sono stati inclusi come nodo <ParameterList> nel file XML. Visivamente, questi piani erano identici (scansione tabella + selezione). Ma credo che potresti aver ragione nel confrontare i piani di esecuzione.
BuahahaXD

1
@a_horse_with_no_name è corretto quando si tratta di chiavi univoche. Per tutti gli altri, è possibile select * from foo where id = 4e select * from foo where id = 2avere due diversi piani di esecuzione se 1) le statistiche dell'indice non sono aggiornate e 2) anche se le statistiche dell'indice sono aggiornate, la distribuzione chiave dell'id è sbilanciata (purché l'id non sia una chiave univoca).
RolandoMySQLDBA,

Risposte:


6

Qual è l'uguaglianza matematica di due istruzioni SQL? Per me due query sono equivalenti se, se fornite allo stesso set di dati, restituiscono lo stesso set di risultati.

Come hai sottolineato, le query SQL, un superset di algebra relazionale , possono essere molto complesse. Siamo in grado di mescolare sottoquery, utilizzare procedure e funzioni memorizzate ( deterministiche o meno) che ti faranno sembrare più simile al codice reale . Se stai parlando di questo tipo di domande, sarà davvero difficile. In effetti, probabilmente non è diverso dal problema "sono due algoritmi equivalenti".

In quelle condizioni è probabilmente impossibile.

Però...

... potrebbe essere fattibile se le due query che si desidera confrontare sono operazioni con set rigorosi. In tal caso, è possibile convertire le query in algebra relazionale e quindi elaborarle seguendo le regole di equivalenza . Se si dispone di una selezione / restrizione con condizioni booleane non banali, potrebbe essere necessario provare che tali condizioni sono anche equivalenti. Dovrai quindi fare affidamento sull'algebra booleana e probabilmente finirai per fare una tabella di verità .

Come puoi vedere, questo richiederà molto lavoro e, per quanto ne so, non esiste nulla per calcolare tutto automaticamente. Tuttavia, ho trovato alcuni strumenti che potresti trovare utili se vuoi affrontare il compito:


La mia domanda riguarda solo le operazioni impostate. Ho aggiornato la domanda. È legato al problema "sono due algoritmi equivalenti". Ma il contesto è limite, solo le operazioni di base di insiemi, join, sottoselezioni sono nel mio ambito.
Guettli,

3

È impossibile controllare l'equivalenza semantica a tempo finito per definizione, vedere il teorema di Rice :

per qualsiasi proprietà non banale di funzioni parziali, non esiste un metodo generale ed efficace per decidere se un algoritmo calcola una funzione parziale con quella proprietà.


2
Questo non è solo un commento. Puoi espandere l'applicabilità di Rice in questo contesto, per favore.
Michael Green,

Anche se teoricamente fosse possibile, l'attuale sintassi dello standard SQL è così barocca che sarebbe impossibile in pratica
James Anderson,

1
Con la spiegazione di OP sembra che la domanda sia più sull'equivalenza logica che sull'equivalenza semantica. La vera domanda è: possiamo convertire le istruzioni SQL in un'espressione matematica e quindi valutare l'equivalenza logica?
Dimentica il

2

Lennart, utente dba, mi ha indicato questo progetto:

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

Cosette è un prover automatizzato per il controllo delle equivalenze delle query SQL. Formalizza un sostanziale frammento di SQL in Coq Proof Assistant e nella macchina virtuale simbolica Rosette. Restituisce una prova formale di equivalenza o un controesempio per una coppia di determinate query.


1

Un modo per farlo è costruire un parser o, meglio, usarne uno esistente. Credo che C # abbia una classe TSQLParser e abbia un metodo Parse (). Il parser suddividerà la tua query in sottoclassi che potrai quindi confrontare.


1

Se stai cercando un test di equivalenza basato sulla teoria degli insiemi, la soluzione migliore è quella di convertire tutte le WHEREcondizioni che possono essere convertite in un tipo di JOIN(interno o esterno) e far riformattare la dichiarazione. Questo include IN subselected EXISTS subselecte tutte le altre condizioni della WHEREclausola che contiene la parola SELECT. Se esegui questa operazione su entrambe le istruzioni SQL, avrai una nuova FROMclausola che rappresenta la logica / matematica basata su set che ti interessa. Quindi puoi semplicemente confrontare visivamente le due istruzioni. Se stai cercando un modo automatizzato di fare tutto questo, non conosco uno strumento in grado di fare esattamente questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.