查询等价评估

时间:2012-04-27 09:57:23

标签: sql-server tsql

我的问题根植于T-SQL,SQL Server环境,但其范围并不局限于此技术。我正在研究一个具有相当复杂的业务逻辑的数据库,其中包括现有的视图,存储过程和新的设计。通过对不同查询或其中一部分的比较,我有一种强烈的感觉,即有不同部分执行相同工作的部分,但当然要重构整个混乱,我需要更多的感觉;所以我试图确定一种方法来演示两个语句是等价的。

明显但弱的响应可能是确定两个查询A和B产生相同的记录集:如果A是B的子集而B是A的子集,则它们是相同的记录集;但我不确定这是一个好主意,因为当然,记录集不是查询,结果可能取决于数据和特定参数值。我的问题是:有一种方法可以证明两个不同查询的等价性吗?我会说是的,因为数据库执行的优化应该适用于此。有人可以给我一些指向文档或书籍的指针吗?如果没有通用的方法来证明等价性,那么有一些基于回归测试的智能方法是根据一些有效的启发式方法来完成的吗?

稍后编辑:如果通过关系代数对查询(手工?)进行逆向工程,可能是评估查询等效性而不是使用其他查询和/或计算机的优秀方法?有些自动化工具有助于执行这种“逆向工程”,以防万一?

非常感谢您的帮助

5 个答案:

答案 0 :(得分:1)

你可能无法证明这一点,因为问题似乎是NP完全的;检查这个SO question on query equivalence(那个是关于Oracle的,但是有几个答案/链接应该与你相关)。

答案 1 :(得分:0)

您可以检查两个查询的执行计划。如果它们是相同的,那么你有答案!

答案 2 :(得分:0)

只有执行计划才能检查。除此之外我不认为有任何方法可以证明这一点。

答案 3 :(得分:0)

您需要为此实现一些“规范查询计划”生成器(由DBMS生成的“最佳查询计划”可能是不确定的)。在大多数情况下,使用术语和表格的字母排序作为打破平局将使您获得。

答案 4 :(得分:0)

我怀疑你是否能够正式证明或反驳这一点,但我对此的看法将是

  • 识别所有用例
  • 识别所有边界值
  • 识别所有参数

从中获得测试计划。这需要你

  • 为每个案例创建测试数据
  • 针对该数据运行两个查询
  • 比较结果

如果您在测试后没有发现任何差异,您可以合理地确保两个陈述都是等效的。