带有JOIN的SQL Server NOLOCK,批量加载

Vik*_*kas 3 sql-server nolock join

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

  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)
    
    Run Code Online (Sandbox Code Playgroud)

    或者这就足够了

    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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果我在检索程序开始时添加SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED并在结束时将其重置为READ COMMITTED,那么会有什么不同吗?

谢谢

维卡斯

Mic*_*eyn 6

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

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