【发布时间】: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 查询Carriers:Select [name]和Select *? -
运行“SET STATISTICS IO ON”并计算两个查询之间的逻辑读取次数,看看是否提供任何线索。
标签: sql sql-server azure-sql-server