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

Откуда:
Сообщений: 135
Добрый день, возникла необходимость ускорить следующий запрос:

SELECT ST.Code AS Code, 1 as noOrder, T0.DocNum, OC.Name as Recipient , T0.UserSign2, T0.UpdateDate, T0.Comments , T0.U_InterText , '1' as Dscription , T0.DocEntry, T0.U_TITLE,T0.DocDate,T0.U_RelProjMngr, T0.U_ProjNum, T0.U_RelReqNo, T0.CardCode, T0.CardName, ST.Name, T0.DocTotal - T0.VatSum as Total,T2.DocTotal-T2.PaidToDate AS OpenCash, ((T0.DocTotal - T0.VatSum) + T0.DiscSum) as PriceBefDi, T0.DiscSum as INMPrice,(T0.DocTotal - T0.VatSum) as DocTotal, T0.DiscPrcnt, dbo.SumTotalByCode(ST.Code) as CategorySum , '0' AS TotalSum, dbo.getRelatedUsrName(T0.UserSign2) AS UsrName
FROM OQUT T0 INNER JOIN dbo.[@TOD_STATUS] ST ON T0.U_Status = ST.Code
LEFT JOIN ORDR T2 ON T0.DocEntry = T2.DocEntry AND T2.CANCELED='N'
LEFT JOIN OCPR OC ON T0.CntctCode = OC.CntctCode
WHERE T0.Canceled= 'N' AND ST.Code != '05' AND ST.Code != '06' AND ST.Code != '04' AND ST.Code != '03'

UNION ALL

SELECT M2.*
FROM (
SELECT TOP 100 ST.Code AS Code, 1 as noOrder, T0.DocNum, OC.Name as Recipient, T0.UserSign2, T0.UpdateDate, T0.Comments , T0.U_InterText , '1' as Dscription, T0.DocEntry, T0.U_TITLE,T0.DocDate,T0.U_RelProjMngr, T0.U_ProjNum, T0.U_RelReqNo, T0.CardCode, T0.CardName, N'бецт мма джорд' AS Name, T0.DocTotal - T0.VatSum as Total,T2.DocTotal-T2.PaidToDate AS OpenCash, ((T0.DocTotal - T0.VatSum) + T0.DiscSum) as PriceBefDi, T0.DiscSum as INMPrice,(T0.DocTotal - T0.VatSum) as DocTotal, T0.DiscPrcnt, dbo.SumTotalByCode05noOrder(ST.Code) as CategorySum , '0' AS TotalSum, dbo.getRelatedUsrName(T0.UserSign2) AS UsrName
FROM OQUT T0 INNER JOIN dbo.[@TOD_STATUS] ST ON T0.U_Status = ST.Code
LEFT JOIN ORDR T2 ON T0.DocEntry = T2.DocEntry AND T2.CANCELED='N'
LEFT JOIN OCPR OC ON T0.CntctCode = OC.CntctCode
LEFT JOIN OINV T4 ON T0.U_Ref = T4.U_Ref
WHERE T0.DocStatus != 'C' AND T0.Canceled= 'N' AND ST.Code = '05' AND T4.DocNum IS NULL

order by DocDate DESC
) M2

UNION ALL
Добрый день, возникла необходимость ускорить следующий запрос:

SELECT M3.*
FROM (
SELECT TOP 100 ST.Code AS Code, 1 as noOrder, T0.DocNum, OC.Name as Recipient, T0.UserSign2, T0.UpdateDate, T0.Comments , T0.U_InterText , '1' as Dscription, T0.DocEntry, T0.U_TITLE,T0.DocDate,T0.U_RelProjMngr, T0.U_ProjNum, T0.U_RelReqNo, T0.CardCode, T0.CardName, ST.Name, T0.DocTotal - T0.VatSum as Total,T2.DocTotal-T2.PaidToDate AS OpenCash, ((T0.DocTotal - T0.VatSum) + T0.DiscSum) as PriceBefDi, T0.DiscSum as INMPrice,(T0.DocTotal - T0.VatSum) as DocTotal, T0.DiscPrcnt, dbo.SumTotalByCode06canceled(ST.Code) as CategorySum , '0' AS TotalSum, dbo.getRelatedUsrName(T0.UserSign2) AS UsrName
FROM OQUT T0 INNER JOIN dbo.[@TOD_STATUS] ST ON T0.U_Status = ST.Code
LEFT JOIN ORDR T2 ON T0.DocEntry = T2.DocEntry AND T2.CANCELED='N'
LEFT JOIN OCPR OC ON T0.CntctCode = OC.CntctCode
WHERE T0.Canceled= 'N' AND ST.Code = '06'

order by DocDate DESC
) M3
UNION ALL
... еще несколько подобных UNION ALL

Для полей где вычислется разница сделал вычисляемые поля. Но как быть с фунциями вида "SumTotal...", чтобы избавится от вычислений для каждой записи не знаю. Как можно изменить данный запрос, чтобы повысить скорость запроса?
26 фев 15, 11:53    [17314581]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4896
Вы хоть запросы оформили бы тегом, чтобы люди глаза не ломали.

ильдар4
Добрый день, возникла необходимость ускорить следующий запрос:

SELECT ST.Code AS Code, 1 as noOrder, T0.DocNum, OC.Name as Recipient , T0.UserSign2, T0.UpdateDate, T0.Comments , T0.U_InterText , '1' as Dscription , T0.DocEntry, T0.U_TITLE,T0.DocDate,T0.U_RelProjMngr, T0.U_ProjNum, T0.U_RelReqNo, T0.CardCode, T0.CardName, ST.Name, T0.DocTotal - T0.VatSum as Total,T2.DocTotal-T2.PaidToDate AS OpenCash, ((T0.DocTotal - T0.VatSum) + T0.DiscSum) as PriceBefDi, T0.DiscSum as INMPrice,(T0.DocTotal - T0.VatSum) as DocTotal, T0.DiscPrcnt, dbo.SumTotalByCode(ST.Code) as CategorySum , '0' AS TotalSum, dbo.getRelatedUsrName(T0.UserSign2) AS UsrName
FROM OQUT T0 INNER JOIN dbo.[@TOD_STATUS] ST ON T0.U_Status = ST.Code
LEFT JOIN ORDR T2 ON T0.DocEntry = T2.DocEntry AND T2.CANCELED='N' 
LEFT JOIN OCPR OC ON T0.CntctCode = OC.CntctCode 
WHERE T0.Canceled= 'N' AND ST.Code != '05' AND ST.Code != '06' AND ST.Code != '04' AND ST.Code != '03'

UNION ALL

SELECT M2.* 
FROM ( 
SELECT TOP 100 ST.Code AS Code, 1 as noOrder, T0.DocNum, OC.Name as Recipient, T0.UserSign2, T0.UpdateDate, T0.Comments , T0.U_InterText , '1' as Dscription, T0.DocEntry, T0.U_TITLE,T0.DocDate,T0.U_RelProjMngr, T0.U_ProjNum, T0.U_RelReqNo, T0.CardCode, T0.CardName, N'бецт мма джорд' AS Name, T0.DocTotal - T0.VatSum as Total,T2.DocTotal-T2.PaidToDate AS OpenCash, ((T0.DocTotal - T0.VatSum) + T0.DiscSum) as PriceBefDi, T0.DiscSum as INMPrice,(T0.DocTotal - T0.VatSum) as DocTotal, T0.DiscPrcnt, dbo.SumTotalByCode05noOrder(ST.Code) as CategorySum , '0' AS TotalSum, dbo.getRelatedUsrName(T0.UserSign2) AS UsrName
FROM OQUT T0 INNER JOIN dbo.[@TOD_STATUS] ST ON T0.U_Status = ST.Code 
LEFT JOIN ORDR T2 ON T0.DocEntry = T2.DocEntry AND T2.CANCELED='N' 
LEFT JOIN OCPR OC ON T0.CntctCode = OC.CntctCode 
LEFT JOIN OINV T4 ON T0.U_Ref = T4.U_Ref 
WHERE T0.DocStatus != 'C' AND T0.Canceled= 'N' AND ST.Code = '05' AND T4.DocNum IS NULL 

order by DocDate DESC 
) M2 

UNION ALL 
Добрый день, возникла необходимость ускорить следующий запрос:

SELECT M3.* 
FROM ( 
SELECT TOP 100 ST.Code AS Code, 1 as noOrder, T0.DocNum, OC.Name as Recipient, T0.UserSign2, T0.UpdateDate, T0.Comments , T0.U_InterText , '1' as Dscription, T0.DocEntry, T0.U_TITLE,T0.DocDate,T0.U_RelProjMngr, T0.U_ProjNum, T0.U_RelReqNo, T0.CardCode, T0.CardName, ST.Name, T0.DocTotal - T0.VatSum as Total,T2.DocTotal-T2.PaidToDate AS OpenCash, ((T0.DocTotal - T0.VatSum) + T0.DiscSum) as PriceBefDi, T0.DiscSum as INMPrice,(T0.DocTotal - T0.VatSum) as DocTotal, T0.DiscPrcnt, dbo.SumTotalByCode06canceled(ST.Code) as CategorySum , '0' AS TotalSum, dbo.getRelatedUsrName(T0.UserSign2) AS UsrName
FROM OQUT T0 INNER JOIN dbo.[@TOD_STATUS] ST ON T0.U_Status = ST.Code 
LEFT JOIN ORDR T2 ON T0.DocEntry = T2.DocEntry AND T2.CANCELED='N' 
LEFT JOIN OCPR OC ON T0.CntctCode = OC.CntctCode 
WHERE T0.Canceled= 'N' AND ST.Code = '06' 

order by DocDate DESC 
) M3 
UNION ALL 

... еще несколько подобных UNION ALL

Для полей где вычислется разница сделал вычисляемые поля. Но как быть с фунциями вида "SumTotal...", чтобы избавится от вычислений для каждой записи не знаю. Как можно изменить данный запрос, чтобы повысить скорость запроса?
26 фев 15, 11:55    [17314594]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Как странно таблица называется - dbo.[@TOD_STATUS]
Зачем там @ ?
26 фев 15, 11:59    [17314614]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4896
Надо пробовать разные варианты

Попробуйте выделить вот это в отдельный запрос или подзапрос, а уже после него приджойнивать доп таблицы соответствующие разным UNION ALL.

FROM OQUT T0 INNER JOIN dbo.[@TOD_STATUS] ST ON T0.U_Status = ST.Code
LEFT JOIN ORDR T2 ON T0.DocEntry = T2.DocEntry AND T2.CANCELED='N' 
LEFT JOIN OCPR OC ON T0.CntctCode = OC.CntctCode 


Затем надо индексы смотреть. Если у вас SQL 2008 или выше, то попробуйте индексы с условиями
WHERE T0.Canceled= 'N' 
и т.д. соответствующие различным частым вашего запроса.
26 фев 15, 12:01    [17314626]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
ильдар4
Member

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

Это унаследованные таблицы и запрос. Я это не создавал
26 фев 15, 12:05    [17314652]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
ильдар4
Member

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

Я думаю Вы это имели ввиду - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=141762?
26 фев 15, 12:06    [17314662]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
ильдар4
a_voronin,

Я думаю Вы это имели ввиду - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=141762?


или это

https://www.sql.ru/forum/1144498/optimizaciya-zaprosa-s-union-all-mi
26 фев 15, 12:12    [17314702]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
ильдар4
Member

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

Я отписался модератору перенести или удалить тему, но результат нет
26 фев 15, 12:14    [17314712]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
ильдар4,

Хотите реальной помощи - показывайте актуальный план запроса в формате sqlplan, а также схему таблиц и индексов.
26 фев 15, 12:18    [17314738]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса с UNION ALL-ми  [new]
ильдар4
Member

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

Я не смогу предоставить план и структуру индексов, нет доступа к актуально БД. У меня есть только структура таблиц. Если смогу достать актуальный план и структуру индексов, то предоставлю. Спасибо за советы.
26 фев 15, 12:23    [17314775]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить