SQL Server NOLOCK с JOIN, массовая загрузка

Ниже приведен сценарий, который у меня есть: у меня есть хранимая процедура, которая возвращает данные, объединяя 4 таблицы. Дважды в середине дня происходит массовая загрузка в одну из 4 вышеприведенных таблиц. Нагрузка продолжается 10-15 минут. Я не хочу, чтобы пользовательский интерфейс, который вызывает эту хранимую процедуру, зависал/блокировался/замедлялся в течение этого 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 в конце, будет ли разница?

Спасибо

Викас


person Vikas    schedule 05.08.2013    source источник
comment
@MartinSmith, это неправильно. Только блокировка Sch_M блокирует незафиксированный запрос только для чтения.   -  person Sebastian Meine    schedule 05.08.2013
comment
@SebastianMeine - Вы правы, я думал, что нужна блокировка IS, а не блокировка SCH-S.   -  person Martin Smith    schedule 05.08.2013
comment
Также имейте в виду, что SCH-M предназначен не только для изменения схемы. Его можно использовать для таких вещей, как автономная переиндексация, усечение и иногда массовые вставки. См. здесь, когда SCH-M можно использовать во время массовой вставки в массовой или простой модели восстановления: technet.microsoft.com/en-us/library/   -  person brian    schedule 06.08.2013


Ответы (1)


  1. Вам нужно добавить NOLOCK только для таблиц, которые будут заблокированы на длительный период времени, поэтому достаточно добавить NOLOCK только к Table1.
  2. Если вы установите уровень изоляции READ UNCOMMITTED, вам вообще не нужно добавлять NOLOCK, так как он будет автоматически применяться ко всем запрашиваемым таблицам. Другими словами, вы создадите ситуацию, аналогичную первому примеру в пункте 1 вашего вопроса, где NOLOCK применяется ко всем таблицам, участвующим в SELECT.

Кстати, убедитесь, что вы добавили условия ON в предложения INNER JOIN, потому что в представленном виде они недействительны для Transact-SQL.

person Michael Goldshteyn    schedule 05.08.2013
comment
Спасибо за быстрый и лаконичный ответ Михаил. Как раз то, что я искал. Зарегистрируйте условие ON, да, это был полупсевдокод. Фактические JOIN имеют условия ON. - person Vikas; 06.08.2013