[英]Query performance decreased
我有一個如下查詢:
SELECT col1,col2,col3,col4,col5,unit1,unit2,unit3,unit4,unit5
FROM (select x.*,
to_number(substr(it_specs,instr(it_specs,',',1,1)+1,instr(it_specs,',',1,2)-instr(it_specs,',',1,1)-1)) unit1,
to_number(substr(it_specs,instr(it_specs,',',1,2)+1,instr(it_specs,',',1,3)-instr(it_specs,',',1,2)-1)) unit2,
to_number(substr(it_specs,instr(it_specs,',',1,3)+1,instr(it_specs,',',1,4)-instr(it_specs,',',1,3)-1)) unit3,
to_number(substr(it_specs,instr(it_specs,',',1,4)+1,instr(it_specs,',',1,5)-instr(it_specs,',',1,4)-1)) unit4,
to_number(substr(it_specs,instr(it_specs,',',1,5)+1,instr(it_specs,',',1,6)-instr(it_specs,',',1,5)-1)) unit5
from (select a.*,
(select IT_PKG.IT_SPECS(charges, TRUNC(usrdate), 'N')
from dual) AS it_Specs
from tabl1 A
ORDER BY a.col1, a.col2, a.col3, a.col4, a.col5) x) a,
tabl2 B
WHERE A.CA = B.CA
group by col1, col2, col3, col4, col5,
unit1, unit2, unit3, unit4, unit5
tabl1的記錄數范圍為100到25000。tabl2中的記錄數為一千。 函數IT_SPECS中涉及兩個表。 每個都有五十萬條記錄。 該查詢可以正常工作幾個月,沒有任何性能問題,可以從下面的跟蹤中看到:
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.01 0.01 0 2 0 0
Fetch 6177 0.90 1.04 375 761 0 12351
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 6179 0.92 1.06 375 763 0 12351
但是性能明顯下降是毫無原因的。
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.02 0.03 0 0 0 0
Execute 1 0.02 0.10 239 153 0 0
Fetch 107 5.58 26.54 680 70660 0 10637
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 109 5.64 26.67 919 70813 0 10637
我的問題為什么我獲得較高的查詢值並且經過時間也很高? 第二種情況下的訪存次數較少,但對性能沒有影響。
說明計划:
查詢執行時計划:
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
11030 11030 11030 FAST DUAL (cr=0 pr=0 pw=0 time=9295 us cost=2 size=0 card=1)
12300 12300 12300 HASH GROUP BY (cr=774 pr=375 pw=375 time=738182 us cost=216 size=2290 card=2)
12613 12613 12613 HASH JOIN (cr=774 pr=0 pw=0 time=545344 us cost=215 size=14622795 card=12771)
13 13 13 VIEW index$_join$_005 (cr=6 pr=0 pw=0 time=2267 us cost=3 size=104 card=13)
13 13 13 HASH JOIN (cr=6 pr=0 pw=0 time=2254 us)
13 13 13 INDEX FAST FULL SCAN C_TYP_UK1 (cr=3 pr=0 pw=0 time=68 us cost=1 size=104 card=13)(object id 81097)
13 13 13 INDEX FAST FULL SCAN C_TYP_X1 (cr=3 pr=0 pw=0 time=51 us cost=1 size=104 card=13)(object id 390320)
12613 12613 12613 VIEW (cr=768 pr=0 pw=0 time=520833 us cost=211 size=14520627 card=12771)
12613 12613 12613 TABLE ACCESS FULL tabl1 (cr=752 pr=0 pw=0 time=43361 us cost=211 size=13779909 card=12771)
********************************************************************************
計划發生性能問題的時間:
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
13676 13676 13676 FAST DUAL (cr=0 pr=0 pw=0 time=26975 us cost=2 size=0 card=1)
13754 13754 13754 HASH GROUP BY (cr=109351 pr=1072 pw=435 time=31552012 us cost=273 size=2290 card=2)
15875 15875 15875 HASH JOIN (cr=109351 pr=637 pw=0 time=37695338 us cost=271 size=20364970 card=17786)
13 13 13 VIEW index$_join$_005 (cr=6 pr=0 pw=0 time=5159 us cost=3 size=104 card=13)
13 13 13 HASH JOIN (cr=6 pr=0 pw=0 time=5142 us)
13 13 13 INDEX FAST FULL SCAN C_TYP_UK1 (cr=3 pr=0 pw=0 time=175 us cost=1 size=104 card=13)(object id 81097)
13 13 13 INDEX FAST FULL SCAN C_TYP_X1 (cr=3 pr=0 pw=0 time=152 us cost=1 size=104 card=13)(object id 390320)
15875 15875 15875 VIEW (cr=109345 pr=637 pw=0 time=37587033 us cost=268 size=20222682 card=17786)
15875 15875 15875 TABLE ACCESS FULL tabl1 (cr=952 pr=632 pw=0 time=50917 us cost=268 size=19191094 card=17786)
********************************************************************************
該查詢運行了好幾個月。 實際上,我更想知道為什么幾個月后性能會下降以及為什么我們獲得很高的查詢價值?
您知道較早執行的執行計划嗎? 首先,收集有關表的表統計信息。
不要使用(select IT_PKG.IT_SPECS(charges, TRUNC(usrdate), 'N') from dual) AS it_Specs
,只需使用IT_PKG.IT_SPECS(charges, TRUNC(usrdate), 'N') AS it_Specs
。
更新此查詢現在返回所需結果嗎?
WITH x AS
(SELECT ca,col1,col2,col3,col4,col5,IT_PKG.IT_SPECS(charges, TRUNC(usrdate), 'N') AS it_Specs
FROM tabl1)
a AS
(SELECT x.*,
TO_NUMBER(SUBSTR(it_specs,INSTR(it_specs,',',1,1)+1,INSTR(it_specs,',',1,2)-INSTR(it_specs,',',1,1)-1)) unit
FROM x)
SELECT a.*,
unit AS unit1, unit AS unit2, unit AS unit3, unit AS unit4, unit AS unit5 -- always the same
FROM a
JOIN tabl2 B ON A.CA = B.CA
GROUP BY col1,col2,col3,col4,col5,unit1,unit2,unit3,unit4,unit5
ORDER BY col1,col2,col3,col4,col5
我已經看到一些問題,Oracle會多次重復該函數調用,即使只是“ dual
”選擇。
嘗試將查詢移動到with
。 看到這個 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.