6

考虑以下三个查询:

select sampleno from sample
    where markupdate > '1/1/2010'

select sampleno, markupdate from sample
    where markupdate > '1/1/2010'

select sampleno, markuptime from sample
    where markupdate > '1/1/2010'

sampleno并且markupdate是索引字段(sampleno是主键)

markuptime未编入索引

查询 1 和 2 运行大约需要 1 秒(返回 237K 行)。3 分钟后查询 3 仍在运行。

为什么在 SELECT 子句中包含非索引字段会导致性能下降?

这是一个 SQL 6.5 数据库。

4

1 回答 1

5

表的数据(基本上:所有列)存储在聚集索引中。聚集索引是允许对索引列进行二分搜索的二叉树。它是特殊的(聚集的),因为它包含叶级别的所有其他列。通常,聚集索引也是主键。在你的情况下,它是:

(sampleno) include (markupdate, markuptime, ...)

非聚集索引包含索引列和(在叶级别)聚集索引。当您使用非聚集索引时,数据库必须查找聚集索引中的所有其他列。该过程称为查找。在您的情况下,非聚集索引(markupdate)是:

(markupdate) include (sampleno)

该索引包含查询的所有数据markupdate, sampleno。这种指数的技术术语是覆盖指数。但是当你添加markuptime到查询中时,索引不再覆盖。markuptime它必须在聚集索引中查找值。查找范围很广。

只有您的第三个查询需要查找。这就是为什么您的第三个查询较慢的原因。

于 2013-02-08T16:59:23.307 回答