《SQL語句的執(zhí)行過程》由會(huì)員分享,可在線閱讀,更多相關(guān)《SQL語句的執(zhí)行過程(28頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,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ù)
2、據(jù)庫中數(shù)據(jù)所執(zhí)行的語句。這些語句包括SELECT、INSERT、MERGE、UPDATE和DELETE命令,DML,(數(shù)據(jù)操縱語言),5,Oracle,執(zhí)行一條語句從開始到結(jié)束經(jīng)過,4,個(gè)步驟:,分析,對(duì)提交的語句進(jìn)行語法和語義檢查,優(yōu)化,生成一個(gè)可在數(shù)據(jù)庫中用來執(zhí)行語句的最佳計(jì)劃,行資源生成,為會(huì)話取得最佳計(jì)劃和建立執(zhí)行計(jì)劃,語句執(zhí)行,完成實(shí)際執(zhí)行查詢的行資源生成步驟的輸出,語句執(zhí)行過程,6,語法分析,查詢是不是合法的語句,語義分析,如果是合法的語句,還需要檢查是否具有訪問權(quán)限、訪問的列是否在所訪問的表中、是否存在歧義,共享池檢查,如果是,DML,語句還需要進(jìn)行共享池檢查,此語句是否已經(jīng)被其
3、他用戶分析過且,Oracle,可重用已經(jīng)執(zhí)行的工作,如果是就進(jìn)行軟分析,如果不是就進(jìn)行硬分析。,DDL,總是硬分析,從不重用,分析,7,共享池概念是,Oracle,體系結(jié)構(gòu)的一個(gè)關(guān)鍵成分。共享池是,Oracle,共享全局區(qū)(,SGA,)中的一塊內(nèi)存,其中庫高速緩存區(qū)存放以前執(zhí)行過的,SQL,語句、,PL/SQL,代碼,數(shù)據(jù)字典高速緩存區(qū)存放字典信息,硬分析,軟分析,共享池檢查,8,分析查詢,檢查語法,驗(yàn)證語義,計(jì)算散列值,找到一個(gè)匹配,驗(yàn)證存在一個(gè)與我們的查詢完全相同的查詢(引用相同的對(duì)象),確認(rèn)我們具有訪問所有引用對(duì)象的必須的權(quán)限,驗(yàn)證語句在相同的環(huán)境中執(zhí)行,如果是軟分析就直接跳過下面的優(yōu)化
4、和行資源生成這一重要步驟,硬分析和軟分析,9,所有,DML,語句第一次提交給,Oracle,時(shí),在它們的生存期中至少要優(yōu)化一次。優(yōu)化發(fā)生在硬分析中。語句義上和語法上完全相同,且執(zhí)行環(huán)境也相同的語句的執(zhí)行可以利用以前硬分析的工作。在此情形下,對(duì)它們進(jìn)行軟分析。,硬分析包括查詢優(yōu)化步驟。這是一種費(fèi)勁的、,CPU,密集型的處理過程,所花的時(shí)間可能比語句的實(shí)際執(zhí)行時(shí)間還要長。,查詢優(yōu)化工作是要找到可能是最好的執(zhí)行計(jì)劃,優(yōu)化和行資源生成,10,基于規(guī)則的優(yōu)化程序(,RBO,),這種優(yōu)化程序基于一組規(guī)則建立查詢計(jì)劃。它不考慮對(duì)象尺寸、列的基數(shù)、數(shù)據(jù)的分布、排序區(qū)尺寸以及其它因素。查詢優(yōu)化只能利用已經(jīng)編好的
5、規(guī)則。,基于成本的優(yōu)化程序(,CBO,),這種優(yōu)化程序根據(jù)收集的實(shí)際訪問數(shù)據(jù)的統(tǒng)計(jì)信息對(duì)查詢進(jìn)行優(yōu)化。在確定最合適的計(jì)劃是,它將使用行數(shù)、數(shù)據(jù)集的尺寸以及許多其他信息。,CBO,將生成許多(或許數(shù)千)可能的查詢計(jì)劃(解決查詢的預(yù)備途徑),并給每個(gè)查詢計(jì)劃賦予一個(gè)數(shù)值成本。采用具有最低成本的查詢計(jì)劃,優(yōu)化程序模式,11,優(yōu)化之后就是行資源生成,行資源生成器是,Oracle,中的一個(gè)軟件,它接受優(yōu)化程序的輸出,將它格式化為實(shí)際的執(zhí)行計(jì)劃。,例如:在使用,SQL*PLUS,中的,AUTOTRACE,實(shí)用程序時(shí),它打印查詢計(jì)劃,行資源生成,12,語句執(zhí)行的最后步驟是利用資源生成器的輸出實(shí)際執(zhí)行語句。它
6、是,DML,執(zhí)行中唯一的強(qiáng)制性的步驟??梢蕴^分析、優(yōu)化和行資源生成步驟。反復(fù)執(zhí)行語句。因?yàn)檫@是目前為止最高效的方法,只要有可能,我們都希望建立符合“分析一次,執(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
7、0 72673,- - - - - - - -,total 4880 0.93 0.98 0 7973 29 72696,count,:提供,OCI,過程的執(zhí)行次數(shù),CPU,: 提供執(zhí)行,CPU,所花的時(shí)間單位是秒,Elapsed,:提供了執(zhí)行時(shí)所花的時(shí)間。單位是秒。這個(gè)參數(shù)值等于用戶響應(yīng)時(shí)間,Disk,:提供緩存區(qū)從磁盤讀取的次數(shù),Query,:以一致性模式從緩存區(qū)獲得數(shù)據(jù)的次數(shù),Current,:以當(dāng)前模式從緩存區(qū)獲得數(shù)據(jù)的次數(shù),ROWs,: 返回調(diào)用或執(zhí)行調(diào)用時(shí),處理的數(shù)據(jù)行的數(shù)量。,14,10:34:55 SQL select * from dept;,Elapsed: 00:00:0
8、0.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),Statisti
9、cs,-,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,Execut
10、ion 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 recu
11、rsive 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:
12、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,-,-
13、 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
14、 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
15、 (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
16、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,用于存儲(chǔ),最近執(zhí)行的,SQL,語句,最近使用的數(shù)據(jù)定義,包括的內(nèi)存結(jié)構(gòu),庫高速緩存,數(shù)據(jù)字典高
17、速緩存,共享池,21,庫高速緩存包括以下兩個(gè)結(jié)構(gòu):,共享,SQL,:共享,SQL,為針對(duì)數(shù)據(jù)庫運(yùn)行的,SQL,語句存儲(chǔ)并共享執(zhí)行計(jì)劃和 語法分析樹。下次運(yùn)行同一,SQL,語句時(shí),這個(gè)語句就能利用共享,SQL,提供的語法分析信息來加快其執(zhí)行速度。要確保,SQL,語句隨時(shí)可以使用共享,SQL,區(qū),文本、方案和綁定變量必須完全相同。,共享,PL/SQL,:共享,PL/SQL,區(qū)存儲(chǔ)并共享最近執(zhí)行的,PL/SQL,語句。經(jīng)過語法分析和編譯的程序單元和過程(函數(shù)、程序包和觸發(fā)器)都存儲(chǔ)在這個(gè)區(qū)中,庫高速緩存,22,數(shù)據(jù)庫中最近使用的定義的集合,包括與數(shù)據(jù)庫文件、表、索引、列、用戶、權(quán)限和其它數(shù)據(jù)庫對(duì)象相
18、關(guān)的信息,在語法分析階段,服務(wù)器進(jìn)程會(huì)在數(shù)據(jù)字典中查找用于解析對(duì)象名和驗(yàn)證訪問的信息,將數(shù)據(jù)字典信息高速緩存到內(nèi)存中,可縮短查詢和,DML,的響應(yīng)時(shí)間,數(shù)據(jù)字典高速緩存,23,存儲(chǔ)已從數(shù)據(jù)文件中檢索到的數(shù)據(jù)塊的副本,能夠大幅提高獲取和更新數(shù)據(jù)時(shí)的性能,通過,LRU,算法管理,處理查詢時(shí),,Oracle,服務(wù)器進(jìn)程在數(shù)據(jù)庫緩沖區(qū)高速緩存中查找任何所需的塊。如果未在數(shù)據(jù)庫緩沖區(qū)高速緩存中找到這個(gè)塊,服務(wù)器進(jìn)程就從數(shù)據(jù)文件讀取這個(gè)塊,并在數(shù)據(jù)庫緩沖區(qū)高速緩存中放置一個(gè)副本。由于對(duì)同一個(gè)塊的后續(xù)請(qǐng)求可以在內(nèi)存中找到這個(gè)塊,因此這些請(qǐng)求可能不需要進(jìn)行物理讀取。,數(shù)據(jù)庫緩沖區(qū)高速緩存,24,Oracle
19、服務(wù)器使用LRU (最近最少使用算法)算法來釋放近期未被訪的緩沖區(qū),以便在數(shù)據(jù)庫緩沖區(qū)高速緩存中為新塊騰出空間,25,記錄對(duì)數(shù)據(jù)庫數(shù)據(jù)塊所做的全部更改,主要用于恢復(fù),其中記錄的更改稱作重做條目,重做條目包含用于重新構(gòu)造或重做更改的信息,重做日志緩沖區(qū)是一個(gè)循環(huán)緩沖區(qū),它包含對(duì)數(shù)據(jù)文件塊所做的各種更改。此信息存儲(chǔ)在重做條目中。重做條目包含將數(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,