【发布时间】:2015-05-26 08:32:56
【问题描述】:
我有一个在 SQL Server 2008 上运行的小型 sql 查询。它使用以下表格及其行数:
dbo.date_master - 245424
dbo.ers_hh_forecast_consumption - 436061472
dbo.ers_hh_forecast_file - 15105
dbo.ers_ed_supply_point - 8485
我对 SQL Server 世界很陌生,并且正在学习。请指导我如何优化此查询以更快地运行。
如果有人可以提及我的错误以及我正在做的事情导致查询结果表需要很长时间,我将非常高兴。
WITH CTE_CONS AS
(
SELECT T2.CONVERTED_DATE
,T1.FORECAST_FILE_ID
,SUM(T1.FORECAST_CONSUMPTION) AS TOTAL
FROM dbo.ers_hh_forecast_consumption AS T1
LEFT JOIN dbo.date_master AS T2 ON T1.UTC_DATETIME=T2.STRDATETIME
WHERE T2.CONVERTED_DATE>='2015-01-01' AND T2.CONVERTED_DATE<='2015-06-01'
GROUP BY T2.CONVERTED_DATE, T1.FORECAST_FILE_ID, T1.FORECAST_CONSUMPTION
),
CTE_MPAN AS
(
SELECT T2.FORECAST_FILE_ID
,T2.MPAN_CORE
FROM CTE_CONS AS T1
LEFT JOIN dbo.ers_hh_forecast_file AS T2 ON T1.FORECAST_FILE_ID=T2.FORECAST_FILE_ID
),
CTE_GSP AS
(
SELECT T2.MPAN_CORE
,T2.GSP_GROUP_ID
FROM CTE_MPAN AS T1
LEFT JOIN dbo.ers_ed_supply_point AS T2 ON T1.MPAN_CORE=T2.MPAN_CORE
)
SELECT T1.CONVERTED_DATE
,T1.TOTAL
,T2.MPAN_CORE
,T1.TOTAL
FROM CTE_CONS AS T1
LEFT JOIN CTE_MPAN AS T2 ON T1.FORECAST_FILE_ID=T2.FORECAST_FILE_ID
LEFT JOIN CTE_GSP AS T3 ON T2.MPAN_CORE=T3.MPAN_CORE
【问题讨论】:
-
由于表“ers_hh_forecast_consumption”有大量记录,最好使用过滤条件将需要的记录插入到临时表中,并在CTE中使用该临时表。
-
您在任何表上是否有任何索引,例如预测消耗表的UTC_DATETIME 上的索引。显示表定义和索引将帮助您得到一个体面的答案。
-
当我们不知道存在哪些索引时,很难给出建议。同时,您可以使用 SSMS 查看查询的执行计划以识别优化。
标签: sql-server sql-server-2008 query-optimization sql-optimization