當(dāng)向Oracle提交一個(gè)sql命令時(shí),Oracle到底做了哪些事情?對(duì)這個(gè)問題有很好的理解,能幫助你更好的分析sql語句的優(yōu)化。
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、甘泉網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為甘泉等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。執(zhí)行一條sql語句從開始到結(jié)束,需要經(jīng)歷4個(gè)步驟:
分析--對(duì)提交的語句進(jìn)行語法分析、語義分析和共享池檢查。
優(yōu)化--生成一個(gè)可在數(shù)據(jù)庫中用來執(zhí)行語句的最佳計(jì)劃
行資源生成--為會(huì)話取得最佳計(jì)劃并建立執(zhí)行計(jì)劃
語句執(zhí)行--完成實(shí)際執(zhí)行查詢的行資源生成步驟的輸出。對(duì)應(yīng)DDL來說,這一步就是語句的結(jié) 束。對(duì)應(yīng)SELECT來說,這一步是取數(shù)據(jù)的開始。
以上步驟,有的是可以省略的,例如優(yōu)化、行資源生成器階段。這樣可以節(jié)省大量的時(shí)間。
一、分析:
語法分析,sql是否符合語法標(biāo)準(zhǔn)。
SQL> select * form tab; select * form tab * ERROR at line 1: ORA-00923: FROM keyword not found where expected語義分析,假設(shè)sql是合法的,但是它有意義嗎?你要訪問的對(duì)象,你有訪問權(quán)限嗎?查詢的列存在嗎?是否存在歧義等待。
SQL> conn scott/tiger Connected. SQL> select x from dual; select x from dual * ERROR at line 1: ORA-00904: "X": invalid identifier SQL> select * from dba_objects; select * from dba_objects * ERROR at line 1: ORA-00942: table or view does not exist對(duì)于DML語句,還有第三步。
共享池檢查,此語句是否被其他用戶使用過?可以重用已經(jīng)執(zhí)行過的工作嗎?如果是,就是軟解析soft parse,如果否,那就是硬解析。
DDL總是硬解析,語句從不重用。
Shared pool是SGA中的一部分,用來緩存以前執(zhí)行過的sql語句、PLSQL、數(shù)據(jù)字典內(nèi)容的緩存(以行的形式緩存內(nèi)容,而buffer cache是以block的方式緩存內(nèi)容)以及其他許多信息,以供會(huì)話重用。
從技術(shù)上來說,Oracle的語句解析分為兩種:
硬解析--語句通過語句執(zhí)行的每一個(gè)步驟從分析到優(yōu)化,到行資源生成,到語句執(zhí)行。
軟解析--語句通過語句執(zhí)行的某些步驟,特別是跳過優(yōu)化步驟(最昂貴的步驟)。為了執(zhí)行軟解析,必須通過兩個(gè)步驟。首先Oracle必須進(jìn)行語義匹配,查看提交給Oracle的語句是否已經(jīng)被執(zhí)行過。然后,進(jìn)行環(huán)境匹配。比如一個(gè)會(huì)話的初始化參數(shù)optimizer_mode=ALL_ROWS,一個(gè)會(huì)話的初始化參數(shù)optimizer_mode=FIRST_ROWS,這兩個(gè)會(huì)話的環(huán)境就不一樣。
為了開始這個(gè)處理,Oracle必須在Shared pool中尋找語句。為了高效的完成此操作,oracle將每個(gè)提交的sql語句,進(jìn)行hash算法,生成一個(gè)hash_values。oracle使用hash_values查找Shared pool中是否有相同的語句。
一旦找到,Oracle將進(jìn)行語義和環(huán)境檢查,sql語句都相同,難道還有語義不同的嗎?我們看下面的例子。
建立兩個(gè)用戶
2. 賦予用戶權(quán)限
SQL> grant connect ,resource to a; Grant succeeded. SQL> grant connect,resource to b; Grant succeeded.3.啟用一個(gè)會(huì)話
SQL> conn a/a Connected. SQL> create table emp (id int); Table created. SQL> select * from emp; no rows selected4. 啟用另一個(gè)會(huì)話
SQL> conn b/b Connected. SQL> create table emp (id int); Table created. SQL> select * from emp; no rows selected SQL> select * from emp; no rows selected5.啟用另一會(huì)話,使用sys用戶連接,進(jìn)行如下查詢。
SQL> SET LINESIZE 200 SQL> COL SQL_TEXT FOR A50 SQL> SELECT address, executions, sql_text FROM v$sql WHERE UPPER (sql_text) LIKE 'SELECT * FROM EMP'; ADDRESS EXECUTIONS SQL_TEXT ---------------- ---------- -------------------------------------------------- 00000000893DF470 2 select * from emp 00000000893DF470 1 select * from emp SQL>可見,雖然發(fā)出的語句是一樣的,但是語義不同,所以v$sql中會(huì)有兩條記錄。b用戶下,相同的語句執(zhí)行了兩次,因?yàn)檎Z義相同,所以是一條記錄,但是executions是2 。
我們?cè)倏纯矗Z義相同,但是環(huán)境不同,會(huì)是什么結(jié)果。
以上的連接全部退出,新建一個(gè)連接進(jìn)行如下查詢。
SQL> conn / as sysdba Connected. SQL> alter session set optimizer_mode=ALL_ROWS; Session altered. SQL> SELECT * FROM A.EMP; no rows selected SQL> alter session set optimizer_mode=FIRST_ROWS; Session altered. SQL> SELECT * FROM A.EMP; no rows selected查看sql解析情況
SQL> SET LINESIZE 200 SQL> COL SQL_TEXT FOR A50 SQL> select address,executions,sql_text from v$sql where upper(sql_text) like 'SELECT * FROM A.EMP'; ADDRESS EXECUTIONS SQL_TEXT ---------------- ---------- -------------------------------------------------- 0000000091CD7810 1 SELECT * FROM A.EMP 0000000091CD7810 1 SELECT * FROM A.EMP可見,雖然語義相同,但是環(huán)境不同,Oracle也會(huì)當(dāng)成2條語句來解析。
分析總結(jié):
分析階段做了如下操作,語法檢查、計(jì)算散列值、語義檢查、環(huán)境檢查、計(jì)算子游標(biāo)的散列值等。 此外Oracle還可能做了如下步驟:
在Shared pool中查找匹配的hash_value,如果能找到,確認(rèn)訪問對(duì)象的權(quán)限、檢查環(huán)境。生成子游標(biāo)hash_value。如果子游標(biāo)hash_value也能匹配。那么將跳過優(yōu)化和行資源生成。(此部門我們將在游標(biāo)中詳細(xì)討論)
二、優(yōu)化和行資源生成
當(dāng)所有的DML語句第一次提交給Oracle時(shí),在它的生命周期中至少被優(yōu)化一次。優(yōu)化發(fā)生在硬解析中。語義和語法完全相同,并且執(zhí)行環(huán)境也相同的語句的執(zhí)行可以利用以前的硬解析工作。這種情況下,對(duì)他們將進(jìn)行軟解析。
優(yōu)化是一個(gè)費(fèi)勁的、CPU密集型的處理,可能花在優(yōu)化上的時(shí)間比實(shí)際執(zhí)行還要長。優(yōu)化不單耗cpu,還是導(dǎo)致Shared pool 高栓鎖率。優(yōu)化的規(guī)則有兩種
1. 基于規(guī)則的優(yōu)化法則(RBO)
2. 基于成本的優(yōu)化法則(CBO)
優(yōu)化就是根據(jù)優(yōu)化法則,生成各種各樣的執(zhí)行計(jì)劃,并且選擇一個(gè)最好的執(zhí)行計(jì)劃。
行資源生成器是一個(gè)軟件,就是將執(zhí)行計(jì)劃轉(zhuǎn)化成其他部分可以利用的數(shù)據(jù)結(jié)構(gòu)。
三、執(zhí)行
利用行資源生成器輸出的執(zhí)行計(jì)劃結(jié)構(gòu),執(zhí)行具體的步驟。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
本文名稱:Oracle學(xué)習(xí)之性能優(yōu)化(一)SQL語句處理-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://aaarwkj.com/article2/ccdeic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、用戶體驗(yàn)、外貿(mào)建站、網(wǎng)站內(nèi)鏈、App開發(fā)、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容