查询等价评估

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】:

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

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

从中得出一个测试计划。这需要你

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

如果您在测试后没有发现任何差异,则可以合理地确保这两种说法是等价的。

【讨论】:

以上是关于查询等价评估的主要内容,如果未能解决你的问题,请参考以下文章

pyspark 查询的 SQL 等价物

这些查询的 Oracle 旧语法连接等价物是啥?

NSPredicate 格式等价于 SQL 查询

MongoDB 等价于 SQL“NOT LIKE”查询

PySpark AND EXISTS 等价于 sql 查询

《数据库系统概念》17-查询优化