数据库查询优化问题

时间:2010-11-02 20:03:29

标签: database query-optimization

问题假设:

  1. 数据库不可知
  2. 由于X和Y
  3. 的值,两个查询都只返回一行

    问题:

    哪种查询更快,是一种更好的做法?:

    SELECT * FROM my_table WHERE X = 'some value' AND Y = 'other value';
    

    或者

    SELECT * FROM my_table WHERE X = 'some value';
    

    基本上,您是否将更多不需要的参数传递给查询,从中获益还是失败(性能方面),如果“好处”是答案,那么这是一种“好”的做法吗?

5 个答案:

答案 0 :(得分:4)

显然,具有更多参数的查询需要做更多的工作,但我认为在大多数情况下你会发现差异将是如此微不足道,以至于使它成为一个没有实际意义的点。

最佳做法是以这样一种方式编写查询,以解决您的业务问题并让芯片落到可能的位置。如果您明显知道参数是多余的,那么请将其关闭,除非是为了简化您的代码。但是,由于数据的当前状态,我不会花费大量时间来查找参数冗余的情况。

答案 1 :(得分:1)

关于性能,如果表的索引正确,则应该没有显着差异。

  • 如果列X有索引,则两个查询都会很快。
  • 如果列X和Y都没有被索引,那么两个查询都不会那么快,但速度相似(假设对于大多数行,两个条件都失败了 - 那么只会评估一个)。
  • 如果列Y被索引但不是X,则第二个查询将更快,因为它是唯一可以使用Y列索引的查询。

要注意的一件事是,如果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)中获取所需的行有关。

然而,最好的做法是,我同意解决您的业务问题