SQL维护表索引?

出于参数的原因,可以说这是针对SQL 2005/8的。 我知道当你在表上放置索引来调整SELECT语句时,这些索引需要在INSERT / UPDATE / DELETE操作期间保持。

我的主要问题是:

SQL Server何时维护表的索引?

我有很多后续问题:

我天真地认为它会在命令执行后这样做。 假设您要插入20行,它将在插入并提交20行后维护索引。

  • 在脚本针对表格提供多个语句的情况下会发生什么情况,但是在其他情况下是不同的语句?

  • 在所有语句执行后,服务器是否有智能来维护索引,或者是否按照语句执行?

  • 我已经看到在大量/多个INSERT / UPDATE操作之后索引被删除和重新创建的情况。

  • 这可能会导致重建整个表的索引,即使您只更改一些行?

  • 在尝试将INSERTUPDATE操作整理到一个更大的批处理中,例如通过收集要插入到临时表中的行,而不是执行许多更小的插入操作时,是否会带来性能方面的好处?

  • 如何整理上面的行以防止删除索引与维护命中?
  • 对于问题的扩散感到抱歉 - 这是我一直知道需要注意的问题,但是当尝试调整脚本以获得平衡时,我发现我实际上并不知道索引维护何时发生。

    编辑:我知道性能问题在很大程度上取决于插入/更新过程中的数据量和索引的数量。 再次为了争辩,我会有两种情况:

  • 针对选择调整的索引繁重表。
  • 索引灯表(PK)。
  • 这两种情况都会有一个很大的插入/更新批次,例如10k +行。

    编辑2:我知道能够在数据集上分析给定的脚本。 然而,分析并不能告诉我为什么某种方法比另一种更快。 我对索引背后的理论更感兴趣,也是性能问题的源泉,而不是一个明确的“这比这更快”的答案。

    谢谢。


    当你的陈述(甚至不是交易)完成时,你的所有索引都是最新的。 当您提交时,所有更改都将永久生效,并释放所有锁定。 否则不会是“智能”,这会违反完整性并可能导致错误。

    编辑:“完整性”我的意思是说:一旦提交,数据应立即提供给任何人。 如果此时索引不是最新的,有人可能会得到不正确的结果。

    随着您增加批量大小,您的性能最初会提高,然后会减慢。 您需要运行自己的基准并找出最佳的批量大小。 同样,您需要进行基准测试以确定是否更快地删除/重新创建索引。

    编辑:如果您在一个语句中插入/更新/删除批次的行,则您的索引在每个语句中都会被修改一次。 以下脚本表明:

    CREATE TABLE dbo.Num(n INT NOT NULL PRIMARY KEY);
    GO
    INSERT INTO dbo.Num(n)
    SELECT 0
    UNION ALL
    SELECT 1;
    GO
    -- 0 updates to 1, 1 updates to 0
    UPDATE dbo.Num SET n = 1-n;
    GO
    -- doing it row by row would fail no matter how you do it
    UPDATE dbo.Num SET n = 1-n WHERE n=0;
    UPDATE dbo.Num SET n = 1-n WHERE n=1;
    
    链接地址: http://www.djcxy.com/p/3039.html

    上一篇: SQL maintain table indexes?

    下一篇: to create new nested resource?