gpt4 book ai didi

sql-server - 如果删除未使用的连接,查询速度会变慢

转载 作者:行者123 更新时间:2023-12-04 01:02:59 25 4
gpt4 key购买 nike

我遇到了一个“问题”,我不知道如何解决。我有一个运行大约 15 秒的查询,当我添加一个连接(未在选择中使用)时,查询实际上加速了大约 4 秒,即使您没有选择其他连接。我想 SQL Server 选择了一个更快的不同执行计划 - 但我如何强制它每次都选择最快的查询计划?

此查询大约需要 15 秒:

SELECT
O.Lvl1_Business_Area_Cd
,O.Lvl1_Business_Area_Nm
,O.Lvl2_Division_Cd
,O.Lvl2_Division_Nm
,SUM(F.Economic_Capital) AS Economic_Capital
FROM
Facts.Financials AS F
LEFT JOIN Dimensions.Customer AS C ON F.Customer_Id = C.Customer_Id
LEFT JOIN Dimensions.Organization AS O ON C.CRU_Id = O.CRU_Id
WHERE
F.Year_Month_Id = 201706
AND Lvl1_Business_Area_Cd = 6008000
GROUP BY
O.Lvl1_Business_Area_Cd
,O.Lvl1_Business_Area_Nm
,O.Lvl2_Division_Cd
,O.Lvl2_Division_Nm

这个查询大约需要 4 秒:

SELECT
O.Lvl1_Business_Area_Cd
,O.Lvl1_Business_Area_Nm
,O.Lvl2_Division_Cd
,O.Lvl2_Division_Nm
,SUM(F.Economic_Capital) AS Economic_Capital
FROM
Facts.Financials AS F
LEFT JOIN Dimensions.Customer AS C ON F.Customer_Id = C.Customer_Id
LEFT JOIN Dimensions.Organization AS O ON C.CRU_Id = O.CRU_Id
LEFT JOIN Dimensions.Nace AS N ON C.NACE_Id = N.NACE_Id
WHERE
F.Year_Month_Id = 201706
AND Lvl1_Business_Area_Cd = 6008000
GROUP BY
O.Lvl1_Business_Area_Cd
,O.Lvl1_Business_Area_Nm
,O.Lvl2_Division_Cd
,O.Lvl2_Division_Nm

这两个查询之间的唯一区别是 LEFT JOIN Dimensions.Nace AS N ON C.NACE_Id = N.NACE_Id。但是,该表中的任何内容都没有用在 select 语句中。

Facts.Financials 有 ~60 mio。行,Dimensions.Customer ~17 mio。行,Dimensions.Organization ~25.000,Dimensions.Nace ~1.000 行。

Customer_Id = bigint
CRU_Id = bigint
Nace_id = varchar(4)

我在 table 上有以下缺陷:

Facts.Financials: Clustered Index (YearMonth, Customer_Id), Non-Clustered (Customer_Id), Non-clustered columnstore index (Economic_Capital)
Dimensions.Customer: Clustered (Customer_Id, CRU_Id), Non-clustered (CRU_Id), Non-clustered (Nace_Id)
Dimensions.Organization: Clustered (CRU_Id), Non-clustered (Lvl1_Cd, Lvl2_Cd, Lvl3_Cd) Include (Lvl1_Nm, Lvl2_Nm, Lvl3_Nm, Lvl4_Cd, Lvl4_Nm, CRU_Id, CRU_Name)
Dimensions.Nace: Clustered (Nace_Id)

这是慢速查询(15 秒)的执行计划

Slow execution plan缓慢的执行计划 XML:Slow execution plan

这是快速执行计划(4 秒)

Fast execution plan快速执行计划 XML:Fast execution plan

任何人都可以指出我所缺少的正确方向吗?我的索引有误吗?这怎么会发生?

我正在运行 SQL Server 2014

最佳答案

However nothing from this table is used in the select statement.

但是你在连接中使用它。所以 sql server 优化器会选择不同的计划,连接有一些影响,由 Paul White 解释。这里 : Joining 100 tables

因此即使您没有在 select 中使用它,连接也可能有不同的副作用

It can add extra columns (from the joined table)
It can add extra rows (the joined table may match a source row more than once)
It can remove rows (the joined table may not have a match)
It can introduce NULLs (for a RIGHT or FULL JOIN)

因此,如果您的加入没有添加任何上述副作用,那么您可能会像其他人一样获得计划

关于sql-server - 如果删除未使用的连接,查询速度会变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45549808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com