Улучшение запроса SQL Anywhere

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

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

Вывод должен быть таким

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

Продажи Кол-во придет POSDETAIL стол и WastageQty придет из 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;

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам