Улучшение запроса 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