powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Merge Join (Concatenation)
11 сообщений из 11, страница 1 из 1
Merge Join (Concatenation)
    #39787448
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги.

Недавно в ходе раздачи указаний подвластным мне серверам MS SQL я наткнулся на каприз с их стороны. Приведу скрипт, воспроизводящий ситуацию:
Код: sql
1.
2.
3.
4.
5.
6.
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 таблицы в запросе, отвечает мне: "Я девочка. Я не хочу ничего решатьоптимизировать. Я хочу платьеконкатинировать." Я поискал их, но не нашел, если кто-то знает их, то прошу сообщить мне.
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787479
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лютый бред какой-то. Зачем 64 раза селектить пустую таблицу в одном запросе? А не пустую?
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787551
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичЛютый бред какой-то. Зачем 64 раза селектить пустую таблицу в одном запросе? А не пустую?
Вы прямо как наш родной МИД. Пожалуйста, читайте внимательнее написанное мной.

Вы спрашиваете, зачем селектить пустую таблицу? Потому что "скрипт, воспроизводящий ситуацию". Зачем мне создавать 64 таблицы, если на одной происходит то же самое? Более того, я единственное поле оставил по той же причине. И с пустотой та же петрушка - я прямо указал, что происходит на моих реальных данных.
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787578
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

Нашинкуйте на фрагменты:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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);
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787582
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

Воспроизвести в общем-то не получилось, но и SP1-CU5 нет...
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787593
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmНашинкуйте на фрагменты:
Это воркароунд, были мысли о нем, но не счел оптимальным. Ибо запрос создается динамически (для разных таблиц), и в таких ситуациях я всячески избегаю делать навороты в генерируемом содержимом.
TaPaK.Евгений,
Воспроизвести в общем-то не получилось, но и SP1-CU5 нет...
Аналогичный план для Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
А на какой версии этой смены плана не происходит?
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787599
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийinvmНашинкуйте на фрагменты:
Это воркароунд, были мысли о нем, но не счел оптимальным. Ибо запрос создается динамически (для разных таблиц), и в таких ситуациях я всячески избегаю делать навороты в генерируемом содержимом.
TaPaK.Евгений,
Воспроизвести в общем-то не получилось, но и SP1-CU5 нет...
Аналогичный план для Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
А на какой версии этой смены плана не происходит?
план менятся, ошибок нет
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787606
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKплан менятся, ошибок нет
Я правильно понял, что у вас при объединении 65 экземпляров таблицы и указании хинта OPTION (MERGE UNION) создается план с конкатенациями, но ошибки "Query processor could not produce..." не происходит?
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787611
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийTaPaKплан менятся, ошибок нет
Я правильно понял, что у вас при объединении 65 экземпляров таблицы и указании хинта OPTION (MERGE UNION) создается план с конкатенациями, но ошибки "Query processor could not produce..." не происходит?
соврал на 65 падает
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787632
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, если кто-то найдет ссылку на документацию, описывающую поведение сервера в данной ситуации, или знает какую-то дубину (трейсфлаг и т.п.), посредством которой моих "девочек" можно насильно заставить сделать мне Merge Join 65 раз подряд - буду рад услышать. Не услышу - продолжу пользоваться воркароундами, которые сочту оптимальными в той или иной ситуации.

P.S. Небольшой комментарий на тему "зачем". У меня организован архив входящих сообщений, разбитый на отдельные таблицы (ради управляемости, согласно типу и году-месяцу). Иногда эти сообщения нужно перечитать (и перезагрузить их содержимое в ХД) в порядке возрастания идентификатора. Шесть типов за год - вот мне и каприз.
...
Рейтинг: 0 / 0
Merge Join (Concatenation)
    #39787732
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

если память не изменяет, стратегия слияния выбирается оптимизатором при наличии потребности или возможности обработки сортированных списков. Если появляется черная овца, то такая стратегия не может быть использована даже насильственным путём.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Merge Join (Concatenation)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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