具有条件与没有where子句的SQL查询的性能

时间:2012-08-03 20:33:08

标签: sql performance

以较少的时间执行哪个SQL查询 - 使用WHERE子句查询或不执行查询:

  1. WHERE-clause处理索引字段(例如主键字段)
  2. WHERE-clause处理非索引字段
  3. 我想当我们处理索引字段时,使用WHERE的查询会更快。我是对的吗?

5 个答案:

答案 0 :(得分:3)

如前所述,对此没有固定的答案。这一切都取决于具体的背景。但只是为了回答。采取这个简单的查询:

 SELECT first_name FROM people WHERE last_name = 'Smith';

要在没有索引的情况下处理此查询,必须为表中的每一行检查每一列last_name(全表扫描)。

使用索引,您可以只遵循B树数据结构,直到找到“Smith”。

对于非索引,最坏的情况看起来是线性的(n),而对于B树,它将是log n,因此计算成本更低。

答案 1 :(得分:1)

不确定'使用WHERE子句或没有'的查询是什么意思,但你是正确的,大多数情况下,索引字段上的WHERE子句的查询优于非WHERE子句的查询索引字段。

性能相同的一个实例(即索引无关紧要)是在where子句中运行基于范围的查询(即WHERE col1> x)。这会强制扫描表格,因此速度与非索引列上的范围查询速度相同。

实际上,它取决于您在where子句中引用的列,列中的数据类型,您运行的查询类型等。

答案 2 :(得分:0)

这可能取决于您所写的where子句的类型。在一个简单的where子句中,通常最好在你正在使用的字段上有一个索引(并且uindexes可以而且应该构建在比PK更多的上)。但是,您必须为索引编写一个saragble where子句以使其有所不同。有关可靠性的一些指导,请参阅此问题:

What makes a SQL statement sargable?

答案 3 :(得分:0)

在某些情况下,主键上的where子句会更慢。

最简单的是一行有一行。使用索引需要加载索引和数据页面 - 两次读取。没有指数将工作减半。

这是一个退化的情况,但它指出了问题 - 所选行的比例。或者,更准确地说,解析查询所需的页面比例。

当所有页面上都有所需数据时,使用索引可以减慢速度。对于非主键,当表大于页面缓存并且访问是随机的时,这可能是灾难性的。

由于页面是按主键排序的,最坏的情况是附加的索引扫描 - 不是太糟糕。

某些数据库使用表的统计信息来决定何时使用索引以及何时执行全表扫描。有些人没有。

简而言之,对于低选择性查询,索引将提高性能。对于高选择性查询,使用索引可能会导致性能稍差或性能不佳,具体取决于各种因素。

答案 4 :(得分:0)

我的一些查询非常复杂,并且应用了一个降低性能的where子句。对于变通方法,我使用了临时表,然后对它们应用了where子句。这显着改善了性能。此外,我加入了特别是Left Outer Join的地方,提高了性能。