查詢過程介紹
當一個SQL查詢被執行時,Oracle查詢優化器(query optimizer)會快速計算分步執行計劃,詳細說明它將如何檢索查詢中指定的列值。在計算執行計劃時,優化器決定哪些表和索引用來檢索數據。
如果沒有索引存在,則表本身是可用於滿足查詢結果的唯一訪問路徑。Oralce別無選擇,只能檢查每一行數據檢查是否符合查詢條件(全表掃描-full table scan)。
數據準備
-- 創建一個客戶表存放客戶信息
create table cust
(cust_id number
,last_name varchar2(30)
,first_name varchar2(30));
-- 插入一條數據待查詢數據
insert into cust (cust_id, last_name, first_name) values(1, 'STARK','JIM');
-- 模擬插入100萬客戶信息
insert into cust
select rownum + 1
,dbms_random.string('U',dbms_random.value(3,15)) rand_last_name
,dbms_random.string('U',dbms_random.value(3,15)) rand_first_name
from xmltable('1 to 1000000');
# 創建索引
create index cust_idx1
on cust(last_name);
查看計劃
查看執行計劃時,儘量先收集表的統計信息,否則計劃可能不準
-- 通過以下存儲過程收集表的統計信息
call dbms_stats.gather_table_stats( user, 'CUST' );
PL/SQL Developer Explain plan Window
在PL/SQL Developer
依次點擊File
->new
->Explain plan Window
打開一個執行計劃窗口,在執行計劃窗口編寫需要查看執行計劃的SQL,然後按F8
或F5
快捷鍵查看執行計劃(也可以點擊綠色執行按鈕)
PL/SQL Developer Command Window
在PL/SQL Developer
依次點擊File
->new
->Command Window
打開一個命令窗口,在命令窗口中執行下面的SQL進行執行計劃查詢
-- 生成執行計劃
explain plan for
select cust_id, last_name, first_name
from cust
where last_name = 'STARK';
-- 查看執行計劃
select * from table(dbms_xplan.display(null,null,'BASIC +COST'));
執行流程總結
- 用戶提交查詢請求
- 查詢將傳遞到Oracle服務器進程
- Oracle查詢優化器被調用. 它創建一個包括訪問索引的執行計劃。
- 訪問索引獲得相關數據行的ROWID
- 通過ROWID,定位到數據行所在的數據文件和塊
- 數據行返回到Oracle服務器進程
- Oracle服務器進程將結果返回給用戶
參考:Expert Oracle Indexing and Access Paths