Sql server 基于sqlserver2008的查询优化
我有一个在SQLServer2008上运行的小sql查询。它使用以下表格及其行数: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的世界很陌生,正在学习。请指导我如何优化此查询以更快地运行 如果有人能提到我的错误,我会很高兴知道我在做什么,这使得查询结果
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查看查询的执行计划,以确定优化。感谢新手。两种我都试试。