2013-12-25 2 views
0

Я использую SQL Anywhere в качестве моей базы данных.Улучшение запроса SQL Anywhere

У меня есть две таблицы SALES DETAIL (POSDETAIL) и таблица скорректированного инвентаря (AdjustInventory), а также создание и запрос, чтобы показать результаты продаж и потери/корректировки.

Вывод должен быть, как это

Product SalesQty Value WastageQty Value 
------------------------------------------------ 

продаж Кол-во будет поступать из POSDETAILWastageQty стола и выйдет из AdjustInventory

POSDETAIL имеет общие 435625 записей и AdjustInventory имеет 183528 Всего записей.

Я разработал нижеследующий запрос, который дает мне идеальное решение по мере необходимости, но проблема заключается в том, что запрос очень медленный, для отображения любых конкретных данных в любом диапазоне дат требуется почти 10-15 минут.

Этот запрос необходим. Оптимизация и настройка здесь - это запрос.

select  
    p.OrderDate, p.ProductId, p.SalesQty, 
    f.WastedQty/p.SalesQty as WastedQty, 
    p.NetCost, p.EachCost 
from 
    (select 
     POSDETAIL.PRODNUM as ProductId, 
     DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate, 
     POSDETAIL.NETCOSTEACH as NetCost,POSDETAIL.COSTEACH as EachCost, 
     SUM(POSDETAIL.QUAN) as SalesQty 
    from 
     DBA.POSDETAIL 
    group by 
     POSDETAIL.PRODNUM, POSDETAIL.NETCOSTEACH, POSDETAIL.COSTEACH, 
     DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') 
) as p (ProductId, OrderDate, NetCost, EachCost, SalesQty) 
left outer join 
    (select 
     DBA.AdjustInventory.INVENNUM as ProductId, 
     DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate, 
     SUM(AdjustInventory.ADJUSTUNITS) as WastedQty 
    from 
     DBA.POSDETAIL 
    join 
     DBA.AdjustInventory on DBA.POSDETAIL.PRODNUM = DBA.AdjustInventory.INVENNUM 
          and DBA.AdjustInventory.AdjustType = 9 
          and DATEFORMAT(DBA.AdjustInventory.AdjustTime,'yyyy/mm/dd') = DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') 
    group by 
     DBA.AdjustInventory.INVENNUM, DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') 
    ) as f(ProductId, OrderDate, WastedQty) on p.ProductId = f.ProductId and p.OrderDate = f.OrderDate; 

Пожалуйста, помогите

ответ

0

OK вот ваша проблема потенциально. Никогда не группируйте по вложенному элементу. 1. Вытяните выделение, сделайте его временной таблицей.
2. Индексировать таблицу темп 3. Присоединить временную таблицу к внешнему запросу.

Вы должны быть в состоянии сделать это дважды здесь, и это должно действительно помочь.

+0

Не могли бы вы, пожалуйста, дайте мне пример того, как сделать это в приведенном выше запросе? Я хочу сделать это в запросе и не хочу писать процедуру хранения. – Jim

+0

Спасибо, что помогли, и запрос улучшился, и теперь он составляет около 30 секунд. – Jim

0
not 100% sure of syntax for SQL 

select 
     POSDETAIL.PRODNUM as ProductId, 
     DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate, 
     POSDETAIL.NETCOSTEACH as NetCost,POSDETAIL.COSTEACH as EachCost, 
     SUM(POSDETAIL.QUAN) as SalesQty 
    from 
     DBA.POSDETAIL 
    into #P 
    group by 
     POSDETAIL.PRODNUM, POSDETAIL.NETCOSTEACH, POSDETAIL.COSTEACH, 
     DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') 

select 
     DBA.AdjustInventory.INVENNUM as ProductId, 
     DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate, 
     SUM(AdjustInventory.ADJUSTUNITS) as WastedQty 
    from 
     DBA.POSDETAIL 
    Into #F 
    join 
     DBA.AdjustInventory on DBA.POSDETAIL.PRODNUM = DBA.AdjustInventory.INVENNUM 
          and DBA.AdjustInventory.AdjustType = 9 
          and DATEFORMAT(DBA.AdjustInventory.AdjustTime,'yyyy/mm/dd') = DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') 
    group by 
     DBA.AdjustInventory.INVENNUM, DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') 




select  
    p.OrderDate, p.ProductId, p.SalesQty, 
    f.WastedQty/p.SalesQty as WastedQty, 
    p.NetCost, p.EachCost 
from #p (ProductId, OrderDate, NetCost, EachCost, SalesQty) 
Left outer Join #f 
    on p.ProductId = f.ProductId and p.OrderDate = f.OrderDate; 

Ее было около 16 лет, так как я использовал SQL Anywhere, так жаль, что psudeo код

+0

Вы можете попробовать одну временную таблицу за раз. Все, что мы делаем, - это перемещение вложенного выбора в таблицу temp. Это заставит план выполнения работать так, как я считаю, быстрее. –

+1

Спасибо, что помогли, и запрос улучшился, и теперь это около 30 секунд. – Jim

+0

Вы можете попробовать поместить индекс в свои временные таблицы. В частности, поля в предложении ON. Это может помочь дальше. Кстати, что вы написали в первую очередь, должно быть хорошо. Это просто проблема с тем, что когда-либо создает план выполнения. –

Смежные вопросы