![](/img/trans.png)
[英]SQL query returns values when selecting multiple columns, but no data when selecting only one column
[英]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 中测试查询。 谢谢。
编辑:这是执行计划。 希望我做对了。 诚然,分析这些超出了我的经验。
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.