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