摘 要 本文從ORACLE內(nèi)存角度簡單討論了SQL語句的優(yōu)化方法。SQL語句由于其簡單和容易上手致使大家對它的研究不對,其實(shí)無論是DBA還是前臺程序員都應(yīng)該有一些書寫高效SQL語句的經(jīng)驗(yàn),這對于應(yīng)用設(shè)計(jì)和系統(tǒng)日常維護(hù)都有很大幫助。
關(guān)鍵詞 SQL語句優(yōu)化 綁定變量 物化視圖
中圖分類號:TP312 文獻(xiàn)標(biāo)識碼:A
SQL語言由IBM實(shí)驗(yàn)室的Donald Chamberlin及其同事在1974年定義,被稱為結(jié)構(gòu)化查詢語言(Structured Query Language),現(xiàn)在SQL語言已經(jīng)形成了標(biāo)準(zhǔn)的應(yīng)用和開發(fā)體系。
1 SQL語句的使用
雖然很多數(shù)據(jù)庫都對SQL語句進(jìn)行了再開發(fā)和擴(kuò)展,但是包括SELECT, INSERT, UPDATE, DELETE以及MERGE在內(nèi)的標(biāo)準(zhǔn)的SQL命令仍然可以被用來完成幾乎所有的數(shù)據(jù)庫操作。
SELECT查詢語句用來從一個(gè)或多個(gè)表中或者其他數(shù)據(jù)庫對象中提取數(shù)據(jù)。SELECT 查詢的一般格式是
5 select {[distinct|all] columns | *}
1 from {tables | views | other select}
2 where conditions
3 group by columns
4 having conditions
6 order by columns;
其中,每行代碼前的數(shù)字表示了SELECT語句在ORACLE執(zhí)行順序。在執(zhí)行查詢語句時(shí)是由ORACLE的基于成本的優(yōu)化器(cost-based optimizer,CBO)來負(fù)責(zé)編譯的,因此SELECT查詢語句的執(zhí)行順序和我們的邏輯思維有所不同。從執(zhí)行順序可以直觀的看出,減少FROM語句涉及到的數(shù)據(jù)源數(shù)量,可以大幅減少數(shù)據(jù)訪問量,增加SELECT查詢語句的執(zhí)行速度。
2 硬解析與軟解析
為了不重復(fù)解析相同的語句,在每一次執(zhí)行SQL語句前ORACLE會(huì)去檢查內(nèi)存中是不是存在相同的語句。在第一次解析SQL語句之后,ORACLE將SQL語句存放在系統(tǒng)全局內(nèi)存區(qū)域SGA中。因此,當(dāng)用戶執(zhí)行一個(gè)SQL語句時(shí),如果它和之前執(zhí)行過得語句完全相同,ORACLE會(huì)將取回之前的解析信息并重用,這種解析類型被稱為軟解析。相反的,如果之前沒有執(zhí)行過完全相同的語句,ORACLE會(huì)將它解析執(zhí)行并把解析信息存入SGA中便于以后重用,這種解析類型被稱為硬解析。不難看出,當(dāng)數(shù)據(jù)塊在內(nèi)存中緩存時(shí)的訪問速度要大于通過OS獲取數(shù)據(jù)塊的訪問速度。
3 綁定變量的使用
一個(gè)硬解析不僅僅耗費(fèi)大量的系統(tǒng)資源,更重要的是會(huì)占據(jù)重要的們閂(latch)資源。當(dāng)一個(gè)SQL語句提交后,ORACLE會(huì)首先檢查一下共享緩沖池(shared pool)里有沒有與之完全相同的語句,如果有的話只須執(zhí)行軟解析即可,否則就得進(jìn)行硬解析。有以下兩條SQL語句:
SQL>select * from emp where deptno=10;
SQL>SELECT * FROM EMP WHERE DEPTNO=10;
這兩條語句返回的結(jié)果集是完全相同的,也就是說對于用戶來說這兩條語句執(zhí)行結(jié)果是相同的?,F(xiàn)在來對v$sql表1進(jìn)行查詢。
從返回的結(jié)果可以發(fā)現(xiàn),盡管這兩條語句的結(jié)果是相同的,但是ORACLE認(rèn)為它們是不同的。這是由于在執(zhí)行SQL語句時(shí),ORACLE首先將該語句字符的散列值作為它存放在SGA中的主鍵。當(dāng)執(zhí)行其他語句時(shí),ORACLE會(huì)將執(zhí)行語句的散列值與內(nèi)存中現(xiàn)有的散列值一一比較。在執(zhí)行字符轉(zhuǎn)換散列值時(shí),大寫字母與小寫字母產(chǎn)生的散列值是不同的。當(dāng)使用綁定變量時(shí),即使用戶改變了綁定變量的值,ORACLE還是可以共享這個(gè)語句。
參考文獻(xiàn)
[1] 尹萍.SQL Server數(shù)據(jù)庫性能優(yōu)化[J].計(jì)算機(jī)應(yīng)用與軟件,2005(4).
[2] 胡江奕.基于SQL Server的數(shù)據(jù)庫應(yīng)用系統(tǒng)性能的優(yōu)化[J],2001,37(2).