代码之家  ›  专栏  ›  技术社区  ›  Adam Houldsworth

MS-SQL什么时候维护表索引?

  •  7
  • Adam Houldsworth  · 技术社区  · 14 年前

    SELECT 语句中,这些索引需要在 INSERT / UPDATE DELETE 行动。

    我的主要问题是:

    SQLServer何时维护表的索引?

    我还有很多后续问题:

    • 如果 脚本具有多个语句 不同的陈述?

    • 毕竟要保持索引 执行语句还是执行 每一份声明?

    插入 更新

    • 这大概需要重建 只换几行?

    • 有绩效福利吗 插入 一个更大的批次, 临时桌子 许多较小的插入?

    • 整理上面的行与删除索引和执行维护操作相比会有什么不同?

    编辑: 我知道性能问题很大程度上取决于插入/更新期间的数据量和索引数。再说一次,我有两种情况:

    • 一个索引繁重的表
    • 索引灯表(PK)。

    这两种情况都会有一个大的insert/update批处理,比如说,10k+行。

    我知道可以在数据集上分析给定的脚本。然而,分析并没有告诉我为什么一个给定的方法比另一个更快。我更感兴趣的是指数背后的理论和绩效问题的根源,而不是一个明确的“这比那快”的答案。

    谢谢。

    1 回复  |  直到 14 年前
        1
  •  3
  •   A-K    14 年前

    当您的语句(甚至不是事务)完成时,所有索引都是最新的。提交时,所有更改都将成为永久更改,所有锁都将被释放。否则不算“聪明”,反而会侵犯诚信,可能造成错误。

    编辑:我所说的“完整性”是指:一旦提交,任何人都应该可以立即获得数据。如果此时索引不是最新的,可能会有人得到错误的结果。

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

    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;