SQL語句的執(zhí)行過程
,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,Oracle,數(shù)據(jù)庫內(nèi)部培訓(xùn)資料,*,SQL,語句的執(zhí)行過程,以及數(shù)據(jù)庫內(nèi)存結(jié)構(gòu),1, SQL語句的執(zhí)行過程 數(shù)據(jù)庫的內(nèi)存結(jié)構(gòu),2,DDL,(數(shù)據(jù)定義語言),DML,(數(shù)據(jù)操縱語言),SQL語句的類型,3,修改,Oracle,數(shù)據(jù)字典所執(zhí)行的語句。它們是創(chuàng)建表、增加用戶、刪除表中的列、創(chuàng)建觸發(fā)器等的語句,例如:,CREATE TABLE,、,CREATE USER,、,CREATE PACKAGE,、,ALTER TABLE,、,CREATE PROCEDURE,DDL,(數(shù)據(jù)定義語言),4,訪問和修改數(shù)據(jù)庫中數(shù)據(jù)所執(zhí)行的語句。這些語句包括SELECT、INSERT、MERGE、UPDATE和DELETE命令,DML,(數(shù)據(jù)操縱語言),5,Oracle,執(zhí)行一條語句從開始到結(jié)束經(jīng)過,4,個步驟:,分析,對提交的語句進(jìn)行語法和語義檢查,優(yōu)化,生成一個可在數(shù)據(jù)庫中用來執(zhí)行語句的最佳計劃,行資源生成,為會話取得最佳計劃和建立執(zhí)行計劃,語句執(zhí)行,完成實際執(zhí)行查詢的行資源生成步驟的輸出,語句執(zhí)行過程,6,語法分析,查詢是不是合法的語句,語義分析,如果是合法的語句,還需要檢查是否具有訪問權(quán)限、訪問的列是否在所訪問的表中、是否存在歧義,共享池檢查,如果是,DML,語句還需要進(jìn)行共享池檢查,此語句是否已經(jīng)被其他用戶分析過且,Oracle,可重用已經(jīng)執(zhí)行的工作,如果是就進(jìn)行軟分析,如果不是就進(jìn)行硬分析。,DDL,總是硬分析,從不重用,分析,7,共享池概念是,Oracle,體系結(jié)構(gòu)的一個關(guān)鍵成分。共享池是,Oracle,共享全局區(qū)(,SGA,)中的一塊內(nèi)存,其中庫高速緩存區(qū)存放以前執(zhí)行過的,SQL,語句、,PL/SQL,代碼,數(shù)據(jù)字典高速緩存區(qū)存放字典信息,硬分析,軟分析,共享池檢查,8,分析查詢,檢查語法,驗證語義,計算散列值,找到一個匹配,驗證存在一個與我們的查詢完全相同的查詢(引用相同的對象),確認(rèn)我們具有訪問所有引用對象的必須的權(quán)限,驗證語句在相同的環(huán)境中執(zhí)行,如果是軟分析就直接跳過下面的優(yōu)化和行資源生成這一重要步驟,硬分析和軟分析,9,所有,DML,語句第一次提交給,Oracle,時,在它們的生存期中至少要優(yōu)化一次。優(yōu)化發(fā)生在硬分析中。語句義上和語法上完全相同,且執(zhí)行環(huán)境也相同的語句的執(zhí)行可以利用以前硬分析的工作。在此情形下,對它們進(jìn)行軟分析。,硬分析包括查詢優(yōu)化步驟。這是一種費勁的、,CPU,密集型的處理過程,所花的時間可能比語句的實際執(zhí)行時間還要長。,查詢優(yōu)化工作是要找到可能是最好的執(zhí)行計劃,優(yōu)化和行資源生成,10,基于規(guī)則的優(yōu)化程序(,RBO,),這種優(yōu)化程序基于一組規(guī)則建立查詢計劃。它不考慮對象尺寸、列的基數(shù)、數(shù)據(jù)的分布、排序區(qū)尺寸以及其它因素。查詢優(yōu)化只能利用已經(jīng)編好的規(guī)則。,基于成本的優(yōu)化程序(,CBO,),這種優(yōu)化程序根據(jù)收集的實際訪問數(shù)據(jù)的統(tǒng)計信息對查詢進(jìn)行優(yōu)化。在確定最合適的計劃是,它將使用行數(shù)、數(shù)據(jù)集的尺寸以及許多其他信息。,CBO,將生成許多(或許數(shù)千)可能的查詢計劃(解決查詢的預(yù)備途徑),并給每個查詢計劃賦予一個數(shù)值成本。采用具有最低成本的查詢計劃,優(yōu)化程序模式,11,優(yōu)化之后就是行資源生成,行資源生成器是,Oracle,中的一個軟件,它接受優(yōu)化程序的輸出,將它格式化為實際的執(zhí)行計劃。,例如:在使用,SQL*PLUS,中的,AUTOTRACE,實用程序時,它打印查詢計劃,行資源生成,12,語句執(zhí)行的最后步驟是利用資源生成器的輸出實際執(zhí)行語句。它是,DML,執(zhí)行中唯一的強制性的步驟??梢蕴^分析、優(yōu)化和行資源生成步驟。反復(fù)執(zhí)行語句。因為這是目前為止最高效的方法,只要有可能,我們都希望建立符合“分析一次,執(zhí)行許多次”規(guī)則的應(yīng)用程序。,執(zhí)行,13,OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS,call count cpu elapsed disk query current rows,- - - - - - - -,Parse 12 0.04 0.12 0 2 0 0,Execute 12 0.02 0.04 0 268 29 23,Fetch 4856 0.86 0.81 0 7703 0 72673,- - - - - - - -,total 4880 0.93 0.98 0 7973 29 72696,count,:提供,OCI,過程的執(zhí)行次數(shù),CPU,: 提供執(zhí)行,CPU,所花的時間單位是秒,Elapsed,:提供了執(zhí)行時所花的時間。單位是秒。這個參數(shù)值等于用戶響應(yīng)時間,Disk,:提供緩存區(qū)從磁盤讀取的次數(shù),Query,:以一致性模式從緩存區(qū)獲得數(shù)據(jù)的次數(shù),Current,:以當(dāng)前模式從緩存區(qū)獲得數(shù)據(jù)的次數(shù),ROWs,: 返回調(diào)用或執(zhí)行調(diào)用時,處理的數(shù)據(jù)行的數(shù)量。,14,10:34:55 SQL> select * from dept;,Elapsed: 00:00:00.10,Execution Plan,-,Plan hash value: 3383998547,-,| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |,-,| 0 | SELECT STATEMENT | | 4 | 120 | 3 (0)| 00:00:01 |,| 1 | TABLE ACCESS FULL| DEPT | 4 | 120 | 3 (0)| 00:00:01 |,-,Note,-,- dynamic sampling used for this statement (level=2),Statistics,-,279 recursive calls,0 db block gets,58 consistent gets,8 physical reads,0 redo size,1630 bytes sent via SQL*Net to client,524 bytes received via SQL*Net from client,2 SQL*Net roundtrips to/from client,0 sorts (memory),0 sorts (disk),4 rows processed,15,10:35:00 SQL> /,Elapsed: 00:00:00.02,Execution Plan,-,Plan hash value: 3383998547,-,| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |,-,| 0 | SELECT STATEMENT | | 4 | 120 | 3 (0)| 00:00:01 |,| 1 | TABLE ACCESS FULL| DEPT | 4 | 120 | 3 (0)| 00:00:01 |,-,Note,-,- dynamic sampling used for this statement (level=2),Statistics,-,0 recursive calls,0 db block gets,8 consistent gets,0 physical reads,0 redo size,802 bytes sent via SQL*Net to client,524 bytes received via SQL*Net from client,2 SQL*Net roundtrips to/from client,0 sorts (memory),0 sorts (disk),4 rows processed,16,11:31:43 SQL> l,1* select * from dept order by 1,Elapsed: 00:00:00.03,Execution Plan,-,Plan hash value: 120787663,-,| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |,-,| 0 | SELECT STATEMENT | | 4 | 120 | 4 (25)| 00:00:01 |,| 1 | SORT ORDER BY | | 4 | 120 | 4 (25)| 00:00:01 |,| 2 | TABLE ACCESS FULL| DEPT | 4 | 120 | 3 (0)| 00:00:01 |,-,Note,-,- dynamic sampling used for this statement (level=2),Statistics,-,0 recursive calls,0 db block gets,7 consistent gets,0 physical reads,0 redo size,794 bytes sent via SQL*Net to client,524 bytes received via SQL*Net from client,2 SQL*Net roundtrips to/from client,1 sorts (memory),0 sorts (disk),4 rows processed,17,alter system flush shared_pool;,alter system flush buffer_cache;,Elapsed: 00:00:00.20,Execution Plan,-,Plan hash value: 120787663,-,| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |,-,| 0 | SELECT STATEMENT | | 4 | 120 | 4 (25)| 00:00:01 |,| 1 | SORT ORDER BY | | 4 | 120 | 4 (25)| 00:00:01 |,| 2 | TABLE ACCESS FULL| DEPT | 4 | 120 | 3 (0)| 00:00:01 |,-,Note,-,- dynamic sampling used for this statement (level=2),Statistics,-,1195 recursive calls,0 db block gets,203 consistent gets,32 physical reads,0 redo size,794 bytes sent via SQL*Net to client,524 bytes received via SQL*Net from client,2 SQL*Net roundtrips to/from client,13 sorts (memory),0 sorts (disk),4 rows processed,18,數(shù)據(jù)庫緩沖區(qū)高速緩存,共享池,重做日志緩沖區(qū),Java池(Java Pool),大池(Large Pool),流池(Stream Pool),數(shù)據(jù)庫內(nèi)存結(jié)構(gòu),19,SGA,共享池,Java,池,流池,庫高速緩存,數(shù)據(jù)字典緩存,DB CACHE SIZE,Log Buffer,大池,20,用于存儲,最近執(zhí)行的,SQL,語句,最近使用的數(shù)據(jù)定義,包括的內(nèi)存結(jié)構(gòu),庫高速緩存,數(shù)據(jù)字典高速緩存,共享池,21,庫高速緩存包括以下兩個結(jié)構(gòu):,共享,SQL,:共享,SQL,為針對數(shù)據(jù)庫運行的,SQL,語句存儲并共享執(zhí)行計劃和 語法分析樹。下次運行同一,SQL,語句時,這個語句就能利用共享,SQL,提供的語法分析信息來加快其執(zhí)行速度。要確保,SQL,語句隨時可以使用共享,SQL,區(qū),文本、方案和綁定變量必須完全相同。,共享,PL/SQL,:共享,PL/SQL,區(qū)存儲并共享最近執(zhí)行的,PL/SQL,語句。經(jīng)過語法分析和編譯的程序單元和過程(函數(shù)、程序包和觸發(fā)器)都存儲在這個區(qū)中,庫高速緩存,22,數(shù)據(jù)庫中最近使用的定義的集合,包括與數(shù)據(jù)庫文件、表、索引、列、用戶、權(quán)限和其它數(shù)據(jù)庫對象相關(guān)的信息,在語法分析階段,服務(wù)器進(jìn)程會在數(shù)據(jù)字典中查找用于解析對象名和驗證訪問的信息,將數(shù)據(jù)字典信息高速緩存到內(nèi)存中,可縮短查詢和,DML,的響應(yīng)時間,數(shù)據(jù)字典高速緩存,23,存儲已從數(shù)據(jù)文件中檢索到的數(shù)據(jù)塊的副本,能夠大幅提高獲取和更新數(shù)據(jù)時的性能,通過,LRU,算法管理,處理查詢時,,Oracle,服務(wù)器進(jìn)程在數(shù)據(jù)庫緩沖區(qū)高速緩存中查找任何所需的塊。如果未在數(shù)據(jù)庫緩沖區(qū)高速緩存中找到這個塊,服務(wù)器進(jìn)程就從數(shù)據(jù)文件讀取這個塊,并在數(shù)據(jù)庫緩沖區(qū)高速緩存中放置一個副本。由于對同一個塊的后續(xù)請求可以在內(nèi)存中找到這個塊,因此這些請求可能不需要進(jìn)行物理讀取。,數(shù)據(jù)庫緩沖區(qū)高速緩存,24,Oracle 服務(wù)器使用LRU (最近最少使用算法)算法來釋放近期未被訪的緩沖區(qū),以便在數(shù)據(jù)庫緩沖區(qū)高速緩存中為新塊騰出空間,25,記錄對數(shù)據(jù)庫數(shù)據(jù)塊所做的全部更改,主要用于恢復(fù),其中記錄的更改稱作重做條目,重做條目包含用于重新構(gòu)造或重做更改的信息,重做日志緩沖區(qū)是一個循環(huán)緩沖區(qū),它包含對數(shù)據(jù)文件塊所做的各種更改。此信息存儲在重做條目中。重做條目包含將數(shù)據(jù)恢復(fù)到使用,INSERT,、,UPDATE,、,DELETE,、,CREATE,、,ALTER,、或,DROP,操作進(jìn)行更改前的狀態(tài)所需要的信息。,重做日志緩沖區(qū),26,Statistics,-,25 recursive calls,0 db block gets,2962024 consistent gets,45465 physical reads,0 redo size,3972 bytes sent via SQL*Net to client,531 bytes received via SQL*Net from client,3 SQL*Net roundtrips to/from client,0 sorts (memory),0 sorts (disk),22 rows processed,27,謝謝大家,28,