Sql server 基于sqlserver2008的查询优化

Sql server 基于sqlserver2008的查询优化,sql-server,sql-server-2008,query-optimization,sql-optimization,Sql Server,Sql Server 2008,Query Optimization,Sql Optimization,我有一个在SQLServer2008上运行的小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的世界很陌生,正在学习。请指导我如何优化此查询以更快地运行 如果有人能提到我的错误,我会很高兴知道我在做什么,这使得查询结果

我有一个在SQLServer2008上运行的小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

基本上,如果不查看实际的表设计和索引,就很难准确地说出需要更改的内容。但对于初学者来说,你可以肯定地考虑两件事:

在CTE_CONS查询中,您正在Datetime字段上进行左连接。这绝对不是一个好主意,除非你在这个领域有某种索引。如果还没有索引,我强烈建议您创建一个索引

CREATE NONCLUSTERED INDEX IX_UTC_DATETIME ON dbo.ers_hh_forecast_consumption 
(UTC_DATETIME ASC) INCLUDE (
 FORECAST_FILE_ID
,FORECAST_CONSUMPTION
 );
你可以考虑做的另一件事是对你的表DBO.ErSyHHyFordStasub进行分区。这样,您的读取在表上就少了很多,检索记录也快了很多。这里有一个快速指南


希望这有帮助

除了您需要提供更多信息让我们更好地了解情况之外,我想我在这里发现了您的问题:

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
)
在第一个信号中,您尝试将T1.FORECAST\u CONSUMPTION per T2.CONVERTED\u DATE、T1.FORECAST\u FILE\u ID组合的值相加。但是,在组别中您是否也添加了T1.FORECAST\u消费量?这将产生与在三个字段上执行DISTINCT相同的效果。要么从GROUP BY中删除要使用的字段,要么使用DISTINCT并去掉SUM和GROUP BY;取决于你想要什么效果

无论如何,你能在你的问题中添加以下内容吗

所有相关表的EXEC sp_帮助索引。 如果可能,从SSMS或SQL Sentry Plan Explorer获取执行计划的屏幕截图。
由于表ers_hh_forecast_consumption有大量记录,因此最好使用筛选条件将所需记录插入到Destitable中,并在CTE中使用该Destitable。您是否在任何表上都有索引,例如forecast consumption表的UTC_DATETIME上的索引。显示表定义和索引将帮助您得到一个合理的答案。当我们不知道存在哪些索引时,很难给出建议。同时,您可以使用SSM查看查询的执行计划,以确定优化。感谢新手。两种我都试试。