Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 UNION ALL убивает производительность?  [new]
denacid
Member

Откуда:
Сообщений: 8
Добрый день.
SQL SERVER 14.0.3162.1
Уровень совместимости БД SQL Server 2017 (140)
Запрос состоит из 2-х одинаковых частей (такой вариант выбран для быстрого воспроизведения) объединенных через UNION ALL, а сама часть состоит из полного соединения 2-х индексированных таблиц, одна из которых имеет уникальные записи (в итоге многие ко многим=false). Приблизительный вид такой:
SELECT
	1
FROM
	T1
FULL JOIN
	T2
ON
	...
WHERE
	...
UNION ALL
SELECT
	1
FROM
	T1
FULL JOIN
	T2
ON
	...
WHERE
	...


Если выполнить только одну часть, без объединения, то FULL JOIN будет выполняется через слияние, что вполне ожидаемо, но когда выполняется объединение (UNION ALL) частей, то план радикально меняется и использует в частях для FULL JOIN хеширование с выносом в tempdb.
Зачем и почему так происходит не совсем понятно, ведь созданы идеальные условия для соединения, чего ему не хватает?
PS: приложил сам текст запроса, план целиком и план одной части.

К сообщению приложен файл (UNION ALL.zip - 28Kb) cкачать
24 сен 19, 15:00    [21978024]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
denacid,

StatementOptmEarlyAbortReason="TimeOut"
24 сен 19, 15:15    [21978062]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
denacid,

Для интересу попробуйте с OPTION(QUERYTRACEON 8780)
24 сен 19, 15:16    [21978065]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
denacid
Member

Откуда:
Сообщений: 8
TaPaK
denacid,

Для интересу попробуйте с OPTION(QUERYTRACEON 8780)


Мда, план стал нормальным
24 сен 19, 15:42    [21978104]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
denacid
Member

Откуда:
Сообщений: 8
Не использую флаги есть пути обхода, чтобы такие запросы работали корректно?
24 сен 19, 15:47    [21978107]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
denacid
Не использую флаги есть пути обхода, чтобы такие запросы работали корректно?

Религия? Суеверия?
Не пишите "такие" интересные запросы что склт не способен переварить.

Прибейте merge join
24 сен 19, 15:50    [21978112]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
denacid
Member

Откуда:
Сообщений: 8
TaPaK
denacid
Не использую флаги есть пути обхода, чтобы такие запросы работали корректно?

Религия? Суеверия?
Не пишите "такие" интересные запросы что склт не способен переварить.

Прибейте merge join


Не думал что такой простой запрос будет для скуля неподъемным) пишу как 1С позволяет, была бы возможность уже давно бы merge join написал
24 сен 19, 15:55    [21978118]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
denacid
TaPaK
пропущено...

Религия? Суеверия?
Не пишите "такие" интересные запросы что склт не способен переварить.

Прибейте merge join


Не думал что такой простой запрос будет для скуля неподъемным) пишу как 1С позволяет, была бы возможность уже давно бы merge join написал

два full join? да тут один писать сто раз подумаешь
24 сен 19, 16:09    [21978145]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
denacid
Member

Откуда:
Сообщений: 8
TaPaK,

Меня FULL JOIN особо не пугает, когда для него нормально подготовлены таблицы и индексы. Переделал на LEFT JOIN - получил такой же результат.
24 сен 19, 16:18    [21978163]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
А какого-то хинта типа "выполнять unian all по очереди, в не умничать" не появилось?
24 сен 19, 16:45    [21978209]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
mnbvcx
А какого-то хинта типа "выполнять unian all по очереди, в не умничать" не появилось?

Поумничайте, как по вашему должно выглядеть "по очереди" и не при этом не как это делает engine
24 сен 19, 16:50    [21978215]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
хотя зачем мне это, живите с этим сами
24 сен 19, 16:52    [21978224]     Ответить | Цитировать Сообщить модератору
 Re: UNION ALL убивает производительность?  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
TaPaK
mnbvcx
А какого-то хинта типа "выполнять unian all по очереди, в не умничать" не появилось?

Поумничайте, как по вашему должно выглядеть "по очереди" и не при этом не как это делает engine

Я свою тему имел в виду Проблема с UNION ALL

Где есть insert into ... select union all я переписываю ч-з последовательность инсертов.
24 сен 19, 17:11    [21978254]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить