【问题标题】:When does MS-SQL maintain table indexes?MS-SQL 何时维护表索引?
【发布时间】:2011-04-15 06:23:34
【问题描述】:

为了争论,假设它适用于 SQL 2005/8。我了解,当您在表上放置索引以调整 SELECT 语句时,这些索引需要在 INSERT / UPDATE / DELETE 操作期间维护。

我的主要问题是:

SQL Server 何时维护表的索引?

我有很多后续问题:

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

  • 在以下情况下会发生什么 脚本具有多个语句 靠在桌子上,但在其他方面 不同的陈述?

  • 服务器是否有智能 毕竟要维护索引 语句被执行或执行 每个语句?

我见过在大型/许多INSERT/UPDATE 操作后删除并重新创建索引的情况。

  • 这可能会导致重建 整个表的索引,即使你 只更改少数几行?

  • 会有性能优势吗 在尝试整理INSERTUPDATE 动作成更大的批次, 比如说通过收集要插入的行 临时表,而不是做 许多较小的插入物?

  • 如何整理上面的行以防止删除索引与遭受维护打击?

很抱歉问题泛滥 - 这是我一直都知道要注意的事情,但是在尝试调整脚本以获得平衡时,我发现我实际上不知道何时进行索引维护。

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

  • 针对 选择。
  • 索引灯台 (PK)。

这两种情况都会有大量的插入/更新批处理,比如 10k+ 行。

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

谢谢。

【问题讨论】:

  • 好问题。对于第二部分,这将完全取决于索引的数量和内容,即删除和重建更快还是仅在索引之上更新更快。与 SQL 中的大多数事情一样,没有 100% 正确的答案或方法。

标签: sql-server indexing query-performance


【解决方案1】:

当您的语句(甚至不是交易)完成时,您的所有索引都是最新的。当您提交时,所有更改都将成为永久性的,并且所有锁都将被释放。否则就不是“智能”,它会违反完整性并可能导致错误。

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

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

编辑:如果您在一个语句中插入/更新/删除批量行,则每个语句都会修改一次索引。以下脚本演示了这一点:

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;

【讨论】:

  • 我原以为数据完整性不适用于索引。这仅适用于唯一约束的情况吗?
  • 如果索引没有完整性,它几乎没有用处。我不确定如果 SQL 使用索引来查找应该存在但该记录不存在的记录会发生什么。我猜你会得到假阴性,这几乎违背了 ACID 的目的。
  • 所以在插入/更新值时,索引是按行维护的吗?即,它们会根据任何索引自动降落在正确的位置,并在需要的地方修改索引?因此,即使将行插入批处理在一起,与多个较小的插入相比也不应该有明显的区别吗?想一想,我想提交的索引更改和表锁定会产生开销......
  • @Adam - 我认为您可以通过锁定提示来抵消一些开销。我通常会进行批量更新,因为它更快(如果你按照 Alex 所说的那样做,并通过实验调整批量大小),而且如果你失败了,你不会丢失整个语句。
  • 对每个语句部分的解释很好,我怀疑是这种情况,但从未真正考虑过在您的语句完成后,即使您的脚本可能还没有完成,其他人也可以同时进入并访问数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多