SQL優(yōu)化案例——統(tǒng)計(jì)信息讓SQL飛起

涉及知識(shí)點(diǎn):
1.NL連接的優(yōu)化
2.收集統(tǒng)計(jì)信息方式
3.查看執(zhí)行計(jì)劃的6種方式及其優(yōu)缺點(diǎn)
4.SQL執(zhí)行計(jì)劃的執(zhí)行順序查看方法

問題現(xiàn)象:在進(jìn)行壓力測(cè)試登錄的時(shí)候,發(fā)現(xiàn)有大量查詢消息的操作。SQL卡頓時(shí)間長(zhǎng)達(dá)1分鐘玻佩。


image.png

具體SQL如下:
select
*
from
( select
row_. * ,
rownum rownum_
from
( select
斋竞。益眉。COLORKEY ,
RESENDTIMES
from
sm_msg_content
where
receiver = '1001WW1000000000054U'
and msgtype = 'nc'
and destination = 'inbox'
and msgsourcetype in (
select
typecode
from
sm_msg_msgtype
where
displocation = 'worklist'
)
and (
pk_detail in (
select
nt.pk_checkflow
from
pub_workflownote nt
where
nt.PK_BILLTYPE in (
select
bt.pk_billtypecode
from
bd_billtype bt
where
(
bt.pk_billtypecode in (
select
acbt.billtype
from
wfm_acceptnctype acbt
where
acbt.ext4 = 'ALLOW_MSG'
oracbt.ext4 is null
)
andbt.parentbilltype = '~'
)
or (
bt.parentbilltype < > '~'
andbt.parentbilltype in (
select
accbt.billtype
from
wfm_acceptnctype accbt
where
accbt.ext4 = 'ALLOW_MSG'
oraccbt.ext4 is null
)
)
)
)
or pk_detail is null
)
and not exists (
select
PK_CHECKFLOW
from
pub_workflownote nt
where
nt.ACTIONTYPE ='MAKEBILL'
and nt.PK_CHECKFLOW =PK_DETAIL
)
order by
sendtime desc ) row_
where
rownum < = 100
)
where
rownum_ > 0
問題分析:
針對(duì)問題現(xiàn)象陕壹,可以得到初步結(jié)論应狱。該SQL返回結(jié)果集很少共郭,SQL解析的時(shí)間長(zhǎng)達(dá)50秒左右。所以應(yīng)該是可以優(yōu)化到2s以內(nèi)疾呻。
由于可以執(zhí)行出SQL結(jié)果除嘹,并且不需要查看物理讀和邏輯讀。
因此罐韩,通過statistics_level=all的方式查看執(zhí)行計(jì)劃憾赁。
查看執(zhí)行順序的時(shí)候污朽,我們可以將執(zhí)行計(jì)劃拷貝到TXT文本里散吵,用光標(biāo)大法進(jìn)行查詢。
找到縮進(jìn)的最深的第一個(gè)語句蟆肆,就是SQL執(zhí)行的第一條語句矾睦,然后按照從上到下,逐步向外合并的順序進(jìn)行閱讀炎功。


| Id | Operation | Name |Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |

| 0 | SELECT STATEMENT | | 1 | | 100 |00:00:49.67 | 952K| | | |
|* 1 | VIEW | | 1 | 100 | 100 |00:00:49.67 | 952K| | | |
|* 2 | COUNT STOPKEY | | 1 | | 100 |00:00:49.67 | 952K| | | |
| 3 | VIEW | | 1 | 199 | 100 |00:00:49.67 | 952K| | | |
|* 4 | SORT ORDER BY STOPKEY | | 1 | 199 | 100 |00:00:49.67 | 952K| 160K| 160K| 142K (0)|
|* 5 | FILTER | | 1 | | 14017 |00:00:49.34 | 952K| | | |
|* 6 | HASH JOIN RIGHT ANTI | | 1 | 3933 | 14487 |00:00:01.63 | 41121 | 2616K| 2616K| 161K (0)|
|* 7 | TABLE ACCESS FULL |PUB_WORKFLOWNOTE | 1 | 1| 0 |00:00:00.67 | 26438 | | | |
| 8 | NESTED LOOPS | | 1 | 3934 | 14487 |00:00:00.85 | 14683 | | | |
| 9 | NESTED LOOPS | | 1 | 3934 | 14487 |00:00:00.19 | 203 | | | |
| 10 | SORT UNIQUE | | 1 | 11 | 11 |00:00:00.01 | 6 | 2048 | 2048 | 2048 (0)|
|* 11 | TABLE ACCESS FULL | SM_MSG_MSGTYPE | 1 | 11 | 11 |00:00:00.01 | 6 | | | |
|* 12 | INDEX RANGE SCAN | I_RCVMSGTYPE | 11 | 183 | 14487 |00:00:00.18 | 197 | | | |
|* 13 | TABLE ACCESSBY INDEX ROWID| SM_MSG_CONTENT | 14487 | 1311 | 14487 |00:00:00.61 | 14480 | | | |
|* 14 | FILTER | | 14487 | | 14017 |00:00:47.06 | 911K| | | |
| 15 | NESTED LOOPS | | 14487 | 1| 14017 |00:00:46.80 | 911K| | | |
| 16 | TABLE ACCESS BY INDEX ROWID| PUB_WORKFLOWNOTE | 14487 | 1 | 14017 |00:00:02.25 | 56851 | | | |
|* 17 | INDEX UNIQUE SCAN | PK_PUB_WORKFLOWNOT| 14487 | 1 | 14017 |00:00:01.72| 42834 | | | |
|* 18 | TABLE ACCESSFULL | BD_BILLTYPE | 14017 | 1 | 14017 |00:00:44.46 | 854K| | | |
|* 19 | TABLE ACCESS FULL |WFM_ACCEPTNCTYPE | 1 | 1| 1 |00:00:00.01 | 2 | | | |
|* 20 | TABLE ACCESS FULL |WFM_ACCEPTNCTYPE | 0 | 1| 0 |00:00:00.01 | 0 | | | |


可以明顯發(fā)現(xiàn)枚冗,時(shí)間在第| 15 | NESTED LOOPS | | 14487 | 1 | 14017 |00:00:46.80 | 911K| | | |有了突然的上漲。
該處屬于NL連接蛇损。而細(xì)看我們可以發(fā)現(xiàn)赁温,驅(qū)動(dòng)表為PK_PUB_WORKFLOWNOT 而 被驅(qū)動(dòng)表為WFM_ACCEPTNCTYPE 坛怪。
驅(qū)動(dòng)表為1W4的行數(shù),而被驅(qū)動(dòng)表為1行股囊。由于NL的機(jī)制袜匿,在兩表進(jìn)行合并操作的時(shí)候會(huì)進(jìn)行被驅(qū)動(dòng)表次數(shù)的循環(huán)。
這里顯然是驅(qū)動(dòng)表的順序錯(cuò)誤稚疹,變成了大表驅(qū)動(dòng)小表居灯。而這樣情況的發(fā)生,很多時(shí)候是由于統(tǒng)計(jì)信息不準(zhǔn)確導(dǎo)致内狗。
這也就是為什么采用statistics_level=all的方式進(jìn)行執(zhí)行計(jì)劃的查看怪嫌。該方法是唯一可以看到預(yù)估行數(shù)E-ROWS和實(shí)際行數(shù)A-ROWs的方式。
這里我們看到柳沙,PK_PUB_WORKFLOWNOT 預(yù)估值為1岩灭,而實(shí)際值為14017。顯然是這里的預(yù)估出現(xiàn)了問題赂鲤。
問題解決:
知道是統(tǒng)計(jì)信息不準(zhǔn)確導(dǎo)致的問題川背,就比較好解決了。這里注意蛤袒,需要使用oracle 11g推薦的方式來收集統(tǒng)計(jì)信息熄云。
exec dbms_stats.gather_table_stats(‘nc_user','PUB_WORKFLOWNOTE',CASCADE=>true,method_opt=>'for all indexed columns');
同時(shí),由于NL的機(jī)制比較關(guān)注關(guān)聯(lián)列的效率問題妙真,而第18
18 - filter("NT"."PK_BILLTYPE"="BT"."PK_BILLTYPECODE")走了filter缴允。而這里是可以通過走索引來避免全表掃描的。于是在這兩個(gè)關(guān)聯(lián)列上都添加了索引珍德。
最終练般,該SQL的執(zhí)行時(shí)間從50秒變?yōu)榱?秒以內(nèi),達(dá)到了優(yōu)化的效果锈候。使得壓力測(cè)試順利進(jìn)行薄料。


| Id | Operation | Name |Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |

| 0 | SELECT STATEMENT | | 1 | | 100 |00:00:00.58 | 181K| | | |
|* 1 | VIEW | | 1 | 1| 100 |00:00:00.58 | 181K| | | |
|* 2 | COUNT STOPKEY | | 1 | | 100 |00:00:00.58 | 181K| | | |
| 3 | VIEW | | 1 | 1| 100 |00:00:00.58 | 181K| | | |
|* 4 | SORT ORDER BY STOPKEY | | 1 | 1| 100 |00:00:00.58 | 181K| 142K| 142K| 126K (0)|
|* 5 | FILTER | | 1 | | 17988 |00:00:00.55 | 181K| | | |
| 6 | NESTED LOOPS ANTI | | 1 | 4| 18458 |00:00:00.33 | 73030 | | | |
|* 7 | HASH JOIN | | 1 | 376 | 18458 |00:00:00.14 | 18589 | 1645K| 1645K| 1298K (0)|
| 8 | SORT UNIQUE | | 1 | 11 | 11|00:00:00.01 | 6 | 2048 | 2048 | 2048 (0)|
|* 9 | TABLE ACCESS FULL | SM_MSG_MSGTYPE | 1 | 11 | 11|00:00:00.01 | 6 | | | |
|* 10 | TABLE ACCESSBY INDEX ROWID| SM_MSG_CONTENT | 1 | 1377 | 18458 |00:00:00.12 | 18583 | | | |
|* 11 | INDEX RANGE SCAN |I_RCV_ISREAD | 1 | 548 | 18459 |00:00:00.01 | 133 | | | |
|* 12 | TABLE ACCESS BYINDEX ROWID | PUB_WORKFLOWNOTE | 18458 | 6048 | 0 |00:00:00.17| 54441 | | | |
|* 13 | INDEX UNIQUESCAN | PK_PUB_WORKFLOWNOT | 18458 | 1| 17988 |00:00:00.10 | 36453 | | | |
|* 14 | FILTER | | 18458 | | 17988 |00:00:00.18 | 108K| | | |
| 15 | NESTED LOOPS | | 18458 | 2| 17988 |00:00:00.17 | 108K| | | |
| 16 | TABLE ACCESS BY INDEX ROWID| PUB_WORKFLOWNOTE | 18458| 1 | 17988 |00:00:00.08 | 72722 | | | |
|* 17 | INDEX UNIQUE SCAN |PK_PUB_WORKFLOWNOT | 18458 | 1 | 17988 |00:00:00.06 | 54734 | | | |
| 18 | TABLE ACCESS BY INDEX ROWID| BD_BILLTYPE | 17988 | 2| 17988 |00:00:00.07 | 35981 | | | |
|* 19 | INDEX RANGE SCAN |PK_BILLTYPEIDCODE | 17988 | 2| 17988 |00:00:00.04 | 17993 | | | |
|* 20 | TABLE ACCESS FULL | WFM_ACCEPTNCTYPE | 1 | 1 | 1 |00:00:00.01 | 2 | | | |

|* 21 | TABLE ACCESS FULL | WFM_ACCEPTNCTYPE | 0 | 1 | 0 |00:00:00.01 | 0 | | | |

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泵琳,隨后出現(xiàn)的幾起案子摄职,更是在濱河造成了極大的恐慌,老刑警劉巖获列,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谷市,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡击孩,警方通過查閱死者的電腦和手機(jī)迫悠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巩梢,“玉大人创泄,你說我怎么就攤上這事艺玲。” “怎么了鞠抑?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵板驳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我碍拆,道長(zhǎng)若治,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任感混,我火速辦了婚禮端幼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弧满。我一直安慰自己婆跑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布庭呜。 她就那樣靜靜地躺著滑进,像睡著了一般。 火紅的嫁衣襯著肌膚如雪募谎。 梳的紋絲不亂的頭發(fā)上扶关,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音数冬,去河邊找鬼节槐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拐纱,可吹牛的內(nèi)容都是我干的铜异。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼秸架,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼揍庄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起东抹,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蚂子,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后府阀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缆镣,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芽突,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年试浙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寞蚌。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡田巴,死狀恐怖钠糊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壹哺,我是刑警寧澤抄伍,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站管宵,受9級(jí)特大地震影響截珍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜箩朴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一岗喉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炸庞,春花似錦钱床、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滥壕,卻和暖如春纸颜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绎橘。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工懂衩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人金踪。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓浊洞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親胡岔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子法希,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容