冗余SQL查询中的谓词是否会影响性能?
考虑类似的查询:冗余SQL查询中的谓词是否会影响性能?
select *
from t
where a = 5 and (a = 5 and b = 7)
是否冗余谓词a = 5
影响查询的性能。我不相信,但我被告知否则(是的,我知道它取决于DBMS,但假设它是一些企业级的DBMS,如SQL Server,DB2或Oracle)。
答案通常是否定的,冗余条款不会影响性能。当然,作为一名程序员,你可以使用证据来证明它是一种方式或另一种方式(不同于那些将他们的神话重复为事实的人)。
只要打开您的选择数据库,输入您的查询有和没有redundent子句,然后要求您的数据库到explain
这两个查询。
例如在SQL Server Management Studio(MS SQL Server)中打开查询窗口,输入您的查询,然后右键单击并选择“显示估计执行计划”(或者您可以选择一个选项以显示实际计划查询运行)。
+1,它不会影响性能的原因是您的DBA确实/应该对where子句进行短路评估(参见:http://en.wikipedia.org/wiki/Short-circuit_evaluation),并将停止只要结果是明确的“真实”或“虚假”,就进行测试 – Johan 2011-06-06 17:46:39
@Johan:短路在这里如何起作用?对于a == 5 && a == 5 && b == 7'的天真短路,其中'a == 5'为真的某些行可以评估两次“a == 5”的真相。 – Fred 2011-06-06 18:12:48
@Fred,阅读链接,当你理解**短路评估是什么时回来。 *提示**不**有关做事两次* – Johan 2011-06-06 18:17:59
我想引用来自The Law of Leaky Abstractions by Joel Spolsky
下面的SQL语言是为了抽象 掉那些 需要查询数据库的程序步骤,而不是 允许你定义只是你 想让数据库找出 的程序步骤来查询它。但在某些情况下, 某些SQL查询的速度比其他 慢 逻辑等效查询。这方面的一个著名 例子是,一些SQL 服务器都大大加快,如果你 指定“其中A = B和B = C,且A = C” 比,如果你只指定“,其中A = B 和B = C “尽管结果集是 一样。你不应该有 关心的程序,只有 规范。但有时 抽象泄漏,并导致可怕的 性能,你必须打破 查询计划分析器和研究什么 它做错了,并找出如何 使您的查询运行更快。
第一个条件是没有意义的,在第二个条件下也是如此。 – 2011-06-06 15:54:26
我会建议你在执行计划oeing解释计划,看看是否有不同的优化器处理。但个人而言,由于维护原因,我会拿出冗余条款。 – HLGEM 2011-06-06 15:56:31
这个查询对我有意义的唯一方法是如果where子句就像'where a = 5 or(a = 5 and b = 7) ' – 2011-06-06 15:57:16