我们有一个每天晚上建立的工作表,其中有超过一百万条记录。每晚大约需要3个小时才能完成此过程。在中,procedure
我们首先将所有数据插入表中。然后,我们对该表进行了大量更新。
例如:
Update a
Set a.Field1 = b.Field1
From WorkingTable as a JOIN Table2 as b
Where a.ID = b.ID
目前,我们还没有为分配任何索引或关键字WorkingTable
。将运行速度更快,如果我们做一个分配Index
或Keys
到WorkingTable
?
谢谢
要回答这个问题,您首先需要知道键和索引在SQL Server中是如何工作的。
默认情况下,主键是聚集的唯一索引。尽管这样做确实会减慢插入记录的速度,但是减慢速度应该很小。性能的真正下降通常来自where
导致表扫描的SQL查询或DML语句中的子句。如果您在初始创建后更新了足够的记录,那么在id
列上添加主键或聚集的唯一索引将是性能上的胜利。
确实,使用主键或索引的决定归结于以下问题:
谁生成“ id”?应用程序正在加载数据还是数据库?
如果加载数据的应用程序生成“ id”值,则在该列上添加聚簇索引就足够了。
CREATE CLUSTERED INDEX IDX_WorkTable_ID
ON dbo.WorkTable (ID);
如果数据库正在生成这些值,则只需将“ id”列设置为以下类型的主键int
:
ALTER TABLE [WorkTable] ADD ID INT IDENTITY(1,1);
使用主键仍然可以快速完成插入,更新和删除操作。
从MSDN:
除少数例外,每个表都应具有聚集索引。除了提高查询性能外,还可以根据需要重建或重组聚簇索引以控制表碎片。也可以在视图上创建聚簇索引。
相关:解释聚集索引和非聚集索引
如果您需要更新索引的列的值,索引可能会拖累性能。对这些列值的每次更新都会导致SQL Server重建该索引。
与任何性能增强一样,对其进行测试。证明在布丁里。
结论
where
子句中不需要用于其他查询或语句的列上创建索引这些是任何SQL查询的基本性能准则。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句