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

Откуда:
Сообщений: 189
По отдельности запросы выполняются моментально, а при объединении тормозят.
Типа каждый запрос меньше секунды, а ч-з UNION ALL - 34 секунды выполняется.
У кого-то такое бывало?

Microsoft SQL Server 2008 (SP3) - 10.0.5538.0 (X64) Apr 3 2015 14:50:02 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.0 <X64> (Build 6003: Service Pack 2)
25 апр 19, 12:06    [21871452]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
если даже написать

select ''
UNION ALL
--2 запрос
select FIO
from ...


время выполнения 33 секунды ((
25 апр 19, 12:35    [21871499]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36692
Разные запросы могут иметь разный план и разное время выполнения, это нормально.
25 апр 19, 12:41    [21871515]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5162
mnbvcx,

планы выполнения надо смотреть
+
у вас не совсем последний сервис-пак
есть другой сервер под рукой попробовать?

почитайте
https://sqlperformance.com/2017/05/sql-plan/union-all-optimization
25 апр 19, 12:46    [21871527]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
Что я сделал не так, если при одиночном запросе такая статистика

Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

(затронуто строк: 2)
Таблица "Worktable". Число просмотров 3835, логических чтений 39751, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Documents". Число просмотров 4, логических чтений 422, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refDocumentTypes". Число просмотров 2, логических чтений 53, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Codes". Число просмотров 1, логических чтений 12, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Clients". Число просмотров 5, логических чтений 761, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refClientTypes". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refPersonTypes". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refSex". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refClientStatusTypes". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refLegalFormTypes". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Address". Число просмотров 3, логических чтений 843, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Contracts". Число просмотров 0, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Время работы SQL Server:
Время ЦП = 171 мс, затраченное время = 171 мс.

А если добавить к нему выше select '' UNION ALL, то какой-то ад наступает

Время синтаксического анализа и компиляции SQL Server:
время ЦП = 383 мс, истекшее время = 383 мс.

(затронуто строк: 3)
Таблица "Worktable". Число просмотров 2211639, логических чтений 16717829, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refDocumentTypes". Число просмотров 1, логических чтений 1269, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Clients". Число просмотров 579, логических чтений 130750, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Documents". Число просмотров 4, логических чтений 1614, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Codes". Число просмотров 1418, логических чтений 17497, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refClientTypes". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refPersonTypes". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refSex". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refClientStatusTypes". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "refLegalFormTypes". Число просмотров 1, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Address". Число просмотров 3, логических чтений 843, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Contracts". Число просмотров 0, логических чтений 2, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Время работы SQL Server:
Время ЦП = 30795 мс, затраченное время = 31547 мс.
25 апр 19, 12:55    [21871547]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36692
Содержимое планов запросов не раскрыто.
25 апр 19, 12:57    [21871550]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
Гавриленко Сергей Алексеевич
Содержимое планов запросов не раскрыто.

Как файл *.sqlplan приложить?
25 апр 19, 13:02    [21871560]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5162
mnbvcx
Что я сделал не так...

планы разные строятся - видно даже по списку таблиц
25 апр 19, 13:03    [21871563]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
mnbvcx,

Попробуйте JOIN-om
25 апр 19, 13:21    [21871590]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
mnbvcx,

вот ради интереса - как повлияет, если после запроса поставить
option (NO_PERFORMANCE_SPOOL, recompile)
или
option (NO_PERFORMANCE_SPOOL)

вроде бы разницы в последствиях не должно быть, но...

у меня примерно такие же непонятности были недавно
https://www.sql.ru/forum/1311749/mozhno-li-optimizatoru-predpisat-sdelat-vremennuu-tablicu

еще запросто один запрос выполняется быстрее параллельно, а второй - непараллельно
но объединенный запрос сервер крутит весь или так или так
тоже может влиять по идее, хотя у меня влияние было несущественное вроде бы, а роляла появляющаяся буферизация
25 апр 19, 14:20    [21871669]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
Причем если вместо селекта из view вставить его определение, то Union ALL отрабатывает моментально
25 апр 19, 14:33    [21871691]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
982183
Member

Откуда: VL
Сообщений: 3350
А попробуй поменять селекты местами.
25 апр 19, 14:40    [21871711]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
982183
А попробуй поменять селекты местами.

Те же 34 секунды(
25 апр 19, 14:46    [21871718]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
NO_PERFORMANCE_SPOOL для 17ого сервера, сорри
25 апр 19, 14:50    [21871726]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
Капец, на 2012-м запрос на той же бд отработал за меньше секунды (((

Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) Aug 15 2017 10:23:29 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )
25 апр 19, 15:07    [21871753]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5162
Гавриленко Сергей Алексеевич
Содержимое планов запросов не раскрыто.

и не будет, похоже
25 апр 19, 15:11    [21871761]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
komrad
Гавриленко Сергей Алексеевич
Содержимое планов запросов не раскрыто.

и не будет, похоже

Пока, по совету камрада komrad, рассчитываю на магию последнего сервис-пака.
Может завтра случится.
Вы же видели, что на 2012 всё ок.
mnbvcx
на 2012-м тот же запрос на той же бд отработал за меньше секунды.

Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) Aug 15 2017 10:23:29 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )
25 апр 19, 21:38    [21872069]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
mnbvcx
Member

Откуда:
Сообщений: 189
mnbvcx, сегодня после SP4 стало хуже, Время ЦП = 52838 мс, затраченное время = 53966 мс.

В аттачменте 2 плана в архиве.

К сообщению приложен файл (plans.zip - 112Kb) cкачать
26 апр 19, 11:16    [21872370]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3459
mnbvcx
mnbvcx, сегодня после SP4 стало хуже, Время ЦП = 52838 мс, затраченное время = 53966 мс.

В аттачменте 2 плана в архиве.


апдейтните статистику
26 апр 19, 11:32    [21872393]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
aleks222
Member

Откуда:
Сообщений: 850
Ролг Хупин
mnbvcx
mnbvcx, сегодня после SP4 стало хуже, Время ЦП = 52838 мс, затраченное время = 53966 мс.

В аттачменте 2 плана в архиве.


апдейтните статистику


Совет не верен.

Перепишите свой запрос "по-человечески".
Чтобы у оптимизатора не было выбора.
26 апр 19, 11:50    [21872417]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с UNION ALL  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
mnbvcx,

Само-собой планы разные.
NL для Contracts без union all выполняется с outer reference, с union all без оного.
В результате все ваши рекурсивные CTE из vwУполномоченноеЛицоЮР лопатятся по полной программе.

Честно говоря, лично мне лениво разбираться из-за чего так происходит.

Попробуйте переписать как-то так:
select ''

UNION ALL

SELECT [ФИО]
	FROM
     Clients.dbo.Contracts x cross apply
     (
      select ... from [Clients].[dbo].[vwУполномоченноеЛицоЮР]
      where
       clientid = x.clientid and
		and (([КодТипаКлиента] = 20 and ДоляУК >= 20) OR ([КодТипаКлиента] = 21 and ДоляУК >= 25) OR ([КодТипаКлиента] = 17))
     ) z
where
  x.ContractID = (1969 +10000 - 10000)  
26 апр 19, 13:01    [21872553]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить