▌SQL語句執行分3階段:解析(Parse)、執行(Execution)、獲取數據(Fetch)

▌ 我們主要關注Shared pool的3大塊:free、Library cache、row cache
Free |
空閒空間 |
Library cache |
又叫庫緩存,主要緩存SQL語句,以及對應的SQL執行計畫 |
row cache |
又叫字典緩存,緩存字典信息,Oracle DB自身的信息都放在這裡面 (例:DB有多少table、有多少USER、table有多少列、table有多大、列的名字是什麼) |
▌ 查看Oracle 有多少數據字典與其內容涵意
1.開啟官方文檔
文檔連結 http://www.oracle.com/technetwork/cn/indexes/documentation/index.html(這使用10g 第二版)
2.上方Books
Ctrl + F 搜尋Reference 點 HTML進入
3.從2 Static Data Dictionary Views: ALL_ALL_TABLES to ALL_MVIEWS開始後面都是數據字典
▌ 數據字典實例:
1.創建一個table,叫做t1,跟dba_objects一樣
create table t1 as select * from dba_objects;
2.假如我現在要找DB裡有沒有t1,所用到的dba_tables就是數據字典,desc是描述table有多少列,知道有什麼列以後就可以 select更多內容
desc dba_tables;
select table_name,OWNER from dba_tables where table_name like 't1%'
▌查看library cache有多大
select * from v$sgastat a where a.NAME = 'library cache';
▌查看free空間
select * from v$sgastat a where a.pool = 'shared pool' and a.NAME = 'free memory';
▌查看row cache空間
select * from v$sgastat a where a.NAME = 'row cache';
▌硬解析(hard parse)與軟解析(soft parse):
一條SQL語句進入DB後,server process會拿著SQL語句到Shared pool裡的Library cache,到Library cache裡面去看這個SQL語句以前有沒有被解析過,也就是Library cache裡面有沒有這條SQL語句與其對應的執行計畫,如果有的話就進行軟解析,沒有的話進行硬解析
▌硬解析流程(hard parse):
1.判斷語法是否有錯誤
2.SQL語句所涉及的對象存不存在
3.SQL的USER是否有相關的權限
4.產生具體的執行計畫
▌執行計畫(execution plan):
一條SQL語句有多種執行方案,有的消耗資源大速度慢,有的消耗資源小速度快,所以Oracle要在這條SQL語句所對應的多個執行方案,選出最好的方案,作為執行計畫,此為硬解析最重要且最消耗資源的一步
顯示SQL_ID、SQL語句、執行次數
select SQL_ID,sql_text,EXECUTIONS from v$sql where SQL_TEXT like '%放入剛所輸入的SQL語句%';
查看執行計畫
select * from table(dbms_xplan.display_cursor('放入SQL_ID'));
▌軟解析流程(soft parse):
1.2.3.步驟和硬解析相同,軟解析只是做一些常規判斷,並不用從SQL語句所對應的多個執行方案,選出最好的方案,最消耗資源的那步,它沒有執行
▌ 所以我們希望軟解析越多越好,以提升效能
▌ 為什麼row cache要放入Shared pool裡面??
我們在解析的時候,不論是硬解析還是軟解析,驗證了很多自身信息(例:權限信息、對象信息、對象存不存在信息、對象裡面的統計信息等等.....),這些都是字典信息,也就是說會頻繁的訪問數據字典,所以Oracle 乾脆將數據字典信息放進Shared pool裡面去,讓它和Library cache在一起
▌ 顯示軟硬解析的具體狀況
select name,value from v$sysstat where name like 'parse%'
parse time cpu |
解析花費cpu時間 |
parse time elapsed |
解析花費時間 |
parse count (total) |
總共解析次數 |
parse count (hard) |
硬解析次數 |
parse count (failures) |
解析失敗(例:可能是SQL語句寫錯了等等.....) |
▌所有資源作為教學用,無任何商業用途!!
歡迎轉載,但務必註明出處!!