在什么时候索引有效


9

我发现很多资源都提到向表中添加索引可以加快搜索速度,并降低插入速度,但前提是表很大。这会产生一个折衷,这是一个设计决定,但是应该有一个近似的表大小,然后才可以使用索引。(例如,十行可能低于该限制)

是否有人知道此限制在哪里,或者知道有什么资源可以向我指出正确的方向?


您的应用程序的读/写比是多少?如果您确实需要大量写操作,那么也许这就是您需要考虑写权衡的时候了,但是如果是普通应用程序,那么我会在99%的情况下添加所需的索引(表通常会增长,它们很难缩小尺寸)。
玛丽安

Answers:


12

确切的限制确实很难提前确定。

大多数人低估的一件事是索引必须满足的高要求,索引才能成为要在查询中使用的候选对象。

高效(非聚集)索引

  • 提供了很好的选择性,例如只返回总行的很小一部分(<1%,<2%)。如果选择性不是给定的-SQL Server的查询优化器很可能会忽略此索引

  • 理想情况下应该覆盖查询,即返回查询所需的所有列。如果您可以创建一个包含1或2个索引列的索引,并包含另一个少数(2-4)列作为包含列,从而可以覆盖查询,则查询优化器将使用该索引。这也意味着:如果您的代码始终SELECT * .....用于获取所有列,则使用索引的可能性降低-实际上,

我敢肯定还有很多其他标准-但我相信这两个是最关键的标准。当然,您应该始终正确维护索引(重新组织,重建),并确保与索引相关的统计信息是最新的。

PS:外键列上的非聚集索引是一种特殊情况;默认情况下,我总是建议添加这些内容,因为它们有助于加快参照完整性检查以及JOIN对FK约束的检查。但是即使在这里,通过添加一些附加的“包含”列以使其更加有用,“扩展”那些FK列索引也是绝对有效的。


2
尽管此答案可能无法直接回答问题,但通过为索引提供重要的设计原则,它会做得更好,并且首先回答了我应该提出的问题。
SeanVDH

6

您可能会发现只有10行的索引有了改进。

在我的机器上的以下测试中,无索引10.5的版本以秒为单位完成,而带索引的版本以9.8秒为单位(在3次运行中一致)。

在这种情况下,索引仅包含1个叶子页,但是由于插槽数组按索引键顺序排序,因此它的存在允许SQL Server仅返回感兴趣的单行,而不是对所有10行执行聚合。

CREATE TABLE T
(
X INT,
Y CHAR(100) NULL
)

INSERT INTO T (X)
SELECT number 
FROM master..spt_values
WHERE type='P' AND number BETWEEN 1 AND 10

set nocount on;

DECLARE @I INT, @X INT

DECLARE @Time DATETIME2(7) = SYSUTCDATETIME()

SET @I = 1
    WHILE (@I < 1000000)
    BEGIN
    SELECT @X = MAX(X)
    FROM T
    SET @I += 1
    END

SELECT DATEDIFF(MICROSECOND, @Time, SYSUTCDATETIME())

CREATE CLUSTERED INDEX IX ON T(X)
SET @Time = SYSUTCDATETIME()
SET @I = 1
    WHILE (@I < 1000000)
    BEGIN
    SELECT @X = MAX(X)
    FROM T
    SET @I += 1
    END

SELECT DATEDIFF(MICROSECOND, @Time, SYSUTCDATETIME())

DROP TABLE T

插入件是否受到类似的影响,还是减速最小?
SeanVDH

@SeanVDH-我的答案中的示例是将聚集索引与堆进行比较。这是有理由的理由,因为必须将行移至特定位置,并且现有的行之间的插入速度会变慢,并且插槽数组也可能会进行页面拆分。对于较大的插入,数据也可以按CI键顺序排序,这在插入堆时是不必要的。金伯利·特里普(Kimberley Tripp)在这里辩称尽管有时插入CI可能比插入堆更好。
马丁·史密斯

感谢您的文章,她提出了一些有趣的观点。我想知道插入内容是否会像小表中的选择内容一样受到极大的影响,但是您是对的,折衷方案在开始时应该与以后类似。
SeanVDH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.