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

Откуда:
Сообщений: 13
Помогите оптимизировать запрос!
Есть 2 вьюхи одинаковые, но с разным условием по дате (TODATE). Вьюхи называются TOMORROWRETAILPRICE_LMA_TEST и TODAYRETAILPRICE_LMA_TEST. Пример одной вьюхи ниже.
Таблица RETAILPRICESTRANS_LMA_TEST 35 млн строк единственная более-менее большая (6ГБ) в этом запросе.

идея такая: нужно вычислять дельту изменений между 2 вьюхами за определенную дату вот таким запросом (см. ниже).
План запроса во вложении. Как видно, основное время тратится на сортировки, но я не знаю как по другому переписать запрос.

SELECT * FROM
( SELECT
A.[RetailStoreRecId],
A.STORENUMBER,
A.ProductNumber,
A.ProductRecId,
isnull(A.[RetailPrice],0) AS PRICE,
isnull(B.[RetailPrice],0) AS PRICE2,
isnull(A.[OK],0) AS OK,
isnull(B.[OK],0) AS OK2,
A.CAMPAIGNID, B.CAMPAIGNID AS CAMPAIGNID2,
IIF(A.[CAMPAIGNID] <> '',1,0) AS FIXPRICE
FROM dbo.[TOMORROWRETAILPRICE_LMA_TEST] AS A
inner join RETAILSTORETABLE_LMA st on st.RETAILSTORETABLE = A.[RetailStoreRecId] AND st.ISACTIVE = 1
LEFT OUTER JOIN [TODAYRETAILPRICE_LMA_TEST] AS B ON A.ProductNumber = B.ProductNumber AND A.RetailStoreRecId = B.RetailStoreRecId ) as C
WHERE (C.PRICE <> C.PRICE2 OR C.OK <> C.OK2) ORDER BY C.[RetailStoreRecId]

код вьюхи. Другая точно такая же, но с другим условием по дате.

SELECT    Store.recId AS RetailStoreRecId, Store.STORENUMBER AS STORENUMBER, Product.DISPLAYPRODUCTNUMBER AS ProductNumber, Product.recid AS ProductRecId,

CAST
                             ((SELECT  TOP 1   TR.PRICE AS Expr1 
                                 FROM            dbo.[RETAILPRICESTRANS_LMA_TEST] AS TR 
                                 WHERE			(TR.PARTITION = 5637144576) AND
												(TR.ENABLED = 1) AND 
												(TR.CHANNEL = Store.RECID) AND 
												(TR.PRODUCT = Product.recId) AND
												(TR.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE()))) AND
												(TR.TODATE	>= DATEADD(day, 1, convert(date, GETDATE())))
												ORDER BY TR.PRIORITY ASC, TR.CREATEDDATETIMELOCK DESC ) AS money) AS RetailPrice,

CAST
                             ((SELECT        TOP 1 dbo.RETAILDISCOUNTTRANS_LMA.PRICEORPERCENT AS Expr1
                                 FROM            dbo.RETAILDISCOUNTTRANS_LMA 
                                 WHERE				dbo.RETAILDISCOUNTTRANS_LMA.PARTITION = 5637144576 AND 
													dbo.RETAILDISCOUNTTRANS_LMA.DISCOUNTSTYPE = 10 AND dbo.RETAILDISCOUNTTRANS_LMA.ENABLED = 1 AND
													dbo.RETAILDISCOUNTTRANS_LMA.product = Product.recid AND 
													dbo.RETAILDISCOUNTTRANS_LMA.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE())) AND 
													dbo.RETAILDISCOUNTTRANS_LMA.TODATE >= DATEADD(day, 1, convert(date, GETDATE())) AND 
                                                    dbo.RETAILDISCOUNTTRANS_LMA.CHANNEL = Store.RECID ORDER BY DISCOUNTID DESC) AS money) AS OK,


CAST
                             ((SELECT  TOP 1 C.CAMPAIGNID AS Expr1 
                                 FROM            dbo.[RETAILPRICESTRANS_LMA_TEST] AS TR 
								 LEFT OUTER JOIN dbo.SMMCAMPAIGNTABLE AS C ON C.PARTITION = 5637144576 AND C.DATAAREAID = 'LTG' AND C.RECID = TR.SOURCERECID
                                 WHERE			(TR.PARTITION = 5637144576) AND
												(TR.ENABLED = 1) AND 
												(TR.CHANNEL = Store.RECID) AND 
												(TR.PRODUCT = Product.recId) AND
												(TR.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE()))) AND
												(TR.TODATE	>= DATEADD(day, 1, convert(date, GETDATE())))
												ORDER BY TR.PRIORITY ASC, TR.CREATEDDATETIMELOCK DESC ) AS varchar) AS CampaignId


FROM            dbo.RETAILCHANNELTABLE AS Store 

CROSS JOIN dbo.ECORESPRODUCT AS Product 
GROUP BY Store.recId, Store.STORENUMBER, Product.DISPLAYPRODUCTNUMBER, Product.recId 
27 июн 16, 10:26    [19338809]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
Igor Sa
Member

Откуда:
Сообщений: 13
Общий план запроса
https://cloud.mail.ru/public/G8pT/U2MXbynAR
27 июн 16, 10:29    [19338824]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
При таких запросах вы обречены на Nested Loops в планах выполнения, со всеми вытекающими.
Можете попробовать уменьшить объем обрабатываемых данных, создав индексы:
RETAILPRICESTRANS_LMA_TEST (CHANNEL, PRODUCT, PARTITION, ENABLED, FROMDATE) include (TODATE, PRIORITY, CREATEDDATETIMELOCK, PRICE)
RETAILPRICESTRANS_LMA (CHANNEL, PRODUCT, PARTITION, ENABLED, DISCOUNTSTYPE, FROMDATE) include (TODATE, PRICEORPERCENT, DISCOUNT)
SMMCAMPAIGNTABLE (RECID, PARTITION, DATAAREAID) include (CAMPAIGNID)
27 июн 16, 12:11    [19339414]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
aleks2
Guest
Осподе милосердный! Избави нас от ...!

1. Тредстартеру следует переквалифицироваться в управдомы.
2. Перестать совать left join и cross join во все дырки, для того не предназначенные. А паче фсего под группировку.
3. Разучить таки, cross apply
3. Научиться, таки, пользоваться временными таблицами.
27 июн 16, 13:07    [19339714]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
Igor Sa
Member

Откуда:
Сообщений: 13
Cross необходим. Там нужно именно декартово произведение по огромной выборке.
Размер выборки уменьшается датой. в условии между 2 вьюхами.
Именно поэтому я не могу использовать темп таблицы - результат выполнения одной вьюхи слишком огромен.

Индексы примерно такие создавал, но SQL их не подхватывает, а тупо идет по кластерному.
Он считает, что по кластерному лучше. Возможно потому, что там большая таблица узкая и в запросе участвуют чуть ли не все поля большой таблицы.

Есть у кого идеи как снизить нагрузку на сортировку? В плане эта сортировка, как видно, сжирает основное время.
28 июн 16, 06:47    [19343068]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Igor Sa,

мега-запросы лучше выполнять по предварительно созданным денормализованным данным. Данные можно собирать раз в сутки, например.
28 июн 16, 12:55    [19344762]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
aleks2
Guest
Igor Sa
Cross необходим. Там нужно именно декартово произведение по огромной выборке.
Размер выборки уменьшается датой. в условии между 2 вьюхами.
Именно поэтому я не могу использовать темп таблицы - результат выполнения одной вьюхи слишком огромен.

Индексы примерно такие создавал, но SQL их не подхватывает, а тупо идет по кластерному.
Он считает, что по кластерному лучше. Возможно потому, что там большая таблица узкая и в запросе участвуют чуть ли не все поля большой таблицы.

Есть у кого идеи как снизить нагрузку на сортировку? В плане эта сортировка, как видно, сжирает основное время.


Кому необходим? Говнокодеру?
Сначала размножим - потом сгруппируем.

ЗЫ. Учись писать запросы.
28 июн 16, 15:59    [19346246]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
i-i
Guest
aleks2, уважаемый, не вываливай свои личные проблемы на форум, не все хотят читать желчные излияния онаниста
28 июн 16, 17:13    [19346723]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
i-i
Guest
последнее слово следует читать как "онанима"
28 июн 16, 17:15    [19346731]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
o-o
Guest
i-i
последнее слово следует читать как "онанима"

но это тоже некое однокоренное слово с онанистом, да?
28 июн 16, 17:18    [19346763]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
o-o
Guest
предлагаю нейтральное слово, "пудилист"
оно объединяет в себе множество слов,
вызывающих трудности орфографии,
а заодно и множество их проверочных слов
28 июн 16, 17:23    [19346800]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
i-i
Guest
виноват, "анонимного пользователя"

ТСу - а вы укажите оптимизатиру чтобы он исползовал новые индексы with (index = yourindexname), иногда помогает
28 июн 16, 17:30    [19346846]     Ответить | Цитировать Сообщить модератору
 Re: оптимизировать запрос помогите PLZ!  [new]
aleks2
Guest
i-i
виноват, "анонимного пользователя"

ТСу - а вы укажите оптимизатиру чтобы он исползовал новые индексы with (index = yourindexname), иногда помогает


Заслышав бубен - запляшут духи...

PS. Я, канешно не знаю чего там у тредстартера напихано в
dbo.RETAILCHANNELTABLE и dbo.ECORESPRODUCT

НО! если допустить, что

FROM            dbo.RETAILCHANNELTABLE AS Store 
CROSS JOIN dbo.ECORESPRODUCT AS Product 
GROUP BY Store.recId, Store.STORENUMBER, Product.DISPLAYPRODUCTNUMBER, Product.recId 


имеет смысл, то даже вот так

FROM  ( select distinct recId, STORENUMBER from dbo.RETAILCHANNELTABLE ) AS Store 
CROSS JOIN ( select distinct DISPLAYPRODUCTNUMBER, recId from dbo.ECORESPRODUCT ) AS Product 

будет гораздо эффективнее.
Хотя меня сильно смущают recId...
28 июн 16, 18:16    [19347069]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить