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

时间:2013-08-05 18:41:50

标签: sql-server join nolock

以下是我的情景: 我有一个存储过程,通过连接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)
    

    OR就足够了

    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,那么会有什么不同吗?

  3. 由于

    维卡斯

1 个答案:

答案 0 :(得分:6)

  1. 您只需要为长时间锁定的表格添加NOLOCK,因此仅将NOLOCK添加到Table1即可。
  2. 如果将隔离级别设置为READ UNCOMMITTED,则根本不需要添加NOLOCK,因为它将自动应用于所有查询的表。换句话说,您将在问题项1中创建类似于第一个示例的情况,其中NOLOCK应用于参与SELECT的所有表。
  3. 顺便说一句,请确保在ON子句中添加INNER JOIN条件,因为它们不是有效的Transact-SQL。