考虑如下查询:
select *
from t
where a = 5 and (a = 5 and b = 7)
冗余谓词a = 5
是否会影响查询的性能。我不相信,但有人告诉我并非如此(是的,我知道这取决于数据库管理系统,但假设它是一些企业级的数据库管理系统,如SQL Server、DB2或Oracle)。
发布于 2011-06-06 23:58:29
答案通常是否定的,冗余子句不会影响性能。当然,作为一名程序员,你可以使用证据来证明这一点或另一种方式(不像那些会重复他们的神话作为事实的人)。
只需打开您选择的数据库,输入带冗余子句和不带冗余子句的查询,然后要求数据库对这两个查询执行explain
操作。
例如,在SQL Server Management Studio (MS SQL Server)中,打开一个查询窗口,输入您的查询,然后右键单击并选择“显示估计的执行计划”(或者您可以选择一个选项,以便在运行查询后显示实际计划)。
发布于 2011-06-14 15:16:44
我想引用The Law of Leaky Abstractions by Joel Spolsky的以下内容
SQL语言旨在抽象出查询数据库所需的过程步骤,而不是只允许您定义所需的内容,并让数据库找出查询它所需的过程步骤。但在某些情况下,某些SQL查询比其他逻辑等价查询慢数千倍。一个著名的例子是,即使结果集相同,指定"where a=b b=c a=c“比只指定"where a=b和b=c”要快得多。您不应该关心过程,只需要关心规范。但有时抽象会泄漏并导致糟糕的性能,您必须打开查询计划分析器,研究它做错了什么,并找出如何让您的查询运行得更快。
https://stackoverflow.com/questions/6254648
复制相似问题