Оптимизация SQL - расчет продаж за текущий месяц менеджером по работе с клиентами - PullRequest
0 голосов
/ 07 февраля 2019

Я написал следующий запрос, но он работает невероятно медленно.Может кто-нибудь предложить, как я могу улучшить это или даже подтолкнуть меня в правильном направлении?

Моя цель состоит в том, чтобы составить список продаж и затрат для каждой территории продаж в текущем месяце (в основном это менеджер аккаунта)

ИТ содержит строки заказа

IH содержит заказзаголовки (включая территорию продаж)

SELECT it.ih_terrtry                          AS terr, 
       Sum(it.it_exvat) / 100                 AS orderTotal, 
       Sum(it.it_cost * it.it_qtydelv) / 1000 AS orderCost 
FROM   (SELECT it.*, 
               iH.ih_terrtry 
        FROM   l_itran it 
               LEFT OUTER JOIN l_ihead ih 
                            ON ih.ih_doc = it.it_doc 
        WHERE  it.it_status = 'X' 
               AND Month(it_dtedelv) = Month(Datetime()) 
               AND Year(it_dtedelv) = Year(Datetime())) it 
GROUP  BY terr 

1 Ответ

0 голосов
/ 07 февраля 2019

Не вдаваясь в составной индекс нескольких полей в VFP, я бы посоветовал как минимум, ваша таблица l_itran имеет индекс только для поля it_dtedelv.Может быть составным, но это выглядит как составная строка и dtot () для процессов дат и других полей.

Далее, VFP не может оптимизировать запрос по датам, если вы запускаете функцию в другой месяц /части года.Вместо этого создайте две переменные, которые попадают в начало текущего месяца, а затем в начало следующего месяца.Например: 1 февраля 2019 года и 1 марта 2019 года. Таким образом, вы можете получить все БОЛЬШЕ ИЛИ РАВНО до 1 февраля, но МЕНЬШЕ, чем 1 марта, что включает последний день февраля до 23:59:59, если в поле даты указановключает в себя время.

Кроме того, вам не нужно вкладывать запросы, запрашивая все записи, а затем суммируя результаты.Это должно быть выполнимо в течение одного, как я имею ниже.Последнее замечание / вопрос к вам.Почему у вас есть левое соединение с таблицей заголовков для транзакций.Я думаю, что ВСЕГДА должен быть заголовок, но это только я.

fromDate = TTOD( DATETIME()) - DAY( DATETIME()) + 1
toDate = GOMONTH(x,1)

SELECT ;
        iH.ih_terrtry Terr,;
        Sum(it.it_exvat) / 100 AS orderTotal, ;
        Sum(it.it_cost * it.it_qtydelv) / 1000 AS orderCost;
    FROM;
        l_itran it ;
            LEFT OUTER JOIN l_ihead ih ;
                ON it.it_doc = ih.ih_doc ;
    WHERE;
            it.it_dtedelv >= fromDate;
        AND it.it_dtedelv < toDate ;
        AND it.it_status = 'X' ;
    GROUP  BY ;
        iH.ih_terrtry
...