(1)什么是執行計划
SQL是一種傻瓜式語言,每一個條件就是一個需求,訪問的順序不同就形成了不同的執行計划。Oracle必須做出選擇,一次只能有一種訪問路徑。一個訪問路徑就是一個執行計划。
(2)執行計划的選擇
通常一條SQL有多個執行計划,那我們如何選擇?那種執行開銷更低,就意味着性能更好,速度更快,我們就選哪一種,這個過程叫做Oracle的解析過程,然后Oracle會把更好的執行計划放到SGA的Shared Pool里,后續再執行同樣的SQL只需在Shared Pool里獲取就行了,不需要再去分析。
(3)執行計划選定依據
根據統計信息來選擇執行計划。
(4)統計信息
(4.1)什么是統計信息
記錄數、塊數等,具體查看dba_tables / dba_indexes
(4.2)Oracle如何收集統計信息
① Oracle會選擇在一個特定的時間段收集表和索引的統計信息(默認周一至周五:22:00,周六周日:06:00),用戶可自行調整,主要為了避開高峰期;
② 表與索引的分析有閾值限制,超過閾值才會自動進行分析。如果數據變化量不大,Oracle是不會去分析的;
③ 收集方式靈活。可針對分區表的某個分區進行,可采用並行機制來收集表和索引的信息;
(4.3)如何收集統計信息
--收集表統計信息 exec dbms_stats.gather_table_stats(ownname => 'LIJIAMAN', tabname => 'TEST02',estimate_percent => 10,method_opt => 'for all indexed columns'); --收集索引統計信息 exec dbms_stats.gather_index_stats(ownname => 'LIJIAMAN',indname => 'ID_IDX',estimate_percent => 10,degree => '4'); --同時收集表與索引的統計信息 exec dbms_stats.gather_table_stats(ownname => 'LIJIAMAN',tabname => 'TEST02',estimate_percent => 10,method_opt => 'for all indexed columns',cascade => true);
(5)動態采樣
Oracle正常情況下會在每天的某段時間收集統計信息,對於新建的表,Oracl如何收集統計信息?采用動態采樣。
set autotrace on
set linesize 1000
--執行SQL語句
--會出現dynamic sampling used for this statement(level=2)關鍵字

【完成】
參考書籍:《收獲,不止SQL優化》
