簡體   English   中英

僅選擇一列時,查詢運行時間更長

[英]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 中測試查詢。 謝謝。

編輯:這是執行計划。 希望我做對了。 誠然,分析這些超出了我的經驗。

這是針對 Select * 查詢

這是針對 Select [名稱] 查詢

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM