Existe uma maneira de obter a igualdade matemática de duas instruções SQL?
Eu tenho duas instruções SQL:
- SQL_STATEMENT_1
- SQL_STATEMENT_2
Executar as duas instruções nos dados e comparar a saída não ajuda em nada.
O conjunto de matemática por trás das instruções precisa ser avaliado, como um solucionador de equações.
Fora do escopo da minha pergunta estão coisas como:
- comparações que não sejam igualdade (maior que, menor que, LIKE, ...)
- procedimentos armazenados ou gatilhos
- Expressões de tabela comum (WITH)
No escopo:
- Subseleciona: WHERE other_id IN (SELECT id FROM other WHERE ...)
- JUNTAS
database-theory
guettli
fonte
fonte
select * from foo where id = 4
certamente vai ter o mesmo plano de execução comoselect * from foo where id = 2
select * from foo where id = 4
eselect * from foo where id = 2
ter dois planos de execução diferentes se 1) as estatísticas do índice não estiverem atualizadas e 2) mesmo que as estatísticas do índice estejam atualizadas, a distribuição principal do id é desigual (o ID fornecido não é uma chave exclusiva).Respostas:
Qual é a igualdade matemática de duas instruções SQL? Para mim, duas consultas são equivalentes se, ao receberem o mesmo de qualquer conjunto de dados, retornarem o mesmo conjunto de resultados.
Como você apontou, as consultas SQL, um superconjunto de álgebra relacional , podem ser muito complexas. Podemos misturar subconsultas, usar procedimentos e funções armazenados ( determinísticos ou não), o que fará com que sua consulta se pareça mais com código real . Se você estiver falando sobre esse tipo de consulta, será muito difícil. De fato, provavelmente não é diferente do que o problema "são dois algoritmos equivalentes".
Nessas condições, é provavelmente impossível.
Contudo...
... pode ser possível se as duas consultas que você deseja comparar forem operações estritas de conjunto. Nesse caso, você pode converter as consultas em álgebra relacional e, em seguida, resolvê-las seguindo as regras de equivalência . Se você tiver uma seleção / restrição com condições booleanas não triviais, poderá precisar provar que essas condições também são equivalentes. Você precisará confiar na álgebra booleana e provavelmente acabará criando uma tabela de verdade .
Como você pode ver, isso vai dar muito trabalho e, tanto quanto eu sei, nada existe para calcular tudo isso automaticamente. No entanto, eu encontrei algumas ferramentas que você pode achar úteis se quiser executar a tarefa:
fonte
É impossível verificar a equivalência semântica em tempo finito por definição, veja o teorema de Rice :
fonte
O usuário do dba Lennart me apontou para este projeto:
http://cosette.cs.washington.edu/
fonte
Uma maneira de fazer isso é criar um analisador, ou melhor, usar um existente. Eu acredito que C # tem uma classe TSQLParser e tem um método Parse (). O analisador quebrará sua consulta em subclasses que você poderá comparar.
fonte
Se você estiver procurando por um teste de equivalência baseado na Teoria dos Conjuntos, sua melhor aposta é converter quaisquer
WHERE
condições que possam ser convertidas em um tipo deJOIN
(interno ou externo) e ter a instrução refatorada. Isso incluiIN subselect
eEXISTS subselect
outras condições naWHERE
cláusula que contém a palavraSELECT
. Se você fizer isso nas duas instruções SQL, terá uma novaFROM
cláusula que representa a lógica / matemática baseada em conjunto em que está interessado. Em seguida, você pode comparar visualmente as duas instruções. Se você está procurando uma maneira automatizada de fazer tudo isso, não conheço uma ferramenta que possa fazer exatamente isso.fonte