powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / все чудесатее и чудесатее или проблемы с компиляцией процедуры
25 сообщений из 30, страница 1 из 2
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #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
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #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
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #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
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #39605953
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что во время висюка для этой сессии в sys.dm_os_waiting_tasks?
...
Рейтинг: 0 / 0
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #39605954
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmЧто во время висюка для этой сессии в sys.dm_os_waiting_tasks?
Не смотрел, но щас посмотрю...
...
Рейтинг: 0 / 0
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #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
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #39605960
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А версия сервера какая? В ранних реализациях merge был очень глюкавым - помнится, я на 2008R2 как-то напоролся на абсолютно непонятную, и ничего не говорящую своим сообщением ошибку при попытке мерджа таблицы, в которой было вычисляемое поле (разумеется, в мердже не было никаких попыток это поле изменить). Возможно, и вышеприведенное из той же области.
...
Рейтинг: 0 / 0
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #39605961
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнительные вести с полей!

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

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

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

О мудрейший!

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

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

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

return

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

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

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

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

Я ж русским по белому написал: ваще не запускается. Т.е. виснет на этапе компиляции.Значит в процессе компиляции доходит до еще какой-то операции с файловой системой.
Чудес не бывает и ожидание на пустом месте не возникает.
Можно взять Process Monitor и попытаться выяснить место затыка.
...
Рейтинг: 0 / 0
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #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
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #39606264
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm1. Значит в процессе компиляции доходит до еще какой-то операции с файловой системой.
Чудес не бывает и ожидание на пустом месте не возникает.
2. Можно взять Process Monitor и попытаться выяснить место затыка.

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

2. Можно. Но недосуг. Мне и без неравенства сойдет.
...
Рейтинг: 0 / 0
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #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
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #39606408
Andy_OLAP,

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

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

В ссылке про path_locator. Не нужно думать, что можно безнаказанно писать любой T-SQL код. Чем проще - тем лучше.
...
Рейтинг: 0 / 0
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #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
все чудесатее и чудесатее или проблемы с компиляцией процедуры
    #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
25 сообщений из 30, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / все чудесатее и чудесатее или проблемы с компиляцией процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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