这是我在这里的第一篇文章。我对sql查询相当熟悉(虽然这不是我的主要关注点),但是我遇到了一个突然的问题。我有一个查询,可能已经使用了至少两年没有问题。今天,跑步的时间突然变长了。以前几乎是瞬间完成,现在大约需要一分钟。
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表中选择任何其他单个字段也会导致查询占用一分钟的时间。但是,我可以从shippings表中选择一列,例如 SELECT Shipments.BOLNumber
而不会导致查询速度减慢。但我也注意到如果我尝试 SELECT Shipments.CustomerID
在这个查询中,这也会导致它在 SELECT Shipments.ProNumber
例如,几乎是瞬间的。
但是如果我简单地这样做的话,所有这些单独的列都显示得很好 SELECT *
它会立刻发生。。。那么为什么我指定一个特定的列要花这么长的时间呢?我还没有遇到过这种情况,这是一个很难问的问题,因为这是一个如此具体的情况,但我想知道是否有人有一个想法?如果相关的话,这是一个azuresqlserver数据库,我正在ssms中测试查询。谢谢。
编辑:这是执行计划。希望我做得对。诚然,分析这些问题超出了我的经验范围。
这是用于select*查询的
这是用于选择[名称]查询的
发货\u fkindex2和发货\u fkindex3分别是发货表中customerid和carrierid的索引。这些是customer和carrier表的主键。
1条答案
按热度按时间t1rydlwq1#
这里有一些可能性。
第一个是选择单个字段时引用两个索引:fkindex2和fkindex3。一个可能是卡里里德,另一个是名字。如果每个索引只在一列上,请考虑是否可以合并这些索引。创建一个多列索引作为搜索的一列,例如carrierid,然后将“name”设为包含列。当然,您必须确保这样的更改不会影响其他查询。
第二个问题是第二个查询转入了并行计划。检查服务器设置以了解并行设置是什么。右键单击ssms->properties->advanced->cost threshold for parallelism中的服务器名称。如果仍设置为默认值5,请考虑提高该值。我想大多数人都同意设置5对于大多数用例来说太低了。