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

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

Недавно в ходе раздачи указаний подвластным мне серверам 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]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36893
Лютый бред какой-то. Зачем 64 раза селектить пустую таблицу в одном запросе? А не пустую?

Сообщение было отредактировано: 17 мар 19, 23:44
17 мар 19, 23:31    [21835471]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
.Евгений
Member

Откуда:
Сообщений: 496
Гавриленко Сергей Алексеевич
Лютый бред какой-то. Зачем 64 раза селектить пустую таблицу в одном запросе? А не пустую?

Вы прямо как наш родной МИД. Пожалуйста, читайте внимательнее написанное мной.

Вы спрашиваете, зачем селектить пустую таблицу? Потому что "скрипт, воспроизводящий ситуацию". Зачем мне создавать 64 таблицы, если на одной происходит то же самое? Более того, я единственное поле оставил по той же причине. И с пустотой та же петрушка - я прямо указал, что происходит на моих реальных данных.
18 мар 19, 09:29    [21835602]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
invm
Member

Откуда: Москва
Сообщений: 9270
.Евгений,

Нашинкуйте на фрагменты:
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]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
.Евгений,

Воспроизвести в общем-то не получилось, но и SP1-CU5 нет...
18 мар 19, 10:31    [21835648]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
.Евгений
Member

Откуда:
Сообщений: 496
invm
Нашинкуйте на фрагменты:

Это воркароунд, были мысли о нем, но не счел оптимальным. Ибо запрос создается динамически (для разных таблиц), и в таких ситуациях я всячески избегаю делать навороты в генерируемом содержимом.
TaPaK
.Евгений,
Воспроизвести в общем-то не получилось, но и SP1-CU5 нет...

Аналогичный план для Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
А на какой версии этой смены плана не происходит?
18 мар 19, 10:42    [21835660]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
.Евгений
invm
Нашинкуйте на фрагменты:

Это воркароунд, были мысли о нем, но не счел оптимальным. Ибо запрос создается динамически (для разных таблиц), и в таких ситуациях я всячески избегаю делать навороты в генерируемом содержимом.
TaPaK
.Евгений,
Воспроизвести в общем-то не получилось, но и SP1-CU5 нет...

Аналогичный план для Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
А на какой версии этой смены плана не происходит?

план менятся, ошибок нет
18 мар 19, 10:47    [21835667]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
.Евгений
Member

Откуда:
Сообщений: 496
TaPaK
план менятся, ошибок нет

Я правильно понял, что у вас при объединении 65 экземпляров таблицы и указании хинта OPTION (MERGE UNION) создается план с конкатенациями, но ошибки "Query processor could not produce..." не происходит?
18 мар 19, 10:56    [21835678]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
.Евгений
TaPaK
план менятся, ошибок нет

Я правильно понял, что у вас при объединении 65 экземпляров таблицы и указании хинта OPTION (MERGE UNION) создается план с конкатенациями, но ошибки "Query processor could not produce..." не происходит?

соврал на 65 падает
18 мар 19, 11:05    [21835685]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
.Евгений
Member

Откуда:
Сообщений: 496
В общем, если кто-то найдет ссылку на документацию, описывающую поведение сервера в данной ситуации, или знает какую-то дубину (трейсфлаг и т.п.), посредством которой моих "девочек" можно насильно заставить сделать мне Merge Join 65 раз подряд - буду рад услышать. Не услышу - продолжу пользоваться воркароундами, которые сочту оптимальными в той или иной ситуации.

P.S. Небольшой комментарий на тему "зачем". У меня организован архив входящих сообщений, разбитый на отдельные таблицы (ради управляемости, согласно типу и году-месяцу). Иногда эти сообщения нужно перечитать (и перезагрузить их содержимое в ХД) в порядке возрастания идентификатора. Шесть типов за год - вот мне и каприз.
18 мар 19, 11:33    [21835718]     Ответить | Цитировать Сообщить модератору
 Re: Merge Join (Concatenation)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7651
.Евгений,

если память не изменяет, стратегия слияния выбирается оптимизатором при наличии потребности или возможности обработки сортированных списков. Если появляется черная овца, то такая стратегия не может быть использована даже насильственным путём.
18 мар 19, 13:13    [21835869]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить