【发布时间】:2013-08-05 18:41:50
【问题描述】:
以下是我的场景: 我有一个通过连接 4 个表返回数据的存储过程。 中午有两次批量上传到上述 4 个表格中的一个。负载持续 10-15 分钟。我不希望调用此存储过程的 UI 在这 10-15 分钟的窗口中冻结/阻塞/减速。我不关心从上面的表中显示脏/未提交的数据。以下是我的疑问:
-
我需要在白天加载的表上使用 NOLOCK 还是需要将 NOLOCK 添加到连接的所有 4 个表中。 例如
SELECT * FROM Table1 T1 WITH (NOLOCK) --this is the table that will be bulk-loaded twice during the day INNER JOIN Table2 T2 WITH (NOLOCK) INNER JOIN Table3 T3 WITH (NOLOCK) INNER JOIN Table4 T4 WITH (NOLOCK)或者这样就够了
SELECT * FROM Table1 T1 WITH (NOLOCK) --this is the table that will be bulk-loaded twice during the day INNER JOIN Table2 T2 INNER JOIN Table3 T3 INNER JOIN Table4 T4 如果我在检索过程开始时添加一个 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 并在最后将其重置为 READ COMMITTED,会有什么不同吗?
谢谢
维卡斯
【问题讨论】:
-
@MartinSmith 不正确。只有 Sch_M 锁会阻止读取未提交的只读查询。
-
@SebastianMeine - 你说得对,我认为它需要一个
IS锁定而不是SCH-S锁定。 -
另外请记住,SCH-M 不仅仅用于模式更改。它可以用于离线重新索引、截断和偶尔的批量插入。请参阅此处了解何时可以在批量插入批量或简单恢复模型期间采用 SCH-M:technet.microsoft.com/en-us/library/…
标签: sql-server join nolock