SQL维护表索引?
出于参数的原因,可以说这是针对SQL 2005/8的。 我知道当你在表上放置索引来调整SELECT
语句时,这些索引需要在INSERT
/ UPDATE
/ DELETE
操作期间保持。
我的主要问题是:
SQL Server何时维护表的索引?
我有很多后续问题:
我天真地认为它会在命令执行后这样做。 假设您要插入20行,它将在插入并提交20行后维护索引。
在脚本针对表格提供多个语句的情况下会发生什么情况,但是在其他情况下是不同的语句?
在所有语句执行后,服务器是否有智能来维护索引,或者是否按照语句执行?
我已经看到在大量/多个INSERT
/ UPDATE
操作之后索引被删除和重新创建的情况。
这可能会导致重建整个表的索引,即使您只更改一些行?
在尝试将INSERT
和UPDATE
操作整理到一个更大的批处理中,例如通过收集要插入到临时表中的行,而不是执行许多更小的插入操作时,是否会带来性能方面的好处?
对于问题的扩散感到抱歉 - 这是我一直知道需要注意的问题,但是当尝试调整脚本以获得平衡时,我发现我实际上并不知道索引维护何时发生。
编辑:我知道性能问题在很大程度上取决于插入/更新过程中的数据量和索引的数量。 再次为了争辩,我会有两种情况:
这两种情况都会有一个很大的插入/更新批次,例如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