Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
.Евгений Member Откуда: Сообщений: 653 |
Добрый день, коллеги. Недавно в ходе раздачи указаний подвластным мне серверам MS SQL я наткнулся на каприз с их стороны. Приведу скрипт, воспроизводящий ситуацию: select @@version -- Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64)... create table #temp (Id bigint primary key) select Id from #temp union all --... (повторить еще 62 раза) select Id from #temp --итого 64 селекта order by 1Этот скрипт выполняется посредством ступенчатых Merge Join (Concatenation); но если я добавляю в конкатенацию еще один селект, сервер меняет план выполнения на Concatenation и последующий Sort. Применение хинта OPTION (MERGE UNION) привело к сидячей забастовке - ответу "Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN." На реальных данных такое поведение меня не совсем устраивает, стоимость плана возрастает более чем на порядок. Не то чтобы это стало для меня проблемой (много очевидных воркароундов, из которых выбран простейший - я стал забирать несортированный поток и сортировать сам). Но хотелось бы иметь прямые средства воздействия на оптимизатор сервера, который, видя более чем 64 таблицы в запросе, отвечает мне: "Я девочка. Я не хочу ничего |
17 мар 19, 22:07 [21835429] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
Лютый бред какой-то. Зачем 64 раза селектить пустую таблицу в одном запросе? А не пустую?
Сообщение было отредактировано: 17 мар 19, 23:44 |
17 мар 19, 23:31 [21835471] Ответить | Цитировать Сообщить модератору |
.Евгений Member Откуда: Сообщений: 653 |
Вы прямо как наш родной МИД. Пожалуйста, читайте внимательнее написанное мной. Вы спрашиваете, зачем селектить пустую таблицу? Потому что "скрипт, воспроизводящий ситуацию". Зачем мне создавать 64 таблицы, если на одной происходит то же самое? Более того, я единственное поле оставил по той же причине. И с пустотой та же петрушка - я прямо указал, что происходит на моих реальных данных. |
||
18 мар 19, 09:29 [21835602] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
.Евгений, Нашинкуйте на фрагменты: select Id from ( select top (cast(0x7fffffff as int)) Id from ( select id from #temp union all select id from #temp union all select id from #temp union all select id from #temp ) a order by Id ) b union all select Id from ( select top (cast(0x7fffffff as int)) Id from ( select id from #temp union all select id from #temp union all select id from #temp union all select id from #temp ) a order by Id ) b option (merge union); |
18 мар 19, 10:29 [21835644] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
.Евгений, Воспроизвести в общем-то не получилось, но и SP1-CU5 нет... |
18 мар 19, 10:31 [21835648] Ответить | Цитировать Сообщить модератору |
.Евгений Member Откуда: Сообщений: 653 |
Это воркароунд, были мысли о нем, но не счел оптимальным. Ибо запрос создается динамически (для разных таблиц), и в таких ситуациях я всячески избегаю делать навороты в генерируемом содержимом.
Аналогичный план для Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) А на какой версии этой смены плана не происходит? |
||||
18 мар 19, 10:42 [21835660] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
план менятся, ошибок нет |
||||||
18 мар 19, 10:47 [21835667] Ответить | Цитировать Сообщить модератору |
.Евгений Member Откуда: Сообщений: 653 |
Я правильно понял, что у вас при объединении 65 экземпляров таблицы и указании хинта OPTION (MERGE UNION) создается план с конкатенациями, но ошибки "Query processor could not produce..." не происходит? |
||
18 мар 19, 10:56 [21835678] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
соврал на 65 падает |
||||
18 мар 19, 11:05 [21835685] Ответить | Цитировать Сообщить модератору |
.Евгений Member Откуда: Сообщений: 653 |
В общем, если кто-то найдет ссылку на документацию, описывающую поведение сервера в данной ситуации, или знает какую-то дубину (трейсфлаг и т.п.), посредством которой моих "девочек" можно насильно заставить сделать мне Merge Join 65 раз подряд - буду рад услышать. Не услышу - продолжу пользоваться воркароундами, которые сочту оптимальными в той или иной ситуации. P.S. Небольшой комментарий на тему "зачем". У меня организован архив входящих сообщений, разбитый на отдельные таблицы (ради управляемости, согласно типу и году-месяцу). Иногда эти сообщения нужно перечитать (и перезагрузить их содержимое в ХД) в порядке возрастания идентификатора. Шесть типов за год - вот мне и каприз. |
18 мар 19, 11:33 [21835718] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
.Евгений, если память не изменяет, стратегия слияния выбирается оптимизатором при наличии потребности или возможности обработки сортированных списков. Если появляется черная овца, то такая стратегия не может быть использована даже насильственным путём. |
18 мар 19, 13:13 [21835869] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |