【问题标题】:SQL indexes and update timingSQL 索引和更新时机
【发布时间】:2013-04-07 11:22:03
【问题描述】:

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

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

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

【问题讨论】:

  • 索引被更新......当它们被更新时。如果它们是非聚集索引并且您没有更改它们的键或覆盖列,它们可能永远不会更新。看执行计划。如果您的连接超时但您确信更新将完成,那么您可能遇到了默认超时不适合您的情况。如果您不能将更新分解成更小的部分,也许您可​​以尝试或多或少的积极锁定。以此类推。
  • 索引以减慢更新速度为代价提高选择和读取数据。如果您通常做的更新多于选择,索引可能会适得其反

标签: sql sql-server tsql indexing


【解决方案1】:

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

本地索引也意味着索引也是分区的,因此速度会大大提高。

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

【讨论】:

  • 感谢您的链接,这是我应该调查的新内容。也许这就是我们需要的。
【解决方案2】:

我们有一个庞大的系统,主表也有几百万条记录……至少以前是这样。我们将超过 6 个月的数据移到存档表中。通常,旧数据仅用于报告目的。通过这样做,我们能够极大地提高实时系统的性能。话虽如此,这对您来说可能不是一个可行的解决方案。

【讨论】:

  • 不幸的是,此表包含无法移动到存档的“实时”数据:(
【解决方案3】:

索引是否碎片化(更新表和FK表)?
列的类型和它是否为空?
你能忍受脏读(nolock)吗?
你能忍受不检查 FK 约束吗?

请发布更新声明?
我相信您正在检查不使用相同的值进行更新。

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

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

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2017-11-15
    • 2014-08-16
    相关资源
    最近更新 更多