问题假设:
问题:
哪种查询更快,是一种更好的做法?:
SELECT * FROM my_table WHERE X = 'some value' AND Y = 'other value';
或者
SELECT * FROM my_table WHERE X = 'some value';
基本上,您是否将更多不需要的参数传递给查询,从中获益还是失败(性能方面),如果“好处”是答案,那么这是一种“好”的做法吗?
答案 0 :(得分:4)
显然,具有更多参数的查询需要做更多的工作,但我认为在大多数情况下你会发现差异将是如此微不足道,以至于使它成为一个没有实际意义的点。
最佳做法是以这样一种方式编写查询,以解决您的业务问题并让芯片落到可能的位置。如果您明显知道参数是多余的,那么请将其关闭,除非是为了简化您的代码。但是,由于数据的当前状态,我不会花费大量时间来查找参数冗余的情况。
答案 1 :(得分:1)
关于性能,如果表的索引正确,则应该没有显着差异。
要注意的一件事是,如果X和Y的值不符合您的预期,则两个查询可能会产生不同的结果。在第一种情况下,即使Y的值与您预期的值不同,它也将返回该行。在第二种情况下,根本不会返回该行。您应该考虑在此错误情况下您想要发生的事情,并根据该决定选择查询。如果您想显示错误Expected value 'foo' for Y but found 'bar'
,则需要获取该行,以便第一个查询更合适。
答案 2 :(得分:0)
与其他答案一样,并且假设索引正确放置,更好的做法是非常具体地说明您想要的内容。您现在可以依赖于结果的数量,但在不断发展的项目中提前考虑,并确保通过更改您的查询将尽可能精确。
答案 3 :(得分:0)
如果你在(X,Y)上有索引,如果两个查询确实返回相同数量的行(如果第二个返回更多行,那么速度应该没有差异),那么当然它会更慢)
如果您的索引是另一种方式,即定义为(Y,X),则第二个查询可能会大大减慢,因为该索引对大多数DBMS不可用。
我认为Oracle 11g即使对于第二个查询也能使用(Y,X)索引,但它仍然会作为索引的前缀匹配更慢。
答案 4 :(得分:0)
逻辑上,如果单参数查询和双参数查询都获取一行,并且X是它们的常见条件, AND Y ='其他值'不应该是查询中的重要列优化
除非你需要并且只需要Y作为一行的查询条件,否则Y上的索引在这个例子中不是一个好习惯。
X上的索引是此示例中的重要点,因为单参数查询应返回“一行”。
我认为数据库性能问题与您需要的内容以及如何在较低的I / O(逻辑I / O,隐式物理I / O)中获取所需的行有关。
然而,最好的做法是,我同意解决您的业务问题。