-1

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

4

1 回答 1

0

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

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

    (您还可以使用“序列化”事务隔离级别,它会在您读取表时从头到尾逐步锁定表。您可以使用索引做一些巧妙的事情来减少这种痛苦,但这符合“高级”的条件)。

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

    (您也可以使用“读取未提交”事务隔离级别。通常在需要时指定 NOLOCK 会更容易)。

根据您在做什么,任何一个选项都可能是最好的。如果您想提供粗略的数字或某种滚动“前 10 名”用于报告/监控目的,请使用选项 2。如果您必须提供诸如会计号码、银行余额等内容,那么您必须有一个检查站在某个时刻知道确切的正确数字,请使用选项 1。这很少见 - 如果有疑问,您可能需要选项 2。

尽管是默认设置,但实际上很少需要“中间”选项,即已提交读取、读取快照等,并且可能仅在您对情况了解得足够清楚以知道是否需要它们时才应使用它们。

于 2013-01-07T12:11:48.230 回答