“no_merge”hints優化檢視訪問低效問題
今天在itpub論壇看到一則貼子,樓主反應以下sql執行緩慢:
create table test_20140230 as
select to_number(201401) deal_date, e.src_terminal_id, e.cont_type
from (select *
from test1 a
where a.forward_time >= 201401 || '00000000'
and a.forward_time < 201402 || '00000000'
and exists
(select TERMINAL_ID
from test2 b
where b.oper_type in (1, 2, 3)
and b.oper_time >= to_date(201401, 'yyyymm')
and b.oper_time <
trunc(add_months(to_date(201401, 'yyyymm'), 1))
and b.terminal_id = a.src_terminal_id
and b.dest_id = a.dst_terminal_id
and b.info_id = a.info_id
and (to_date(a.forward_time, 'yyyyMMddHH24miss') -
b.oper_time) < 1
and decode(b.type,
1,
1,
2,
1,
6,
1,
7,
1,
3,
2,
4,
2,
5,
2) = a.cont_type)) e,
(select distinct d.mobile
from (select *
from test3
where act_id in ('192065', '130444')
and substr(register_time, 1, 6) <= 201401) c,
(select *
from test4
where substr(create_time, 1, 6) <= 201401
and status = 1) d
where c.fee_terminal_id = d.mobile) f
where e.src_terminal_id = f.mobile
但將以上紅色標識程式碼先建立為臨時表,再用臨時表代替執行上面sql時,速度明顯加快。樓主想問個所以然。
因為實際工作中,像樓主這種優化方式,我用過很多,一直以為,借用臨時表,先將需要資料抽取出來,然後再根據應用需要,從臨時表中
直接抽取資料,這樣肯定快的多,只是會犧牲掉臨時表的維護。沒想到,還有更優化的方式,那就是使用no_merge。
將以上紅色部分程式碼select * from test1 a 改為select /*+ no_merge*/ * from test1 a 此hints方式與建立臨時表方式優化是等效的。
網上度娘了下no_merge用法,沒有很詳細的解釋,個人認為,就是一個子查詢或檢視,本身單獨執行不慢,但放入一個子查詢中時,oracle會打散原來的執行計劃,為了將此子查詢或檢視,作為一個整體,不被打散,提供no_merge hints方式。
如:查詢系統表的二個檢視
SELECT COUNT(*) FROM DBA_SEQUENCES, DBA_OBJECTS;
耗時約半小時,單獨執行這二個檢視count查詢時,都在8秒內。
使用no_merge hints如下:
SELECT /*+ NO_MERGE(A) NO_MERGE(B) */ COUNT(*) FROM DBA_SEQUENCES A, DBA_OBJECTS B;
約1分鐘。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1102671/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用NO_MERGE解決資料字典檢視訪問低效
- (zt)利用NO_MERGE解決資料字典檢視訪問低效
- 利用NO_MERGE解決資料字典檢視訪問低效 ZT
- GitHub 訪問優化Github優化
- 檢視自動sql調優作業,最佳化sql訪問路徑SQL
- 階梯訪問表優化優化
- Nginx併發訪問優化Nginx優化
- 【調優】設計問題還是優化問題?優化
- 凸優化問題優化
- 效能優化問題優化
- nginx 檢視每秒有多少訪問量Nginx
- PHP伺服器訪問優化PHP伺服器優化
- 檢視低效的SQL語句SQL
- Websphere Web訪問埠號檢視和修改Web
- 檢視硬碟IO訪問負荷的方法硬碟
- 如何檢視Linux 當前訪問ipLinux
- SQLServer訪問Oracle(通過同義詞-檢視-資料字典)出現的問題SQLServerOracle
- WebService 訪問問題Web
- Oracle資料庫訪問效能優化Oracle資料庫優化
- 資料訪問層的優化思路優化
- JavaScript資料訪問效能優化方案JavaScript優化
- 網站訪問優化,未完待續網站優化
- Oracle指令碼(Oracle Scripts) – 檢視索引訪問次數及索引訪問型別Oracle指令碼索引型別
- oracle效能優化之--hintsOracle優化
- 03-凸優化問題優化
- 斜率優化(凸包優化)DP問題acm優化ACM
- [20140116]檢視?隱式轉換?sql優化問題.txtSQL優化
- thinkphp6 檢視問題總結PHP
- 資料檢視的重複問題
- 資訊檢視:iKill,蘋果的中國問題蘋果
- postgresql關於訪問檢視需要的許可權SQL
- nginx配置web訪問以及檢視目錄檔案NginxWeb
- 域名訪問和ip訪問引起的http 403問題HTTP
- 數值最優化—優化問題的解(二)優化
- 【離散優化】覆蓋問題優化
- 記一個效能優化問題優化
- go的編譯優化問題Go編譯優化
- N皇后問題(各種優化)優化