Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / все чудесатее и чудесатее или проблемы с компиляцией процедуры / 25 сообщений из 30, страница 1 из 2
22.02.2018, 08:23
    #39605927
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: )

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

1. Есть процедура.
2. Внезапно, эта процедура стала виснуть на запуске. Т.е. ваще ничего не делает и фсе. Часа три я ждал. Типичное время исполнения - 10 сек.
3. Причем впечатление - ВАЩЕ не запускается. Т.е. виснет на этапе компиляции.
4. Начал разбираться. Закомментил содержимое.
5. Запустилась.
6. Методом деления отрезка пополам вычислил стейтмент
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
                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. Методом научного тыка выяснил
Код: sql
1.
2.
3.
4.
5.
-- висим (т.е. не запускаемя вовсе)
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. Еще раз напоминаю: ДАННЫЙ СТЕЙТМЕНТ В ТЕСТОВОМ ЗАПУСКЕ НЕ ИСПОЛНЯЕТСЯ.

Что за чудо?
...
Рейтинг: 0 / 0
22.02.2018, 09:12
    #39605948
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.
...
Рейтинг: 0 / 0
22.02.2018, 09:17
    #39605951
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
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" ваще можно несколько раз с разными фильтрами использовать.
...
Рейтинг: 0 / 0
22.02.2018, 09:19
    #39605953
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Что во время висюка для этой сессии в sys.dm_os_waiting_tasks?
...
Рейтинг: 0 / 0
22.02.2018, 09:21
    #39605954
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
invmЧто во время висюка для этой сессии в sys.dm_os_waiting_tasks?
Не смотрел, но щас посмотрю...
...
Рейтинг: 0 / 0
22.02.2018, 09:24
    #39605957
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Код: plaintext
1.
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
...
Рейтинг: 0 / 0
22.02.2018, 09:29
    #39605960
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
А версия сервера какая? В ранних реализациях merge был очень глюкавым - помнится, я на 2008R2 как-то напоролся на абсолютно непонятную, и ничего не говорящую своим сообщением ошибку при попытке мерджа таблицы, в которой было вычисляемое поле (разумеется, в мердже не было никаких попыток это поле изменить). Возможно, и вышеприведенное из той же области.
...
Рейтинг: 0 / 0
22.02.2018, 09:29
    #39605961
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Дополнительные вести с полей!

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

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

Т.е. оно не стоит - оно что-то делает.
...
Рейтинг: 0 / 0
22.02.2018, 09:30
    #39605963
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Сон Веры ПавловныА версия сервера какая? В ранних реализациях merge был очень глюкавым - помнится, я на 2008R2 как-то напоролся на абсолютно непонятную, и ничего не говорящую своим сообщением ошибку при попытке мерджа таблицы, в которой было вычисляемое поле (разумеется, в мердже не было никаких попыток это поле изменить). Возможно, и вышеприведенное из той же области.

aleks222Microsoft 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: )
...
Рейтинг: 0 / 0
22.02.2018, 10:05
    #39605975
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
preemptive_os_fileops - ожидание при операциях с файловой системой.
Надо разбираться с чтениями из filestrem.
...
Рейтинг: 0 / 0
22.02.2018, 11:23
    #39606016
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
invmpreemptive_os_fileops - ожидание при операциях с файловой системой.
Надо разбираться с чтениями из filestrem.

О мудрейший!

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

Я ж русским по белому написал: ваще не запускается. Т.е. виснет на этапе компиляции.
...
Рейтинг: 0 / 0
22.02.2018, 11:26
    #39606019
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Для вящей понятности:

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

return

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

Если внести упомянутые выше изменения - срабатывает мгновенно.
...
Рейтинг: 0 / 0
22.02.2018, 11:42
    #39606036
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
когда компилится - могут отрабатываются все варианты, даже если в текущем наборе параметров данная ветка не используется.
т.е. таки при компиляции он "заходит" в эту ветку.
И да вроде в профайлере можно посмотреть, если проца действительно зависает на компиляции.
...
Рейтинг: 0 / 0
22.02.2018, 11:44
    #39606038
все чудесатее и чудесатее или проблемы с компиляцией процедуры
aleks222,

Попробуй количество звездочек на квадратный километр уменьшить. И в целом селф-референсов как-то овердохрена. При том что начинаешь и заканчиваешь "константами".
...
Рейтинг: 0 / 0
22.02.2018, 11:44
    #39606039
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
aleks222,

sp_recompile тоже висит?
...
Рейтинг: 0 / 0
22.02.2018, 11:48
    #39606046
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
так, чисто ради эксперимента
что будет, если так попробовать?
Код: sql
1.
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
...
Рейтинг: 0 / 0
22.02.2018, 11:50
    #39606048
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
aleks222[До чтения дело не доходит.

Я ж русским по белому написал: ваще не запускается. Т.е. виснет на этапе компиляции.Значит в процессе компиляции доходит до еще какой-то операции с файловой системой.
Чудес не бывает и ожидание на пустом месте не возникает.
Можно взять Process Monitor и попытаться выяснить место затыка.
...
Рейтинг: 0 / 0
22.02.2018, 17:13
    #39606263
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
dies iraeтак, чисто ради эксперимента
что будет, если так попробовать?
Код: sql
1.
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



Эффект тот же.
...
Рейтинг: 0 / 0
22.02.2018, 17:16
    #39606264
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
invm1. Значит в процессе компиляции доходит до еще какой-то операции с файловой системой.
Чудес не бывает и ожидание на пустом месте не возникает.
2. Можно взять Process Monitor и попытаться выяснить место затыка.

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

2. Можно. Но недосуг. Мне и без неравенства сойдет.
...
Рейтинг: 0 / 0
22.02.2018, 21:13
    #39606374
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
aleks222merge 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, а кому сейчас легко ...
...
Рейтинг: 0 / 0
22.02.2018, 23:17
    #39606408
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Andy_OLAP,

С какого перепугу?
Где по ссылке что-то про "insert-values does not not work"?
...
Рейтинг: 0 / 0
23.02.2018, 01:15
    #39606425
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Есть процедураAndy_OLAP,

С какого перепугу?
Где по ссылке что-то про "insert-values does not not work"?
Я таки ссылку вполне кошерную привел. Если Вы думаете, что query compilation - это задача, которой в Редмонде занимаются американские профессора, то я Вас сильно разочарую. Если будет возможность - найдите Халяко, напоите его хорошенько и спросите его личные впечатления про команду индусов (Арвинд, Рахеш, Шива, Санжай), если Вы думаете, что Морган заставит их использовать нормальные решения при анализе текста T-SQL запроса - это избыточный оптимизм.
...
Рейтинг: 0 / 0
23.02.2018, 01:19
    #39606427
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Есть процедура,

В ссылке про path_locator. Не нужно думать, что можно безнаказанно писать любой T-SQL код. Чем проще - тем лучше.
...
Рейтинг: 0 / 0
23.02.2018, 01:38
    #39606430
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. Увидите, как жизнь станет проще, без сарказма и шуток, искренне советую.
...
Рейтинг: 0 / 0
23.02.2018, 08:01
    #39606439
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
все чудесатее и чудесатее или проблемы с компиляцией процедуры
Andy_OLAPaleks222Наблюдаю загадочное явление

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. Увидите, как жизнь станет проще, без сарказма и шуток, искренне советую.

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

ЗЫ. Дарагуля, не учи меня жить. Лучше научись читать.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / все чудесатее и чудесатее или проблемы с компиляцией процедуры / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]