Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Процедура залипает на простом скрипте  [new]
otets1988
Member

Откуда:
Сообщений: 21
Добрый день,

Помогите понять в чем может быть следующая проблема.

Сервер - Microsoft SQL Server 2014 (SP2-GDR) (KB4019093) - 12.0.5207.0 (X64)
Есть процедура, которая начинается со следующей простой выборки:

IF OBJECT_ID(N'tempdb..#NewOutlets', N'U') IS NOT NULL
	DROP TABLE #NewOutlets;
-- Список новых ТТ из tblOutLets, которых еще нет в таблице логов OutletsAudit
SELECT tol.Cust_id, tol.OL_id 
INTO #NewOutlets
FROM dbo.tblOutLets AS tol 
WHERE tol.DLM BETWEEN @DateFrom AND @DateTo
EXCEPT
SELECT oa.Cust_id, oa.OL_id 
FROM dbo.OutletsAudit AS oa;


Суть этой выборки - найти список строк в tblOutLets, который по заданным столбцам отсутствует в OutletsAudit.

Если подствить нужный мне период в выборку из первой таблицы, то я получаю результат в размере ~315 тыс строк.
Если выполнить отдельно второй запрос, то получаю результат в размере ~290 тыс строк.
Если выполнить целиком c EXCEPT, то получаю результат в размере ~43 тыс строк. При этом время выполнения составляет
CPU time = 922 ms,  elapsed time = 5233 ms.
План выполнения этой выборки во вложении "1.sqlplan"


Если запустить выполнение этого куска кода в рамках процедуры, то у меня процедура залипает на этом участке и висит бесконечно. Растет CPU, количество чтений в пределах 10-15.
Это не всегда так. Данная проблема у меня впервые появилась на тестовой среде и тогда я ничего не смог поделать с ней (сбрасывал кеши планов, запускал процедуру с рекомпиляцией) и только пересоздание процедуры решило проблему.
Сейчас эта проблема всплыла на продуктиве у клиента. Вариант - удалить и заново создать не вариант. Надо понять причину такого поведения.
План выполнения той же выборки, но запущенной в рамках процедуры "2.sqlplan"

Очень интересная картина выходит по планам. В первом случае видно, как он тянет много строк, а во втором ничего.


Спасибо!

P.S. Не судите строго, но я не смог понять, как приложить 2 плана по отдельности, поэтому архивом приатачил.

К сообщению приложен файл (Archive.zip - 6Kb) cкачать
12 июл 18, 10:53    [21565204]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
otets1988,


http://www.sommarskog.se/query-plan-mysteries.html
12 июл 18, 10:57    [21565223]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
мщдя... а то что у вас разные запросы никого не волнует ?? да и в обоих случаях у вас просят создать нужный индекс ?
12 июл 18, 11:00    [21565241]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ну и сравнивать Actual vs Estimate из рвзных мест это всегда весело.

автор
Очень интересная картина выходит по планам. В первом случае видно, как он тянет много строк, а во втором ничего.

a NL vs Hash вас не смутил... в общем курите ссылку
12 июл 18, 11:00    [21565245]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
otets1988
Member

Откуда:
Сообщений: 21
Maxx
мщдя... а то что у вас разные запросы никого не волнует ?? да и в обоих случаях у вас просят создать нужный индекс ?

Вы о том, что я убрал INTO в первом варианте?
Вот вместе с INTO план во вложении

Индексы могу создать, но что они мне дадут в данном случае кроме ускорения? К примеру, текущая скорость меня устраивает.
Или они решат мою проблему?

К сообщению приложен файл (3.sqlplan - 56Kb) cкачать
12 июл 18, 11:05    [21565274]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
otets1988
Member

Откуда:
Сообщений: 21
TaPaK
ну и сравнивать Actual vs Estimate из рвзных мест это всегда весело.

автор
Очень интересная картина выходит по планам. В первом случае видно, как он тянет много строк, а во втором ничего.

a NL vs Hash вас не смутил... в общем курите ссылку

Спасибо за ссылку. Сейчас буду пытаться разобраться.
Что касается планов, то первый я получил актуальный после обычной выборки, а второй взял из процедуры sp_WhoIsActive (Adam Machanic). Эта процедура разве Estimate план выдает? Только что проверил свою процедуру на другом сервере и там sp_WhoIsActive нарисовал план с большим потоком данных в отличии от того, что на продуктиве сейчас, где по 1 строке возвращает.
12 июл 18, 11:10    [21565304]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
otets1988
Member

Откуда:
Сообщений: 21
TaPaK
a NL vs Hash вас не смутил... в общем курите ссылку

Моих знаний на текущий момент недостаточно, чтобы понять почему при обычной выборке он решил использовать Hash match, а внутри процедуры NL...
12 июл 18, 11:14    [21565324]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Начинайте отсюда и дальше
12 июл 18, 11:21    [21565372]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
otets1988
Member

Откуда:
Сообщений: 21
Товарищ TaPak натолкнул на мысль о разнице между физическим соединением.
Я не любитель использовать OPTION, привык, что SQL сам найдет правильное решение, но в данном конкретном случае явно указал для своего скрипта внутри процедуры
OPTION (HASH JOIN)


После этого процедура выполнилась быстро и правильно.


Еще я попробовал перед запуском процедуры обновить статистику для указанных 2-х таблиц и после запускать процедуру.
Результата ноль.
Далее я взял и запихнул обновление статистики по 2-м таблицам в саму процедуру перед выполнением своей выборки.
Результат - процедура выполнилась быстро и правильно.

Для меня эта мистика какая-то.
Буду читать ваши ссылки, может чего пойму...
12 июл 18, 12:31    [21565689]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
aleks222
Member

Откуда:
Сообщений: 956
otets1988
Товарищ TaPak натолкнул на мысль о разнице между физическим соединением.
Я не любитель использовать OPTION, привык, что SQL сам найдет правильное решение, но в данном конкретном случае явно указал для своего скрипта внутри процедуры
OPTION (HASH JOIN)


После этого процедура выполнилась быстро и правильно.


Еще я попробовал перед запуском процедуры обновить статистику для указанных 2-х таблиц и после запускать процедуру.
Результата ноль.
Далее я взял и запихнул обновление статистики по 2-м таблицам в саму процедуру перед выполнением своей выборки.
Результат - процедура выполнилась быстро и правильно.

Для меня эта мистика какая-то.
Буду читать ваши ссылки, может чего пойму...


Чудес нет.

Есть разные
DBCC USEROPTIONS

для ваших подключений.
12 июл 18, 12:34    [21565704]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
otets1988
Member

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

Мы вроде бы на одном языке общаемся, но я многое не понимаю ))
Жизнь боль, а эффект Даннинга-Крюгера сила.
12 июл 18, 12:43    [21565754]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
otets1988,

прибить хешем это конечно агонь. Но статью вы решили не открывать...
12 июл 18, 12:55    [21565794]     Ответить | Цитировать Сообщить модератору
 Re: Процедура залипает на простом скрипте  [new]
otets1988
Member

Откуда:
Сообщений: 21
TaPaK
otets1988,
прибить хешем это конечно агонь. Но статью вы решили не открывать...

С чего вы решили, что я статью решил не открывать?
Если бы она была короткой, то я бы ее сразу прочитал, а так как она очень приличного размера, а решить проблему надо было немедленно, то я решил что-то сперва делать. Пусть это будет сейчас затычка без понимания сути.
Но зато я теперь могу спокойно попытаться разобраться в сути пока затычка стоит и не давит на меня.

otets1988
Буду читать ваши ссылки, может чего пойму...
12 июл 18, 13:19    [21565884]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить