下面是該查詢:查詢在一個數據集中運行速度較慢,但在另一個較大的數據集中速度較快; MSSQL服務器;不同的執行計劃。爲什麼?
select nd1.ansos_id
from nursdate nd1
where nd1.division_id = 2
and nd1.unit_id = 19
and nd1.nursdate_start_date =
(select min(nd2.nursdate_start_date)
from nursdate nd2
where nd2.ansos_id = nd1.ansos_id
and nd2.nursdate_start_date >= all
(select nd3.nursdate_start_date
from nursdate nd3
where nd3.ansos_id = nd1.ANSOS_ID
and nd3.nursdate_start_date <= '2017-08-13 00:00:00'))
下面是兩個數據集真
- 統計最新的;
- 索引碎片整理
- 這兩個數據集的常規屬性是相同的:例如:整理;
- 此外,2個數據集的數據量相同。其實更快的有更多的數據
現在它需要~8秒運行在1數據集,但< 1秒在另一個數據集。 下面是在慢數據集中的2個數據集之間
- &「執行的次數」「的行的實際數」的執行計劃差天文更高
- 較快一個還具有附加的節點「索引後臺「
截圖#2緩慢執行計劃:相同的查詢,SPEE dy在另一個數據集中執行計劃
如何解決此問題?我能做些什麼才能讓它在第一個數據集中快速運行? 謝謝!
[編輯]較慢執行計劃:(注意整個「nursdate」表只有99K行) https://www.brentozar.com/pastetheplan/?id=r1ZFFuNt-
更快的執行計劃:(注意整個「nursdate」表具有333K行是以某種方式更快) https://www.brentozar.com/pastetheplan/?id=rJYMc_EKb
[編輯]這裏是數據捲上的一些信息。在「MMT」的人有更少的數據,但運行速度較慢
--mmt cnt: 99347
select count(*)
from mmt_sqa_v60.mmtsqav60.nursdate nd1
--heo cnt: 333275
select count(*)
from heo_sqa_v60_2k12.heosqav602k12.nursdate nd1
--mmt cnt: 2403
select count(*)
from mmt_sqa_v60.mmtsqav60.nursdate nd1
where nd1.division_id = 2
and nd1.unit_id = 19
and nd1.nursdate_start_date <= '2017-08-13 00:00:00'
--heo cnt: 5537
select count(*)
from heo_sqa_v60_2k12.heosqav602k12.nursdate nd1
where nd1.division_id = 1
and nd1.unit_id = 20
and nd1.nursdate_start_date <= '2017-08-13 00:00:00'
請使用此工具發佈兩個執行計劃:https://www.brentozar.com/pastetheplan/ – Eli
你的意思是兩個數據集?如果他們使用不同的表,你應該有兩個不同的查詢?如果查詢使用不同的參數,那麼我們也需要兩個查詢,以便我們可以比較 –
你的問題的答案就在這裏[[實際行數]&[慢數據集中的執行次數]天文數字更高]。 410萬行和9k行。執行計劃可能會有所不同,因爲我們正在討論數據量差異的大小。 –