【问题标题】:Query takes way longer to run when selecting only one column仅选择一列时,查询运行时间更长
【发布时间】:2020-07-02 05:38:02
【问题描述】:

这是我在这里的第一篇文章。我对 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 行)。尝试选择 Carriers 或 PriceSheets 表中的任何其他单个字段也会导致查询花费一分钟以上。但是,我可以从发货表中选择单个列,例如SELECT Shipments.BOLNumber,而不会导致查询速度变慢。但我也注意到,如果我在这个查询中尝试SELECT Shipments.CustomerID,也会导致它变慢,而SELECT Shipments.ProNumber 几乎是即时的。

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

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

This is for the Select * query

This is for the Select [Name] query

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

【问题讨论】:

  • 您是否查看并比较了慢速和快速的实际计划?也许发布那些?您是否尝试过重建所涉及表的索引和统计信息以查看是否有任何不同?这些表的索引是什么?
  • 您能分享两个(* 和单列)执行计划吗? brentozar.com/pastetheplan
  • 您需要解决方案(很简单)还是想知道原因(需要深入研究)?
  • Carriers 中有多少条记录?如何重新索引表?您是否尝试仅使用特定的 CarriersID 查询 CarriersSelect [name]Select *
  • 运行“SET STATISTICS IO ON”并计算两个查询之间的逻辑读取次数,看看是否提供任何线索。

标签: sql sql-server azure-sql-server


【解决方案1】:

这里有几种可能性。

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

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

【讨论】:

  • 第一个似乎是对的。有两个索引,一个用于 CarrierID,一个用于 CustomerID。我尝试制作一个组合,然后他们查询按预期立即运行。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多