Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
Microsoft SQL Server 2012 (SP2-GDR) (KB3194719) - 11.0.5388.0 (X64)
Sep 23 2016 16:56:29
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )

Наблюдаю загадочное явление

1. Есть процедура.
2. Внезапно, эта процедура стала виснуть на запуске. Т.е. ваще ничего не делает и фсе. Часа три я ждал. Типичное время исполнения - 10 сек.
3. Причем впечатление - ВАЩЕ не запускается. Т.е. виснет на этапе компиляции.
4. Начал разбираться. Закомментил содержимое.
5. Запустилась.
6. Методом деления отрезка пополам вычислил стейтмент
                with f  as ( select * from TourML.SpoFiles )
                   , fl as ( select * from f where is_directory = 0 and file_type = N'xml' and name = @name )
                   , fo as ( select * from f where is_directory = 1 and name = @dir and parent_path_locator is null )
                   , x  as ( select path_locator = isnull( fl.path_locator
                                                         , fo.path_locator.GetDescendant( (select max(path_locator) from f where parent_path_locator = fo.path_locator ), null)
                                                         )
                                  , name = @name
                                  , file_stream = cast( @XML as varbinary(max) )
                                  , creation_time = @now
                               from fo left outer join fl on fl.parent_path_locator = fo.path_locator
                           )
                  merge f using x on f.path_locator = x.path_locator
                    when not matched then insert( path_locator, name, file_stream, creation_time ) values( path_locator, name, file_stream, creation_time )
                    when matched and ( f.file_stream <> x.file_stream ) then update set file_stream = x.file_stream, creation_time = x.creation_time
               ;

7. Комментируешь - работает. Убираешь комментарий - висит.
8. Этот стейтмент в тестовом запуске ВАЩЕ НЕ ИСПОЛНЯЕТСЯ.
9. Т.е. проблемы именно в компиляции.
10. Методом научного тыка выяснил
-- висим (т.е. не запускаемя вовсе)
when matched and ( f.file_stream <> x.file_stream ) then update set file_stream = x.file_stream, creation_time = x.creation_time

-- работаем (т.е. запускаемся)
when matched then update set file_stream = x.file_stream, creation_time = x.creation_time

11. Еще раз напоминаю: ДАННЫЙ СТЕЙТМЕНТ В ТЕСТОВОМ ЗАПУСКЕ НЕ ИСПОЛНЯЕТСЯ.

Что за чудо?
22 фев 18, 08:23    [21210194]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Massa52
Member

Откуда:
Сообщений: 379
!Caution

It is important to specify only the columns from the target table that are used for matching purposes. That is, specify columns from the target table that are compared to the corresponding column of the source table. Do not attempt to improve query performance by filtering out rows in the target table in the ON clause, such as by specifying AND NOT target_table.column_x = value. Doing so may return unexpected and incorrect results.
22 фев 18, 09:12    [21210247]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
Massa52
!Caution

It is important to specify only the columns from the target table that are used for matching purposes. That is, specify columns from the target table that are compared to the corresponding column of the source table. Do not attempt to improve query performance by filtering out rows in the target table in the ON clause, such as by specifying AND NOT target_table.column_x = value. Doing so may return unexpected and incorrect results.


А теперь изложи своими словами.
Ибо какое отношение имеет "ON clause" ко вполне документированному доп. фильтру в "when matched"?

Если ты читал документацию "when matched" ваще можно несколько раз с разными фильтрами использовать.
22 фев 18, 09:17    [21210254]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Что во время висюка для этой сессии в sys.dm_os_waiting_tasks?
22 фев 18, 09:19    [21210257]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
invm
Что во время висюка для этой сессии в sys.dm_os_waiting_tasks?

Не смотрел, но щас посмотрю...
22 фев 18, 09:21    [21210260]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
waiting_task_address	session_id	exec_context_id	wait_duration_ms	wait_type	resource_address	blocking_task_address	blocking_session_id	blocking_exec_context_id	resource_description
0x000000083988E558 164 0 0 PREEMPTIVE_OS_FILEOPS NULL NULL NULL NULL NULL
22 фев 18, 09:24    [21210271]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5954
А версия сервера какая? В ранних реализациях merge был очень глюкавым - помнится, я на 2008R2 как-то напоролся на абсолютно непонятную, и ничего не говорящую своим сообщением ошибку при попытке мерджа таблицы, в которой было вычисляемое поле (разумеется, в мердже не было никаких попыток это поле изменить). Возможно, и вышеприведенное из той же области.
22 фев 18, 09:29    [21210277]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
Дополнительные вести с полей!

Если выполнять
select * from sys.dm_os_waiting_tasks where session_id = 164

то строчка то появляется, то исчезает...

Т.е. оно не стоит - оно что-то делает.
22 фев 18, 09:29    [21210278]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
Сон Веры Павловны
А версия сервера какая? В ранних реализациях merge был очень глюкавым - помнится, я на 2008R2 как-то напоролся на абсолютно непонятную, и ничего не говорящую своим сообщением ошибку при попытке мерджа таблицы, в которой было вычисляемое поле (разумеется, в мердже не было никаких попыток это поле изменить). Возможно, и вышеприведенное из той же области.


aleks222
Microsoft SQL Server 2012 (SP2-GDR) (KB3194719) - 11.0.5388.0 (X64)
Sep 23 2016 16:56:29
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )

22 фев 18, 09:30    [21210281]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
preemptive_os_fileops - ожидание при операциях с файловой системой.
Надо разбираться с чтениями из filestrem.
22 фев 18, 10:05    [21210342]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
invm
preemptive_os_fileops - ожидание при операциях с файловой системой.
Надо разбираться с чтениями из filestrem.


О мудрейший!

До чтения дело не доходит.

Я ж русским по белому написал: ваще не запускается. Т.е. виснет на этапе компиляции.
22 фев 18, 11:23    [21210572]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
Для вящей понятности:

ставим в самом начале процедуры, ДО всех операторов

return

- а она висит при запуске.

Если внести упомянутые выше изменения - срабатывает мгновенно.
22 фев 18, 11:26    [21210581]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
когда компилится - могут отрабатываются все варианты, даже если в текущем наборе параметров данная ветка не используется.
т.е. таки при компиляции он "заходит" в эту ветку.
И да вроде в профайлере можно посмотреть, если проца действительно зависает на компиляции.
22 фев 18, 11:42    [21210647]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Наблюдаю загадочное
Guest
aleks222,

Попробуй количество звездочек на квадратный километр уменьшить. И в целом селф-референсов как-то овердохрена. При том что начинаешь и заканчиваешь "константами".
22 фев 18, 11:44    [21210655]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
TaPaK
Member

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

sp_recompile тоже висит?
22 фев 18, 11:44    [21210659]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
dies irae
Member

Откуда:
Сообщений: 78
так, чисто ради эксперимента
что будет, если так попробовать?
when matched and exists(select f.file_stream except select x.file_stream) then update set file_stream = x.file_stream, creation_time = x.creation_time
22 фев 18, 11:48    [21210672]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
aleks222
[До чтения дело не доходит.

Я ж русским по белому написал: ваще не запускается. Т.е. виснет на этапе компиляции.
Значит в процессе компиляции доходит до еще какой-то операции с файловой системой.
Чудес не бывает и ожидание на пустом месте не возникает.
Можно взять Process Monitor и попытаться выяснить место затыка.
22 фев 18, 11:50    [21210675]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
dies irae
так, чисто ради эксперимента
что будет, если так попробовать?
when matched and exists(select f.file_stream except select x.file_stream) then update set file_stream = x.file_stream, creation_time = x.creation_time


Эффект тот же.
22 фев 18, 17:13    [21212014]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
invm
1. Значит в процессе компиляции доходит до еще какой-то операции с файловой системой.
Чудес не бывает и ожидание на пустом месте не возникает.
2. Можно взять Process Monitor и попытаться выяснить место затыка.


1. Ну да, конечно... Странно тока, причем тут компиляция неравенства? Прям сразу файловая система понадобилась...

2. Можно. Но недосуг. Мне и без неравенства сойдет.
22 фев 18, 17:16    [21212021]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
aleks222
merge f using x on f.path_locator = x.path_locator
when not matched then insert( path_locator, name, file_stream, creation_time ) values( path_locator, name, file_stream,
creation_time )

Нельзя делать insert values. Не понимает такое компилятор по-нормальному. Таки нужно извращаться.
Таки делать select from, а кому сейчас легко...
22 фев 18, 21:13    [21212792]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Есть процедура
Guest
Andy_OLAP,

С какого перепугу?
Где по ссылке что-то про "insert-values does not not work"?
22 фев 18, 23:17    [21213018]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Есть процедура
Andy_OLAP,

С какого перепугу?
Где по ссылке что-то про "insert-values does not not work"?

Я таки ссылку вполне кошерную привел. Если Вы думаете, что query compilation - это задача, которой в Редмонде занимаются американские профессора, то я Вас сильно разочарую. Если будет возможность - найдите Халяко, напоите его хорошенько и спросите его личные впечатления про команду индусов (Арвинд, Рахеш, Шива, Санжай), если Вы думаете, что Морган заставит их использовать нормальные решения при анализе текста T-SQL запроса - это избыточный оптимизм.
23 фев 18, 01:15    [21213118]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Есть процедура,

В ссылке про path_locator. Не нужно думать, что можно безнаказанно писать любой T-SQL код. Чем проще - тем лучше.
23 фев 18, 01:19    [21213123]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
aleks222

Наблюдаю загадочное явление

10. Методом научного тыка выяснил
[src]
-- висим (т.е. не запускаемя вовсе)
when matched and ( f.file_stream <> x.file_stream ) then update set file_stream = x.file_stream, creation_time = x.creation_time

-- работаем (т.е. запускаемся)
when matched then update set file_stream = x.file_stream, creation_time = x.creation_time

Ну потому что компилятор пытается пойти по пути Full Outer Join. И у него это не получается. Почти месяц уже решаете задачу с FileTable, коллега. Поставьте хотя бы CU2 для SP2, освежите версию до 11.0.5548.0. Увидите, как жизнь станет проще, без сарказма и шуток, искренне советую.
23 фев 18, 01:38    [21213128]     Ответить | Цитировать Сообщить модератору
 Re: все чудесатее и чудесатее или проблемы с компиляцией процедуры  [new]
aleks222
Guest
Andy_OLAP
aleks222
Наблюдаю загадочное явление

10. Методом научного тыка выяснил
[src]
-- висим (т.е. не запускаемя вовсе)
when matched and ( f.file_stream <> x.file_stream ) then update set file_stream = x.file_stream, creation_time = x.creation_time

-- работаем (т.е. запускаемся)
when matched then update set file_stream = x.file_stream, creation_time = x.creation_time

Ну потому что компилятор пытается пойти по пути Full Outer Join. И у него это не получается. Почти месяц уже решаете задачу с FileTable, коллега. Поставьте хотя бы CU2 для SP2, освежите версию до 11.0.5548.0. Увидите, как жизнь станет проще, без сарказма и шуток, искренне советую.


Уберите этого сруля. Хотя... может он и чебурашка?

ЗЫ. Дарагуля, не учи меня жить. Лучше научись читать.
23 фев 18, 08:01    [21213199]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить