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

Недавно в ходе раздачи указаний подвластным мне серверам 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
17.03.2019, 23:31
    #39787479
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Merge Join (Concatenation)
Лютый бред какой-то. Зачем 64 раза селектить пустую таблицу в одном запросе? А не пустую?
...
Рейтинг: 0 / 0
18.03.2019, 09:29
    #39787551
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Merge Join (Concatenation)
Гавриленко Сергей АлексеевичЛютый бред какой-то. Зачем 64 раза селектить пустую таблицу в одном запросе? А не пустую?
Вы прямо как наш родной МИД. Пожалуйста, читайте внимательнее написанное мной.

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

Нашинкуйте на фрагменты:
Код: 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
18.03.2019, 10:31
    #39787582
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Merge Join (Concatenation)
.Евгений,

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

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

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


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