SQL: NOLOCK вызывает замедление запроса - PullRequest
2 голосов
/ 27 июня 2011

Есть ли причина, по которой добавление nolock в запрос может привести к увеличению времени выполнения?

UPDATE TargetTable
      SET col1 = c1.RowCnt,
      col2 = c2.RowCnt
    from TargetTable tt
    join 
    (
      select col3, RowCnt = NULLIF(COUNT(*),0) from Table2 (nolock)
      group by col3
    ) c1 on c1.col3 = tt.ID 
    join
    (
      select col4, RowCnt = NULLIF(COUNT(*),0) from Table2 (nolock) 
      group by col4
    ) c2 on c2.col4 = tt.ID 

      WHERE timestamp BETWEEN @FromDate AND @ToDate
      AND (tt.Client_ID = @Client_ID)

Ответы [ 3 ]

2 голосов
/ 27 июня 2011

Подсказка NOLOCK позволяет Сканирование порядка размещения .Таким образом, они могут создать совершенно другой план выполнения, который, как ожидается, будет быстрее, но окажется, что он будет медленнее (например, неверные оценки мощности из-за устаревшей статистики).Как и с любой проблемой производительности, используйте методологию исследования, чтобы найти причину проблемы. Ожидания и очереди является превосходной такой методологией.

1 голос
/ 27 июня 2011

В этой таблице много записей? Вы уверены, что в обоих случаях затронуты правильные строки? Вы пытались использовать SET TRANSACTION ISOLATION LEVEL вместо ввода отдельных подсказок в запросе?

UPDATE tt SET 
    col1 = NULLIF(c1.RowCnt, 0),
    col2 = NULLIF(c2.RowCnt, 0)
FROM dbo.TargetTable AS tt
INNER JOIN 
(
    SELECT col3, RowCnt = COUNT(*)
        FROM dbo.Table2 WITH (NOLOCK)
        GROUP BY col3
) AS c1 ON c1.col3 = tt.ID 
INNER JOIN
(
    SELECT col4, RowCnt = COUNT(*)
        FROM dbo.Table2 WITH (NOLOCK)
        GROUP BY col4
) AS c2 ON c2.col4 = tt.ID 
WHERE tt.[timestamp] BETWEEN @FromDate AND @ToDate
AND tt.Client_ID = @Client_ID;


-- with SQL Server's UPDATE FROM syntax, you should reference the alias in the UPDATE
-- use WITH (NOLOCK), as your current syntax could become an alias in later versions
-- get in the habit of using dbo. prefix and statement terminators
-- are you sure you don't want left joins?
0 голосов
/ 27 июня 2011

Не то, что я когда-либо слышал. Я бы посмотрел на:
- Изменения - данные в таблицах, изменяющие общую стоимость запроса
- Другие действия сервера, блокирующие обновляемую таблицу
- Другая активность сервера, снижающая доступность процессора
- Фоновые задачи ОС с использованием Hard-Disk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...