Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Доброго всем дня.
Может кто нибудь подскажет, почему вот примерно такая вот кострукция

select top 10 *
from table1 t1
join table2 t1
on...
там еще с 10 join
where t1.f1 not in (select f2 from table2)

может работать значительно быстрее, чем

select top 10 *
from table1 t1
join table2 t1
on...
там еще с 10 join
where t1.f1 not in (select f2 from table2 WITH(NOLOCK))

Немного деталей
1. Запросы отличаются только хинтом WITH(NOLOCK)
2. Планы у запросов одинаковые
3. SET STATISTICS IO показывает, что запрос без WITH(NOLOCK) делает больше логических чтений по table2
4. Профайлер показывает значительно большее количество чтений для запроса с WITH(NOLOCK).
13 ноя 14, 14:00    [16840096]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Glory
Member

Откуда:
Сообщений: 104751
SergeyPK
Немного деталей
1. Запросы отличаются только хинтом WITH(NOLOCK)
2. Планы у запросов одинаковые
3. SET STATISTICS IO показывает, что запрос без WITH(NOLOCK) делает больше логических чтений по table2
4. Профайлер показывает значительно большее количество чтений для запроса с WITH(NOLOCK).

Вы кэш очищали при ваших экспериментах ?
13 ноя 14, 14:02    [16840114]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Glory
SergeyPK
Немного деталей
1. Запросы отличаются только хинтом WITH(NOLOCK)
2. Планы у запросов одинаковые
3. SET STATISTICS IO показывает, что запрос без WITH(NOLOCK) делает больше логических чтений по table2
4. Профайлер показывает значительно большее количество чтений для запроса с WITH(NOLOCK).

Вы кэш очищали при ваших экспериментах ?

Нет. Но запускал раз с десяток каждый. На обоих запросах были только логичесие чтения.
13 ноя 14, 14:08    [16840159]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Glory
SergeyPK
Немного деталей
1. Запросы отличаются только хинтом WITH(NOLOCK)
2. Планы у запросов одинаковые
3. SET STATISTICS IO показывает, что запрос без WITH(NOLOCK) делает больше логических чтений по table2
4. Профайлер показывает значительно большее количество чтений для запроса с WITH(NOLOCK).

Вы кэш очищали при ваших экспериментах ?

Почистил. Запустил без WITH(NOLOCK). Быстро отработал.
Почистил. Запустил с WITH(NOLOCK). Отработал медленно.
13 ноя 14, 14:15    [16840212]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Glory
Member

Откуда:
Сообщений: 104751
SergeyPK
Почистил. Запустил без WITH(NOLOCK). Быстро отработал.
Почистил. Запустил с WITH(NOLOCK). Отработал медленно.

И как другим это воспроизвести у себя ?
13 ноя 14, 14:16    [16840223]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Glory
SergeyPK
Почистил. Запустил без WITH(NOLOCK). Быстро отработал.
Почистил. Запустил с WITH(NOLOCK). Отработал медленно.

И как другим это воспроизвести у себя ?

Да никак.
Вопрос не в том, как улучшить. Вопрос - почему так может быть? Ну или куда смотреть, чтоб понять разницу в скорости выполнения?
13 ноя 14, 14:27    [16840315]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Glory
Member

Откуда:
Сообщений: 104751
SergeyPK
Да никак.

А как можно "понять разницу в скорости выполнения" того, что нельзя воспроизвести ?
13 ноя 14, 14:30    [16840342]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
А почему Вы объединяете с read committed, а читаете с read uncommitted?
13 ноя 14, 14:34    [16840381]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Glory
SergeyPK
Да никак.

А как можно "понять разницу в скорости выполнения" того, что нельзя воспроизвести ?

Glory, Я отлично понимаю, что без доступа к реальным данным никто кроме меня это не воспроизведет.
Поэтому мне нужна только подсказка, в какую сторону смотреть. Может кто-то когда-то сталкивался или читал про такое странное поведение.
Вопрос скорее чисто теоретический. Как хинт WITH(NOLOCK) может значительно замедлить выполнение запроса. При этом планы одинаковые.
13 ноя 14, 14:35    [16840394]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
o-o
Guest
может, какая-то фигня из серии, когда идет выборка с with (nolock),
то вместо сканирования в порядке кластерного индекса, выбралось в порядке распределения?
и как-то хитро страницы разложились, что так оказалось еще и дольше?
(извините, если бред)
13 ноя 14, 14:37    [16840406]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Владислав Колосов
А почему Вы объединяете с read committed, а читаете с read uncommitted?
А где там read committed?
Вообще говоря, неизвестно, что там происходит без хинта NOLOCK.
13 ноя 14, 14:37    [16840407]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Glory
Member

Откуда:
Сообщений: 104751
SergeyPK
При этом планы одинаковые.

Ну вы же сами сказали, что SET STATISTICS IO разные

SergeyPK
Glory, Я отлично понимаю, что без доступа к реальным данным никто кроме меня это не воспроизведет.

Для воспроизведения не нужны реальные данные вашей конторы. Подойдут любые данные.
13 ноя 14, 14:38    [16840425]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
iap,

Если автор не указывает уровень изоляции, то я рассматриваю по умолчанию.
13 ноя 14, 14:43    [16840471]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Владислав Колосов
А почему Вы объединяете с read committed, а читаете с read uncommitted?

Сорри
изначально было вот так

select top 10 *
from table1 t1
join table2 t1 WITH(NOLOCK)
on...
там еще с 10 join
where t1.f1 not in (select f2 from table2 WITH(NOLOCK))

Забыл вставит первый WITH(NOLOCK). Но для моего вопроса это не принципиально.
Запрос ниже, где WITH(NOLOCK) только в NOT IN, работает так же медлено.

select top 10 *
from table1 t1
join table2 t1
on...
там еще с 10 join
where t1.f1 not in (select f2 from table2 WITH(NOLOCK))
13 ноя 14, 14:43    [16840475]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
SergeyPK,

значит планы разные. Приведите полноценный пример, который бы доказывал Ваше утверждение о различии времени запроса.
13 ноя 14, 14:48    [16840520]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Glory
SergeyPK
При этом планы одинаковые.

Ну вы же сами сказали, что SET STATISTICS IO разные

SergeyPK
Glory, Я отлично понимаю, что без доступа к реальным данным никто кроме меня это не воспроизведет.

Для воспроизведения не нужны реальные данные вашей конторы. Подойдут любые данные.


SET STATISTICS IO действительно разные. При этом по всем таблицам одинаковые, кроме table2. NТот запрос, который без NOLOCK и выполняется быстрее, показывает большее количество логических чтений. Для меня это странно.

В приципе могу попробовать создать похожую структуру и набить фейковыми данными. Но тавлиц в join-ах много. Данных достаточно много. Дело не одного дня.
Реальные данные заказчик кому либо другому предоставить не разрешит.
13 ноя 14, 14:51    [16840549]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Владислав Колосов
iap,

Если автор не указывает уровень изоляции, то я рассматриваю по умолчанию.

Да, по умолчанию. COMMITTED
13 ноя 14, 14:53    [16840564]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Glory
Member

Откуда:
Сообщений: 104751
SergeyPK
В приципе могу попробовать создать похожую структуру и набить фейковыми данными. Но тавлиц в join-ах много. Данных достаточно много. Дело не одного дня.
Реальные данные заказчик кому либо другому предоставить не разрешит.

Вы предлагаете удаленно определить, что у вас происходит ? И поверить в цифры, которые видите только вы ?
13 ноя 14, 14:53    [16840572]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Владислав Колосов
iap,

Если автор не указывает уровень изоляции, то я рассматриваю по умолчанию.
Изоляция по-умолчанию настраивается. ЕМНИП.

SergeyPK, задавайте хинт явно, а не просто убирайте его.
И никогда не пишите NOT IN(SELECT ...).
Попадётся в подселекте NULL, - и попадёте.
13 ноя 14, 14:54    [16840581]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Владислав Колосов
SergeyPK,

значит планы разные. Приведите полноценный пример, который бы доказывал Ваше утверждение о различии времени запроса.

К сожалению не могу привести пример прямо сейчас. Как будет свободное время, попробую сделать что-то воспроизводимое.
Но поверте мне на слово. Планы одинаковые. По крайней мере сервер мне дает такой же самый актуальный план на оба запроса.
13 ноя 14, 14:56    [16840595]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
SergeyPK,

Лучше планы реальные опубликуйте. В формате sqlplan.
Толку будет гораздо больше.
13 ноя 14, 14:57    [16840605]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
SergeyPK
Планы одинаковые. По крайней мере сервер мне дает такой же самый актуальный план на оба запроса.
И как вы в этом убедились? Анализирую глазами?
13 ноя 14, 14:58    [16840618]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Glory
Member

Откуда:
Сообщений: 104751
SergeyPK
. Планы одинаковые. По крайней мере сервер мне дает такой же самый актуальный план на оба запроса.

Вы их визуально сравнивали ? Или в текстовом виде вплоть до числа выбираемых записей и чмсла выполнений ?
Потому что Nested Loops везде выглядит одинаково, но 10 выполнений и 1000000 очень сильно влияеют на время выполнения и число чтений
13 ноя 14, 14:59    [16840622]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
Glory
SergeyPK
В приципе могу попробовать создать похожую структуру и набить фейковыми данными. Но тавлиц в join-ах много. Данных достаточно много. Дело не одного дня.
Реальные данные заказчик кому либо другому предоставить не разрешит.

Вы предлагаете удаленно определить, что у вас происходит ? И поверить в цифры, которые видите только вы ?

Glory, уважаемый. Еще раз повторю. Мне не нужно, чтоб кто-то что-то у меня определил. Чисто теоретический вопрос

автор
Поэтому мне нужна только подсказка, в какую сторону смотреть. Может кто-то когда-то сталкивался или читал про такое странное поведение.
Вопрос скорее чисто теоретический. Как хинт WITH(NOLOCK) может значительно замедлить выполнение запроса. При этом планы одинаковые.
13 ноя 14, 15:00    [16840628]     Ответить | Цитировать Сообщить модератору
 Re: WITH(NOLOCK) - без него значительно быстрее. Странно.  [new]
Glory
Member

Откуда:
Сообщений: 104751
SergeyPK
Glory, уважаемый. Еще раз повторю. Мне не нужно, чтоб кто-то что-то у меня определил. Чисто теоретический вопрос

Какой вопрос то ?
Меня волнуют цифирки на экране ? Мне кажется, что они неправильные ?
13 ноя 14, 15:03    [16840660]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить