簡體   English   中英

為什么在嵌套循環(內部聯接)之前進行排序操作?

[英]Why is Sort operation before Nested Loops (Inner Join)?

我有2個Sql Server實例和一個查詢:

SELECT 
    [DetailDescription],
    [SubTotal]
FROM [dbo].[CRR] WITH (INDEX (IX_CORM_CORMId))
WHERE CORM_CORMId >= 5933168 AND CORM_CORMId <= 5955843

這導致2個查詢執行計划: 在此輸入圖像描述 在此輸入圖像描述

這是上傳的版本

一個有排序得到301740行,需要48s,其他得到286743行沒有排序需要5s。 一個db有點過時的其他副本。 表中行號的順序是98 419 368。

我的問題是:

  1. 我不明白為什么嵌套循環連接需要排序? 我試圖用'OPTION(QUERYTRACEON 2340)'禁用它。 該選項完全沒有區別。
  2. 為什么執行時間差異如此之大? 怎么避免這個?

我使用Sql Server 2014。

更新:

使用STATISTICS IO:

表'CynergyResidualRecord'。 掃描計數1,邏輯讀取1226357,物理讀取0,預讀讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀讀取0.表'工作表'。 掃描計數0,邏輯讀取0,物理讀取0,預讀取讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀讀取0。

排序是在執行密鑰查找之前按CynergyResidualRecordId順序獲取行。

這是一個優化,因此這里討論的查找不是隨機IO。

排序300K行當然不需要48秒 - 您發布的計划顯示排序運算符的實際經過時間為281 ms。

整個計划的實際經過時間是2.496秒,所以我不確定你在48秒內到達的地方。 也許48秒運行遇到阻塞或測量方法存在問題。

我認為這是由於過時的統計數據而發生的。 考慮更新此表的統計信息。

UPDATE STATISTICS [dbo].[CRR];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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