何时更新&从巨大的表中选择id从30000开始超过2分钟的时间

时间:2013-01-07 09:52:39

标签: sql performance sql-server-2008-r2 latency

请注意,我有一个包含 2个表的数据库:第一个包含超过200万条记录的数据库 第二个是第一个历史表。 当我们尝试进行选择或更新并且ID(主键)超过30 000时,查询执行时间超过1分钟。 如果我做截断并导入数据并且id从1开始,则查询需要1秒。 那么为什么延迟时ID> 30 000 和任何其他解决方案?索引完成于:1表示PK另一个日期,另一个表示字段优先级整数 如果我从table1做一个简单的选择前10 *我有2分钟的延迟
PS:许多交易在第一张表上同时完成(选择,插入,更新和删除) 谢谢,

1 个答案:

答案 0 :(得分:0)

如果您遇到锁定争用,您基本上有两种选择:

  1. 执行查询时停止所有其他活动。这将保证数据的一致视图。 (从技术上讲,需要其他步骤来保证与其他表的一致性)。您可以通过指定with (TABLOCKX)查询提示来执行此操作。

    (您还可以使用“序列化”事务隔离级别,它会在您读取时逐步锁定表。您可以使用索引做一些聪明的事情,这样可以减少这种情况,但是这可以说是“高级” “)。

  2. 允许其他活动继续,但接受您获得的答案可能与查询正在进行时发生的活动不一致。也就是说,在查询期间添加的行可能包含也可能不包括,并且在查询期间被删除的行可能包含或不包含,并且正在更新的行可能会或可能不会,具有先前或后续的值。此外,您可能会发现包含一些较晚的值而某些较早的值不包含在内,因此它不会在时间上保持一致。您可以使用with (NOLOCK)提示执行此操作。

    (您也可以使用“read uncommitted”事务隔离级别。通常,只在需要时指定NOLOCK更容易)。

  3. 根据您的操作,任一选项可能都是最佳选择。如果您想提供粗略的数字,或者为报告/监控目的提供一种滚动的“前10名”,请使用选项2.如果您必须提供会计编号,银行余额等内容,那么您必须拥有一个检查点在瞬间知道确切正确的数字,使用选项1.这是罕见的 - 如果有疑问你可能想要选项2.

    “介于两者之间”选项,读取提交,读取快照等,实际上很少需要,尽管是默认设置,并且应该仅在您了解情况以便知道是否需要它们时使用