¿Hay alguna manera de verificar la igualdad matemática de dos declaraciones SQL?
Tengo dos declaraciones SQL:
- SQL_STATEMENT_1
- SQL_STATEMENT_2
Ejecutar ambas declaraciones en los datos y comparar la salida no ayuda en absoluto.
Es necesario evaluar las matemáticas detrás de las declaraciones, como lo hace un solucionador de ecuaciones.
Fuera del alcance de mi pregunta hay cosas como:
- comparaciones distintas a la igualdad (mayor que, menor que, COMO, ...)
- procedimientos almacenados o desencadenantes
- Expresiones de tabla comunes (CON)
En la mira:
- Subselecciones: WHERE other_id IN (SELECCIONAR ID de otro WHERE ...)
- UNIONES
database-theory
guettli
fuente
fuente
select * from foo where id = 4
seguramente tendrá el mismo plan de ejecución queselect * from foo where id = 2
select * from foo where id = 4
yselect * from foo where id = 2
tener dos planes de ejecución diferentes si 1) las estadísticas del índice no están actualizadas y 2) incluso si las estadísticas del índice están actualizadas, la distribución clave de id es desigual (El ID proporcionado no es una clave única).Respuestas:
¿Cuál es la igualdad matemática de dos declaraciones SQL? Para mí, dos consultas son equivalentes si, cuando se les da el mismo conjunto de datos, devuelven el mismo conjunto de resultados.
Como señaló, las consultas SQL, un superconjunto de álgebra relacional , pueden ser muy complejas. Podemos mezclar subconsultas, usar procedimientos almacenados y funciones ( deterministas o no) que harán que su consulta se parezca más a un código real . Si está hablando de este tipo de consultas, será muy difícil. De hecho, probablemente no es diferente del problema "son dos algoritmos equivalentes".
En esas condiciones, probablemente sea imposible.
Sin embargo...
... podría ser factible si las dos consultas que desea comparar son operaciones de conjunto estrictas. Si es así, puede convertir las consultas a álgebra relacional y luego resolverlas siguiendo las reglas de equivalencia . Si tiene una selección / restricción con condiciones booleanas no triviales, es posible que necesite probar que esas condiciones también son equivalentes. Entonces necesitarás confiar en el álgebra booleana y probablemente terminarás haciendo una tabla de verdad .
Como puede ver, esto va a ser mucho trabajo y, hasta donde yo sé, no existe nada para calcular todo eso automáticamente. Sin embargo, encontré algunas herramientas que pueden resultarle útiles si desea abordar la tarea:
fuente
Es imposible verificar la equivalencia semántica en tiempo finito por definición, ver el teorema de Rice :
fuente
El usuario de dba Lennart me señaló este proyecto:
http://cosette.cs.washington.edu/
fuente
Una forma de hacerlo es crear un analizador sintáctico, o mejor, usar uno existente. Creo que C # tiene una clase TSQLParser y tiene un método Parse (). El analizador dividirá su consulta en subclases que luego podrá comparar.
fuente
Si está buscando una prueba de equivalencia basada en la teoría de conjuntos, su mejor opción es convertir cualquier
WHERE
condición que pueda convertirse en un tipo deJOIN
(interno o externo) y refactorizar la declaración. Esto incluyeIN subselect
yEXISTS subselect
y cualquier otra condición en laWHERE
cláusula que contiene la palabraSELECT
. Si realiza esto en ambas declaraciones SQL, tendrá una nuevaFROM
cláusula que representa la lógica / matemática basada en conjuntos que le interesa. Luego, puede comparar visualmente las dos declaraciones. Si está buscando una forma automatizada de hacer todo esto, no conozco una herramienta que pueda hacer exactamente esto.fuente