2016-08-10 6 views
-1

У меня есть таблица «Транзакция».Выберите SUM, используя SQL-подзапрос, слишком медленно

Сделка может иметь несколько «TransactionProduct».

Продукт транзакции может иметь несколько «PriceModifiers».

У меня есть запрос, который возвращает все транзакционные продукты с общим количеством модификаторов цен (сумма уменьшения).

Запрос:

SELECT 
    TRANSACTION.DESCRIPTION, 
    TRANSACTIONPRODUCT.PRODUCTNAME, 
    TRANSACTIONPRODUCT.EFFECTIVEPRICE, 
    (
     SELECT SUM(AMOUNT) 
     FROM PRICEMODIFIER 
     WHERE TRANSACTIONPRODUCTID = TRANSACTIONPRODUCT.TRANSACTIONPRODUCTID 
    ) 
    AS REDUCTIONAMOUNT 
FROM 
    TRANSACTION, 
    TRANSACTIONPRODUCT 
WHERE 
    TRANSACTION.TRANSACTIONID = TRANSACTIONPRODUCT.TRANSACTIONID 

Если удалить подзапрос с суммой, запрос очень быстро выполнить.

С подзапроса, он занимает несколько секунд ...

Любая идея, как я могу улучшить запрос?

+1

Вы можете добавить индексы. Есть ли какие-либо индексы? –

+2

Месть ужасного запроса с восьмидесятых? 1) Синтаксис JOIN 2) псевдонимы таблицы 3) FULLCAPS 4) скалярные подзапросы 5) «транзакция» - зарезервированное слово/ключевое слово; старайтесь избегать, так как имя таблицы/столбца – wildplasser

+0

включает в себя подзаголовок суммы как предложение с включением идентификатора и объединение по id вместо того, чтобы делать подзапрос для каждой строки. – SomeJavaGuy

ответ

1

Попробуйте это:

SELECT 
    T.DESCRIPTION, 
    TP.PRODUCTNAME, 
    TP.EFFECTIVEPRICE, 
    SUM(PM.AMOUNT) 
FROM 
    TRANSACTION T 
JOIN TRANSACTIONPRODUCT TP 
    ON T.TRANSACTIONID = TP.TRANSACTIONID 
JOIN PRICEMODIFIER PM 
    ON PM.TRANSACTIONPRODUCTID = TP.TRANSACTIONPRODUCTID 
GROUP BY T.DESCRIPTION, TP.PRODUCTNAME, TP.EFFECTIVEPRICE 
+0

Спасибо, он работает нормально. – user3544117

3

Вы должны научиться правильно использовать явный синтаксис JOIN. Простое правило: Никогда запятые запятые в разделе FROM. Always использование подходящий JOIN синтаксис.

Но это не имеет никакого отношения к вашей проблеме с производительностью. Для этого вам нужен индекс на PRICEMODIER(TRANSACTIONPRODUCTID, AMOUNT).

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