是否应将索引放在要更新的SQL表上?

肯尼斯·格里尔

我们有一个每天晚上建立的工作表,其中有超过一百万条记录。每晚大约需要3个小时才能完成此过程。在中,procedure我们首先将所有数据插入表中。然后,我们对该表进行了大量更新。

例如:

Update a
Set a.Field1 = b.Field1
From WorkingTable as a JOIN Table2 as b
Where a.ID = b.ID

目前,我们还没有为分配任何索引或关键字WorkingTable将运行速度更快,如果我们做一个分配IndexKeysWorkingTable

谢谢

格雷格·伯格哈特(Greg Burghardt)

要回答这个问题,您首先需要知道键和索引在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重建该索引。

与任何性能增强一样,对其进行测试。证明在布丁里。

结论

  1. 编写您的SQL以避免表扫描。
  2. 不要在已更新其值的列上以及在where子句中不需要用于其他查询或语句的列上创建索引
  3. 避免不必要的联接

这些是任何SQL查询的基本性能准则。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否应将EAV值放在数据类型表中?

来自分类Dev

是否应将AngularJS逻辑放在HTML文件中?

来自分类Dev

是否应将版本放在XSD文件名中?

来自分类Dev

是否应将UIIMageViews直接放在控制器的视图中?

来自分类Dev

链接表上的SQL索引策略

来自分类Dev

不同表上的复合索引ORACLE SQL

来自分类Dev

SQL在表上创建多列索引和单列索引

来自分类Dev

oracle上的select SQL语句是否锁定使用的表以供其他连接更新?

来自分类Dev

插入表或更新是否存在多个唯一索引(MySQL)

来自分类Dev

PostgreSQL表是否在更新后自动重新索引?

来自分类Dev

NET表上的“ SQL表索引”的最佳实现

来自分类Dev

索引是否保留在派生表上?

来自分类Dev

Oracle 表上的共享索引是否会导致死锁?

来自分类Dev

JSHint的“不应将函数声明放在块中”是否太宽泛?

来自分类Dev

是否应将og:image和og:url放在<meta>或<link>中?

来自分类Dev

在sql中的表上触发后更新

来自分类Dev

在sql中的表上触发后更新

来自分类Dev

SQL:更新级联上的自动引用表

来自分类Dev

无法使用列存储索引(SQL)更新表脚本

来自分类Dev

将表行<tr>放在<a>标记内在语义上是否正确?

来自分类Dev

如何在要建立索引的表的列中找到重复值?

来自分类Dev

SQL Server-如何在更新命令上提示索引?

来自分类Dev

联接表上的索引

来自分类Dev

BigQuery表上的索引

来自分类Dev

在表上创建索引

来自分类Dev

仅在一张表上重建SQL中的索引

来自分类Dev

如何在sql表上设置正确的索引?

来自分类Dev

是否必须为属性建立索引才能在put()上更新关联的复合索引?

来自分类Dev

将''放在从PHP程序运行的SQL列名称上是否有效?

Related 相关文章

热门标签

归档