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

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

SELECT     Day_181, data, ArticleID,
                          (SELECT     SUM(Amount) AS Sum_Amount
                            FROM          Sales_1C
                            WHERE      (Pereprodaja = 0) AND (date >= a.Day_181) AND (date <= a.data) AND (ArticleID = a.ArticleID)) AS КолПродано181,
                          (SELECT     COUNT(DISTINCT data) AS count_Ost
                            FROM          Ostatki_all_Table
                            WHERE      (data >= a.Day_181) AND (data <= a.data) AND (ArticleID = a.ArticleID)) AS НаОстаткеРаз181,
                          (SELECT     AVG(Ost) AS count_Ost
                            FROM          Ostatki_all_Table AS Ostatki_all_Table_2
                            WHERE      (data >= a.Day_181) AND (data <= a.data) AND (ArticleID = a.ArticleID)) AS СреднийОстаток181,
                          (SELECT     SUM(Amount) AS Sum_Amount
                            FROM          Sales_1C AS Sales_1C_1
                            WHERE      (Pereprodaja = 0) AND (date >= a.Day_91) AND (date <= a.data) AND (ArticleID = a.ArticleID)) AS КолПродано91,
                          (SELECT     COUNT(DISTINCT data) AS count_Ost
                            FROM          Ostatki_all_Table AS Ostatki_all_Table_3
                            WHERE      (data >= a.Day_91) AND (data <= a.data) AND (ArticleID = a.ArticleID)) AS НаОстаткеРаз91, Expr1 AS ОстатокНаКонецМесяца
FROM         (SELECT     DATEADD(dd, - 181, dates.data) AS Day_181, DATEADD(dd, - 91, dates.data) AS Day_91, dates.data, Ostatki_all_Table_1.ArticleID, 
                                              SUM(Ostatki_all_Table_1.Ost) AS Expr1
                       FROM          dates INNER JOIN
                                              Ostatki_all_Table AS Ostatki_all_Table_1 ON dates.data = Ostatki_all_Table_1.data
                       WHERE      (dates.ПоследнийДеньМесяца = 1)
                       GROUP BY DATEADD(dd, - 181, dates.data), dates.data, Ostatki_all_Table_1.ArticleID) AS a


Выполняется достаточно долго

подскажите как его можно оптимизировать ?
6 янв 12, 12:15    [11864214]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос ?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
все подзапросы выкинь для начала...
6 янв 12, 12:24    [11864248]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос ?  [new]
Деня
Member

Откуда: Сыктывкар
Сообщений: 130
Ivan Durak,
данные по подзапросам нужны
поэтому нельзя этого сделать
6 янв 12, 12:32    [11864291]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Деня
данные по подзапросам нужны

И что же такого нужного они считают ? Нарастающие итоги ?
6 янв 12, 12:38    [11864304]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос ?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Деня
Ivan Durak,
данные по подзапросам нужны
поэтому нельзя этого сделать

выкинуть - значит переписать в нормальном виде, через джоины всех таблиц
6 янв 12, 13:16    [11864421]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос ?  [new]
Деня
Member

Откуда: Сыктывкар
Сообщений: 130
Ivan Durak
Деня
Ivan Durak,
данные по подзапросам нужны
поэтому нельзя этого сделать

выкинуть - значит переписать в нормальном виде, через джоины всех таблиц


Вот я и спрашиваю - как это сделать ?

цель запроса - получить источник данных для последующей загрузки в Хранилище в котором:

на каждую дату в разрезе товара:
1. получать продажи за последние 181 день
2. получать продажи за последние 91 день
3. получать средние остатки за последние 181 день
4. получать количество дней товара, когда он был на остатке за последние 181 день
5. получать количество дней товара, когда он был на остатке за последние 91 день

в принципе я не ограничен в средствах и для достижения этой цели могу использовать и временные таблицы и процедуры и т.д.
6 янв 12, 13:33    [11864481]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Деня
1. получать продажи за последние 181 день
2. получать продажи за последние 91 день

... SUM(CASE WHEN <продажа за последние 181 день> THE END) AS КолПродано181, SUM(CASE WHEN <продажа за последние 91 день> THE END) AS КолПродано91,...
6 янв 12, 13:37    [11864499]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить