查询等价评估
Posted
技术标签:
【中文标题】查询等价评估【英文标题】:Query equivalence evaluation 【发布时间】:2012-04-27 09:57:23 【问题描述】:我的问题根植于T-SQL、SQL Server环境,但其范围并不局限于此技术。我正在研究一个具有相当复杂业务逻辑的数据库,其中包含现有视图、存储过程和要设计的新视图。通过对不同查询或其中一部分的比较,我有一种强烈的感觉,即有些部分以不同的安排执行相同的工作,但当然要重构整个混乱,我需要的不仅仅是感觉;所以我试图确定一种方法来证明两个语句是等价的。
一个明显但微弱的响应可能是确定两个查询 A 和 B 产生相同的记录集:如果 A 是 B 的子集,B 是 A 的子集,它们是相同的记录集;但我不确定这是一个好主意,因为当然,记录集不是查询,结果可能取决于数据和特定的参数值。我的问题是:有一种方法可以证明两个不同查询的等价性吗?我会说是的,因为数据库执行的优化应该适用于此。有人可以为我提供一些指向文档或书籍的指针吗?如果没有通用的方法来证明等价性,是否有一些基于回归测试的智能方法,根据一些有效的启发式方法来完成这项工作?
稍后编辑:如果通过关系代数对查询进行逆向工程(手动?),可能是评估查询等效性的更好方法,而不是使用其他查询和/或计算机?有自动化工具可以帮助执行这种“逆向工程”,以防万一?
非常感谢您的帮助
【问题讨论】:
***.com/questions/4868364/… 和 dl.acm.org/citation.cfm?id=111212&dl= 【参考方案1】:你可能无法证明它,因为这个问题似乎是 NP 完全的;检查这个SO question on query equivalence(那个是关于Oracle的,但是有几个答案/链接应该与你相关)。
【讨论】:
【参考方案2】:您可以检查两个查询的执行计划。如果它们是相同的,你有你的答案!
【讨论】:
我确信可以编写一些相当庞大的查询来打败优化器的最大努力,但实际上计算出相同的结果(尽管严重次优)。【参考方案3】:只有通过执行计划才能检查它。除此之外,我认为没有任何方法可以证明这件事。
【讨论】:
我认为这是一个充分但非必要的条件——我可以看到两个查询在所有情况下都返回相同的结果集,但执行计划不同。【参考方案4】:您需要为此实现一些“规范查询计划”生成器(由 DBMS 生成的“最佳查询计划”可能是不确定的)。在大多数情况下,使用按字母顺序排列的术语和表格作为决胜局,可以助您一臂之力。
【讨论】:
【参考方案5】:我怀疑你能否正式证明或反驳这一点,但我对此的看法是
识别所有用例 识别所有边界值 识别所有参数并从中得出一个测试计划。这需要你
为每个案例创建测试数据 针对该数据运行两个查询 比较结果如果您在测试后没有发现任何差异,则可以合理地确保这两种说法是等价的。
【讨论】:
以上是关于查询等价评估的主要内容,如果未能解决你的问题,请参考以下文章