《ORACLE數據分析和動態采樣》引言:oracle數據庫性能調優最需要重視的也最常遇到的就是SQL執行效率,而反映SQL效率最直觀的工具就是CBO生成的執行計劃,那么如
《ORACLE 數據分析和動態采樣》
引言:oracle 數據庫性能調優最需要重視的也最常遇到的就是SQL執行效率,而反映SQL效率最直觀的工具就是CBO生成的執行計劃,那么如何讓CBO生成最精準的效率最高的執行計劃成為我們當前需要研究的課題。同一條語句,好的執行計劃能帶來飛一樣的速度,壞的執行計劃讓我們痛苦不堪,下面我們從原理到實踐來把如何產生高效計劃的方法教給大家。
一 CBO介紹
CBO全稱叫Cost Based optimization基于代價優化器,它是一個數學模型,同一個SQL語句在不同的oracle版本中計算出來的代價結果也是不一樣的,因為每個版本CBO優化器的設計結構有很大不同,現在還不是很完善很智能很通人性,因此我們不能完全依賴它,只能輔助我們。
如何生成精確的執行計劃:公式數據+CBO=執行計劃,傳入CBO的數據越精確得到結果越精確,我們能做的保證輸入數據更準確,通過精確數據計算出精確執行計劃
二演示一個表分析后執行計劃比動態采樣更準確的例子
動態采樣:顧名思義就是oracle自動為你進行的初步數據分析,由于是隨機在表上取一些數據,因此并不能保證得出的執行計劃很準確,只能作為一種輔助分析手段,在不得已的情況下來分析數據,有一定的局限性。
場景:當表沒有分析信息時,香港服務器,oracle會使用動態采樣技術,而且動態采樣是在SQL硬解析的時候發生的,傳入->CBO參數->生成執行計劃。
級別:oracle 10g oracle 11g 默認動態采樣級別是2,它有level1-10,設置的級別越高采集的數據塊越多,結果越精確,運行時間越長,level10對所有數據進行采樣分析。
實驗
LEO1@LEO1> drop table leo1 purge;清理環境
Table dropped.
LEO1@LEO1> drop table leo2 purge;
Table dropped.
LEO1@LEO1> create table leo1 as select * from dba_objects;創建leo1表
Table created.
LEO1@LEO1> create table leo2 as select * from leo1;創建leo2表,采用leo1一樣數據和結構
Table created.
LEO1@LEO1> col segment_name for a10
LEO1@LEO1> select segment_name,extents,blocks from dba_segments where segment_name in ('LEO1','LEO2');
SEGMENT_NA EXTENTS BLOCKS
---------- ---------- -------------- -------------- ----
LEO1 24 1152
LEO2 24 1152
查詢leo1和leo2表這兩個段對象存儲參數,都是占用24個區,1152個塊,2個表一模一樣嘛
LEO1@LEO1> col table_name for a10
LEO1@LEO1> select table_name,num_rows,blocks,status from dba_tables wheretable_name in ('LEO1','LEO2');
TABLE_NAME NUM_ROWS BLOCKS STATUS
---------- ---------- ---------- ------------ ---------- ------------
LEO1 VALID
LEO2 VALID
在這個數據字典里只顯示表名和當前狀態(有效),沒有行信息和塊信息,這是為神馬呢,嗯從上面的操作可以看出,我們只是建立了表,但沒有分析表統計信息,現在我們分析一下后看看效果
LEO1@LEO1> execute dbms_stats.gather_table_stats('LEO1','LEO1');對LEO1表進行統計分析
PL/SQL procedure successfully completed.
LEO1@LEO1> select table_name,num_rows,blocks,status from dba_tables wheretable_name in ('LEO1','LEO2');
TABLE_NAME NUM_ROWS BLOCKS STATUS
---------- ---------- ---------- ------------ ---------- ------------
LEO1 71968 1051 VALID
LEO2 VALID
現在leo1表已經有行信息和塊信息了,leo2由于沒有進行表分析現在還什么都沒有
LEO1@LEO1> set autotrace trace exp
LEO1@LEO1> select * from leo1 where object_id=10000;
Execution Plan
----------------------------------------------------------
Plan hash value: 2716644435
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 97 | 287 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| LEO1 | 1 | 97 | 287 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID"=10000)
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com