3

以下是我的场景:我有一个通过连接 4 个表返回数据的存储过程。中午有两次批量上传到上述 4 个表之一。负载持续 10-15 分钟。我不希望调用此存储过程的 UI 在这 10-15 分钟的窗口中冻结/阻塞/减速。我不关心从上面的表格中显示脏/未提交的数据。以下是我的查询:

  1. 我是否需要仅在白天加载的表上使用 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
    
  2. 如果我在检索过程开始时添加一个 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 并在最后将其重置为 READ COMMITTED ,会有什么区别吗?

谢谢

维卡斯

4

1 回答 1

6
  1. 您只需要为NOLOCK将长时间锁定的表添加,因此NOLOCK仅添加Table1就足够了。
  2. 如果将隔离级别设置为READ UNCOMMITTED,则根本不需要添加NOLOCK,因为它会自动应用于所有查询的表。换句话说,您将创建一个类似于您的问题项目 1 中的第一个示例的情况,该情况NOLOCK适用于参与SELECT.

顺便说一句,请确保ON向子句添加条件INNER JOIN,因为它们不是有效的 Transact-SQL。

于 2013-08-05T18:50:24.700 回答