Existe-t-il un moyen de vérifier l'égalité mathématique de deux instructions SQL?
J'ai deux instructions SQL:
- SQL_STATEMENT_1
- SQL_STATEMENT_2
L'exécution des deux instructions sur les données et la comparaison de la sortie n'aident pas du tout.
Les mathématiques définies derrière les instructions doivent être évaluées, comme le fait un solveur d'équations.
Hors de la portée de ma question sont des choses comme:
- comparaisons autres que l'égalité (supérieure à, inférieure à, LIKE, ...)
- procédures stockées ou déclencheurs
- Expressions de table communes (AVEC)
Dans le cadre:
- Sous-sélection: WHERE other_id IN (SELECT id FROM other WHERE ...)
- SE JOINT
database-theory
guettli
la source
la source
select * from foo where id = 4
aura très certainement le même plan d'exécution queselect * from foo where id = 2
select * from foo where id = 4
etselect * from foo where id = 2
d'avoir deux plans d'exécution différents si 1) les statistiques d'index ne sont pas à jour et 2) même si les statistiques d'index sont à jour, la distribution de clé d'id est déséquilibrée (l'id fourni n'est pas une clé unique).Réponses:
Quelle est l'égalité mathématique de deux instructions SQL? Pour moi, deux requêtes sont équivalentes si, lorsqu'elles sont toutes deux identiques à n'importe quel ensemble de données, elles renvoient le même ensemble de résultats.
Comme vous l'avez souligné, les requêtes SQL, un sur-ensemble d' algèbre relationnelle , peuvent être très complexes. Nous pouvons mélanger des sous-requêtes, utiliser des procédures stockées et des fonctions ( déterministes ou non) qui vous feront ressembler plus à du vrai code . Si vous parlez de ce type de requêtes, ce sera très difficile. En fait, il n'est probablement pas différent du problème "sont deux algorithmes équivalents".
Dans ces conditions, c'est probablement impossible.
Toutefois...
... cela pourrait être faisable si les deux requêtes que vous souhaitez comparer sont des opérations d'ensemble strictes. Si tel est le cas, vous pouvez convertir les requêtes en algèbre relationnelle, puis les résoudre en suivant les règles d'équivalence . Si vous avez une sélection / restriction avec des conditions booléennes non triviales, vous pourriez avoir à prouver que ces conditions sont également équivalentes. Vous devrez alors vous fier à l' algèbre booléenne et vous finirez probablement par faire une table de vérité .
Comme vous pouvez le voir, cela va demander beaucoup de travail et, à ma connaissance, rien n’existe pour calculer tout cela automatiquement. Néanmoins, j'ai trouvé quelques outils que vous pourriez trouver utiles si vous voulez vous attaquer à la tâche:
la source
Il est impossible de vérifier l'équivalence sémantique en temps fini par définition, voir le théorème de Rice :
la source
L'utilisateur de dba Lennart m'a indiqué ce projet:
http://cosette.cs.washington.edu/
la source
Une façon de le faire est de construire un analyseur, ou mieux, d'utiliser un analyseur existant. Je crois que C # a une classe TSQLParser et a une méthode Parse (). L'analyseur divisera votre requête en sous-classes que vous pourrez ensuite comparer.
la source
Si vous recherchez un test d'équivalence basé sur la théorie des ensembles, votre meilleur pari est de convertir toutes les
WHERE
conditions qui peuvent être converties en un type deJOIN
(interne ou externe) et de refactoriser l'instruction. Cela inclutIN subselect
etEXISTS subselect
et toutes autres conditions dans laWHERE
clause qui contient le motSELECT
. Si vous effectuez cette opération sur les deux instructions SQL, vous aurez une nouvelleFROM
clause qui représente la logique / mathématique basée sur l'ensemble qui vous intéresse. Ensuite, vous pouvez simplement comparer visuellement les deux instructions. Si vous cherchez un moyen automatisé de faire tout cela, je ne connais pas d'outil qui puisse faire exactement cela.la source