1

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

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

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

非常感谢您的帮助

4

5 回答 5

1

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

于 2012-04-27T10:04:47.270 回答
0

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

于 2012-04-27T10:03:21.237 回答
0

只有通过执行计划才能检查它。除此之外,我认为没有任何方法可以证明这件事。

于 2012-04-27T10:09:01.467 回答
0

您需要为此实现一些“规范查询计划”生成器(由 DBMS 生成的“最佳查询计划”可能是不确定的)。在大多数情况下,使用术语和表格的字母顺序作为决胜局将让你到达那里。

于 2012-04-27T10:13:54.673 回答
0

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

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

从中得出一个测试计划。它会要求你

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

如果您在测试后没有发现任何差异,那么您可以有理由确信这两个语句是等价的。

于 2012-04-27T10:17:08.890 回答