2013-06-13 3 views
-1

Я изучаю способы оптимизации следующего запроса, который использует много подзапросов, потому что они имеют тенденцию ухудшать скорость запроса. Хотя следующий запрос работает нормально, он завершается примерно через 6 секунд, что неприемлемо. Он ищет таблицу около 500 тыс. Клиентов. Есть идеи?Оптимизация запроса, написанного несколькими подзапросами

SELECT (
(SELECT coalesce(SUM(cashout),0)- 
         ((select coalesce(sum(Buyin),0) from [Transaction] where TYPE='Credit' and CustomerID=132) 
         + (select coalesce(sum(Paid),0) from [Transaction] where TYPE='Credit' and CustomerID=132)) 


FROM [transaction] 
WHERE TYPE='Credit' 
AND CustomerID=132 
) 
------------------- 
+ 
(
(SELECT coalesce(SUM(cashout),0) 
        - (select coalesce(sum(Paid),0) from [Transaction] where TYPE='Debit' AND Cashout>buyin and CustomerID=132) 
        + (select coalesce(sum(Cashout),0)- (select coalesce(sum(PAID),0) from [Transaction] where TYPE='Debit' AND Cashout<buyin and CustomerID=132) 
          from [Transaction] where TYPE='Debit' AND Cashout<Buyin and CustomerID=132) 
        + (select coalesce(sum(Cashout),0)- (select coalesce(sum(PAID),0) from [Transaction] where TYPE='Debit' AND Cashout=buyin and CustomerID=132) 
          from [Transaction] where TYPE='Debit' AND Cashout=Buyin and CustomerID=132) 
FROM [Transaction] 
WHERE CustomerID=132 
AND TYPE='Debit' 
AND Cashout>buyin) 
) 
-------------- 
- 
(
select coalesce(sum(Paid),0) 
from [Transaction] 
where type='Debit Settlement' 
AND CustomerID =132 
) 
-------------- 
+ 
(
select coalesce(sum(Paid),0) 
from [Transaction] 
where type='Credit Settlement' 
AND CustomerID =132 
) 
); 
+1

Вы, вероятно, можете объединить все их в один основной запрос и избавиться от подзапросов с, например, 'SELECT SUM (CASE WHEN типа =«Кредитное Урегулирование»И CustomerID = 132 THEN Paid END)' и т.д. , –

+0

Спасибо! Это тоже помогло. @MartinSmith –

ответ

1

Рассмотрите возможность добавления таблицы кеша, в которой вы предварительно рассчитали все дебетовые, кредитные, дебетовые расчеты и расчет кредита для клиента. Im, предполагающий, что таблица транзакций никогда не обновляется, только вставил так простой триггер, выполненный после вставки для выполнения вычислений.

CREATE TABLE Balance 
(
    CustomerID int NOT NULL, 
    Debit decimal(18, 2) NOT NULL, 
    Credit decimal(18, 2) NOT NULL, 
    DebitSettlement decimal(18, 2) NOT NULL, 
    CreditSettlement decimal(18, 2) NOT NULL 
) 

CREATE TRIGGER CalculateBalance 
ON [Transaction] 
AFTER INSERT,UPDATE 
AS 
DECLARE @CustomerID int 

SET @CustomerID = (SELECT customerID FROM inserted) 

-- Calculate Debit, Credit, DebitSettlement and CreditSettlement for current customer 

GO 
+0

Большое спасибо. Я не уверен, почему некоторые люди голосуют за мой вопрос. Есть ли особая причина? –

+0

Не знаю, почему это происходит. Убедитесь, что при реализации триггера, который вы вычисляете балансы с запросом, который использовался для генерации результата, просто увеличивайте значения до баланса. В противном случае вставки будут медленными. –

0

Попробуйте выполнить план выполнения запроса также дает рекомендации относительно того, где в запросе запаздывает, а также попытаться создать индекс на полях таблиц, для которых вы используете запрос.