两个SQL语句的数学相等性


9

有没有办法检查两个SQL语句的数学相等性?

我有两个SQL语句:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

对数据运行两个语句并比较输出完全没有帮助。

像方程求解器一样,需要评估语句后的集合数学。

我的问题超出范围是:

  • 比较等于,然后等于(大于,小于,等于...)
  • 存储过程或触发器
  • 公用表表达式(WITH)

在范围内:

  • 子选择:WHERE other_id IN(从其他WHERE中选择ID ...)
  • 加盟

一个部分解决方案是比较2个查询的执行计划。如果执行计划相同,则它们相等。但是,这种关系不会同时起作用。可以有2个逻辑上等效的查询,它们具有不同的执行计划。
BuahahaXD

1
@BuahahaXD:不对。select * from foo where id = 4最肯定会有与select * from foo where id = 2
–a_horse_with_no_name

@a_horse_with_no_name我在SQL Server上进行了测试,并获得了2个不同的XML文件。这些参数作为XML文件中的<ParameterList>节点包括在内。在视觉上,这些计划是相同的(表扫描+选择)。但是我相信您可能会比较执行计划。
BuahahaXD 2015年

1
关于唯一键,@ a_horse_with_no_name是正确的。对于所有的人,这是可能的select * from foo where id = 4,并select * from foo where id = 2有两个不同的执行计划,如果1)中的索引统计信息是没有及时更新和2)即使索引统计信息是最新的最新的,ID的密钥分配是渐行渐远(提供的ID不是唯一键)。
RolandoMySQLDBA 2015年

Answers:


6

两个SQL语句的数学等式是什么?对我而言,如果在给定所有数据集相同的情况下返回相同的结果集,则两个查询等效。

正如您所指出的,SQL查询是关系代数的超集,可能非常复杂。我们可以混合子查询,使用存储过程和函数(确定性与否),这将使您的查询看起来更像真实代码。如果您正在谈论这类查询,那么它将非常困难。实际上,它可能与“两个算法等效”问题没有什么不同。

在这种情况下,可能是不可能的。

然而...

... 如果要比较的两个查询是严格的集合操作,这可能是可行的。如果是这样,您可以将查询转换为关系代数,然后按照等价规则进行求解。如果您具有非平凡布尔条件的选择/限制,那么您可能最终需要证明这些条件也相等。然后,您将需要依赖布尔布尔代数,并且最终可能会生成一个真值表

如您所见,这将需要大量工作,据我所知,没有任何东西可以自动计算所有这些。但是,我发现一些工具可能对您解决该任务很有用:


我的问题仅是关于集合操作。我更新了问题。它与“两个算法是否等效”问题有关。但是上下文是有限的,只有集合,联接,子选择的基本操作在我的范围内。
guettli 2015年

3

通过定义不可能在有限的时间内检查语义对等,请参阅赖斯定理

对于部分函数的任何非平凡属性,没有通用有效的方法来确定算法是否使用该属性来计算部分函数。


2
这仅不是评论。请您介绍莱斯在这种情况下的适用性。
Michael Green

即使从理论上讲当前的SQL标准语法也是如此巴洛克式,但实际上将是不可能的
James Anderson

1
通过OP解释,似乎问题更多是关于逻辑对等,而不是语义对等。真正的问题是:我们可以将SQL语句转换为数学表达式然后评估逻辑对等吗?
ForguesR 2015年

2

dba用户Lennart向我指出了这个项目:

http://cosette.cs.washington.edu/

Cosette是用于检查SQL查询是否等效的自动证明程序。它在Coq Proof Assistant和Rosette符号虚拟机中正式化了SQL的实质片段。对于一对给定的查询,它返回等效的形式证明或反例。


1

一种方法是构建解析器,或者更好地使用现有解析器。我相信C#具有TSQLParser类并具有Parse()方法。解析器会将您的查询分为多个子类,然后可以进行比较。


1

如果您正在寻找基于集合论的等效性检验,那么最好的选择是将任何WHERE可以转换为JOIN(内部或外部)类型的条件转换为条件。这包括IN subselectEXISTS subselect以及WHERE包含该词的子句中的任何其他条件SELECT。如果对两个SQL语句都执行此操作,则将有一个新FROM子句,它表示您感兴趣的基于集合的逻辑/数学。然后,您可以直观地比较这两个语句。如果您正在寻找一种自动化的方式来完成所有这些工作,那么我不知道有什么工具可以完全做到这一点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.