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

Query takes way longer to run when selecting only one column

这是我第一次 post 来这里。我对 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 运营商或价格表中的任何其他单个字段 table 也会导致查询花费一分钟多的时间。但是,我可以 select 出货量 table 中的单个列,例如 SELECT Shipments.BOLNumber,而不会导致查询变慢。但我也注意到,如果我在此查询中尝试 SELECT Shipments.CustomerID,这也会导致它变慢,而 SELECT Shipments.ProNumber 例如接近即时。

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

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

This is for the Select * query

This is for the Select [Name] query

Shipments_FKIndex2 和 Shipments_FKIndex3 分别是 Shipments table 中 CustomerID 和 CarrierID 的索引。这些是客户和运营商的主键 table。

这里有几种可能性。

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

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