2013-04-07 48 views
0

我有一个包含大约10列(FK)的50列和非聚集索引的表。该表包含约1000万条记录。SQL索引和更新时机

我的问题是:什么时候更新表中的10k行更新索引(更新包括索引列)?这是在每次更新后还是整个更新完成后发生的?

问题是更新很长,我们收到一个数据库连接超时。我怎样才能提高更新时间?我无法在更新之前删除索引并稍后重建它们,因为在更新过程中该表也被大量使用。

+0

索引更新...更新时。如果它们是非聚集索引,而且您没有更改其密钥或覆盖列,则可能它们从未更新过。看看执行计划。如果您的连接超时,但您确信更新会完成,也许您遇到了默认超时不适合您的情况。如果你不能将更新分解成更小的块,也许你可以尝试更多或更少的积极锁定。等等等等。 – 2013-04-07 11:25:38

+0

索引增强选择和读取数据的速度,但会降低更新速度。如果你通常比选择更多的更新,索引可能会对你造成负面影响 – Filip 2013-04-07 11:37:04

回答

3

您应该对表进行分区并尝试使用本地索引。 通过划分您将划分表格数据,以便您可以对相关数据进行操作。

本地索引也意味着索引也是分区的,所以速度会显着提高。

看一看这个链接:http://msdn.microsoft.com/en-in/library/ms190787.aspx

+0

感谢您的链接,这是我应该调查的新内容。也许这是我们需要的。 – 2013-04-07 11:37:37

0

我们有一个庞大的系统,主表也有几百万条记录....至少它用。我们将超过6个月的数据移出到归档表。通常情况下,旧数据仅用于报告目的。通过这样做,我们能够极大地提高现场系统的性能。这就是说,这可能不是一个可行的解决方案。

+0

不幸的是,这个表格包含无法移动到存档的“实时”数据:( – 2013-04-07 11:36:31

0

索引是否分段(更新表和FK表)?
列的类型,它是否为空?
你可以住脏读(nolock)?
你可以住在没有检查FK禁忌?

请发布更新声明?
我相信你,你正在检查不更新相同的价值。

update tt 
set col1 = 'newVal' 
where col1 <> 'newVal' 

如果这些索引状况良好,更新10 K行应该是相当快的。
填充因子可能有帮助。