#sql-server-2005 #tsql #sql-optimization
#sql-server-2005 #tsql #sql-оптимизация
Вопрос:
Моя текущая версия :
SELECT DT, AVG(DP_H2O) AS Tx,
(SELECT AVG(Abs_P) / 1000000 AS expr1
FROM dbo.BACS_MinuteFlow_1
WHERE (DT =
(SELECT MAX(DT) AS Expr1
FROM dbo.BACS_MinuteFlow_1
WHERE DT <= dbo.BACS_KongPrima.DT ))
GROUP BY DT) AS Px
FROM dbo.BACS_KongPrima
GROUP BY DT
но это работает очень медленно.
в основном во внутреннем выборе я выбираю максимально близкое время к моему времени, затем группирую по этому ближайшему времени.
Возможна ли оптимизация? Возможно, я смогу как-то присоединиться к нему, но проблема в том, что я не уверен, как сгруппировать по этой ближайшей дате.
Спасибо
Комментарии:
1. Вы добавили какие-либо индексы в BACS_MinuteFlow_1? Если вы хотите ускорить внутренний запрос, возможно, стоит добавить индекс в столбец DT.
Ответ №1:
Вы могли бы попытаться изменить его, чтобы использовать приведенный ниже код, используя перекрестное применение. Не уверен, улучшит ли это производительность, но обычно я стараюсь любой ценой избегать использования запроса к определенному столбцу, а SQL Server довольно хорош в оптимизации инструкции Apply.
WITH Bacs_MinuteFlow_1 (Abs_P ,DT ) AS
(SELECT 5.3,'2011/10/10'
UNION SELECT 6.2,'2011/10/10'
UNION SELECT 7.8,'2011/10/10'
UNION SELECT 5.0,'2011/03/10'
UNION SELECT 4.3,'2011/03/10'),
BACS_KongPrima (DP_H2O ,DT)AS
(SELECT 2.3,'2011/10/15'
UNION SELECT 2.6,'2011/10/15'
UNION SELECT 10.2,'2011/03/15')
SELECT DT, AVG(DP_H2O) AS Tx,
a.Px
FROM BACS_KongPrima
CROSS APPLY
(
SELECT AVG(Abs_P) / 1000000 AS Px
FROM BACS_MinuteFlow_1
WHERE DT =
(SELECT MAX(DT) AS maxdt
FROM BACS_MinuteFlow_1
WHERE DT <= BACS_KongPrima.DT
)
) a
GROUP BY DT,a.Px
Приветствия