繁体   English   中英

仅选择一列时,查询运行时间更长

[英]Query takes way longer to run when selecting only one column

这是我在此的头一篇博文。 我对 SQL 查询相当熟悉(尽管这不是我的主要关注点),但我被一个突然的问题难住了。 我有一个查询可能已经使用了至少 2 年,没有任何问题。 今天,它突然需要更长的时间来运行。 它过去几乎是即时的,现在大约需要一分钟才能完成。

SELECT Carriers.[Name]
From Shipments 
INNER JOIN Carriers ON Shipments.CarrierID = Carriers.CarrierID 
INNER JOIN PriceSheets ON PriceSheets.ShipmentID = Shipments.ShipmentID 
Where PriceSheets.SettlementQueue IN ('CHECK BOL', 'CHECK ORG INV', 'CHECK BAL DUE', 'AUDIT NEEDED', 'HOLD') 
AND Shipments.CustomerID <> 10055 

这就是奇怪的地方。 如果我将SELECT Carriers.[Name]更改为SELECT *查询几乎立即完成(返回大约 181 行)。 尝试 select Carriers 或 PriceSheets 表中的任何其他单个字段也会导致查询花费一分钟以上。 但是,我可以 select 诸如SELECT Shipments.BOLNumber等发货表中的单个列,而不会导致查询速度变慢。 但我也注意到,如果我在此查询中尝试SELECT Shipments.CustomerID ,这也会导致它变慢,而SELECT Shipments.ProNumber例如几乎是即时的。

但是,如果我只是简单地执行SELECT *并且它会立即发生,那么所有这些单独的列都会显示得很好......那么为什么当我指定一个特定的列时它需要更长的时间? 我还没有遇到过这个问题,因为这是一个非常具体的情况,所以感觉很长一段时间,但我想知道其他人是否有想法? 如果相关,这是一个 Azure SQL 服务器数据库,我正在 SSMS 中测试查询。 谢谢。

编辑:这是执行计划。 希望我做对了。 诚然,分析这些超出了我的经验。

这是针对 Select * 查询

这是针对 Select [名称] 查询

Shipments_FKIndex2 和 Shipments_FKIndex3 分别是 Shipments 表中 CustomerID 和 CarrierID 的索引。 这些是 Customer 和 Carrier 表的主键。

这里有几种可能性。

首先是选择单个字段引用了两个索引,FKindex2 和 FKindex3。 一个可能在 CarrierID 上,另一个在 Name 上。 如果每个索引仅在一个列上,请考虑是否可以组合这些索引。 创建一个多列索引作为搜索的一列,例如carrierID,然后将'name'设为包含列。 当然,您必须确保此类更改不会影响其他查询。

第二个问题是第二个查询转入并行计划。 检查服务器设置以了解您的并行设置。 右键单击 SSMS 中的服务器名称 -> 属性 -> 高级 -> 并行成本阈值。 如果它仍然设置为默认值 5,请考虑提高它。 我想大多数人都同意 5 的设置对于大多数用例来说太低了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM