一般來說,數(shù)據(jù)庫處理SQL都會(huì)經(jīng)過三個(gè)過程:分析、執(zhí)行、返回結(jié)果,比如COGNOS ReportNet通過拖放式完成表現(xiàn)層后,還是會(huì)自動(dòng)生成SQL,然后將SQL傳遞到ORACLE進(jìn)行處理。
1。分析
分析是處理SQL語句的第一步,它是SQL語句處理過程較為重要的一步,它又包含幾個(gè)方面:
(1)語法分析,oracel是采用數(shù)據(jù)庫常用的自底向上的分析方法,包含檢查語法規(guī)范,命名規(guī)范,它是處理SQL語句中最消耗時(shí)間且代價(jià)最高的步驟,主要表現(xiàn)在綁定變量和存儲(chǔ)過程等方面:
A.綁定變量:這也是為什么使用在某種情況下綁定變量方式會(huì)比非綁定方式效率和性能高出幾倍,主要是綁定變量只會(huì)編譯一次,隨后就會(huì)把查詢計(jì)劃存儲(chǔ)在一個(gè)共享池里,以便以后獲取和重用這個(gè)查詢計(jì)劃。
B.存儲(chǔ)過程:存儲(chǔ)過程比一般的SQL語句要快,就是它不用再次編譯,而且還可以利用數(shù)據(jù)庫里許多特性,使得它的速度會(huì)比一般SQL語句快很多
(2)語義分析,學(xué)過編譯原理的都知道,這一步是非常重要的,ORACLE主要是分析SQL語句格式是否正確,各個(gè)對象是否存在,以及它是否有足夠的權(quán)限執(zhí)行
(3)視圖轉(zhuǎn)換,它會(huì)將涉及的視圖的查詢語句轉(zhuǎn)換為較為簡單的等效連接表達(dá)式,有些人認(rèn)為視圖一定執(zhí)行速度會(huì)比使用表要快,其實(shí)不一定的,主要具體情況具體分析,只要把這篇文章真正理解,自己分析是不困難的;
(4)表達(dá)式轉(zhuǎn)換。將復(fù)雜的SQL表達(dá)式轉(zhuǎn)換為相應(yīng)的對基表的查詢語句。寫SQL的標(biāo)準(zhǔn)
A.不要再WHERE字句中進(jìn)行計(jì)算,如SELECT AT_ID FROM ARTICLE WHERE AT_ID >10*10000 AND AT_ID<(10+1)*10000是不允許的就是這個(gè)原理
B.注意數(shù)據(jù)類型的匹配
SELECT BK_ID FROM BOOK WHERE BK_PRICE>30 就比不上SELECT BK_ID FROM BOOK WHERE BK_PRICE>30.00好啦
(5)選擇優(yōu)化器,學(xué)過編譯原理時(shí)候就知道,使用不用的優(yōu)化器是會(huì)有不同的執(zhí)行效率,當(dāng)然,最好是能根據(jù)批量的SQL自己編一個(gè)特定的優(yōu)化器
(6)選擇連接方式。INFORMIX就有簡單的歸并連接 和排序-歸并連接技術(shù)之分,主要看是否使用索引的問題。
(7)選擇連接順序。多表連接,oracle選擇那一個(gè)對表先連接,并選擇源數(shù)據(jù)表
(8)選擇數(shù)據(jù)搜索路徑,根據(jù)以上條件選擇合適的數(shù)據(jù)搜蘇路徑,如選用全表搜索還是利用索引或是其他方式搜索
(9)到SQL中為該SQL語句找到一個(gè)共享SQL區(qū),如已經(jīng)有共享SQL區(qū),則直接執(zhí)行共享區(qū)內(nèi)容。
2。執(zhí)行
主要在于使用UPDATE和DELETE語句時(shí),必須將行鎖定,以免其他用戶修改。ORACLE先從數(shù)據(jù)庫緩沖區(qū)中尋找是否存在所要的數(shù)據(jù)塊,如果存在,就直接讀或修改,否則從物理文件中讀到數(shù)據(jù)庫緩沖區(qū)中。
3。返回結(jié)果
對SELECT 語句需要返回結(jié)果的語句,首先看是否需要排序,需要,則排序后返回給用戶,然后根據(jù)內(nèi)存的大小不同,可以一次取出一行數(shù)據(jù),一可以一次取一組數(shù)據(jù)。這時(shí),可能要用到數(shù)據(jù)結(jié)構(gòu)中的外部排序,并歸排序等算法,所以如內(nèi)存允許的話,盡量大會(huì)提高性能的;
最后總結(jié)一下經(jīng)用使用的SELECT的處理步驟:
打開游標(biāo)
|
---------查看共享SQL區(qū),是否有相同的SQL語句
| |
| 分析
| |
| 定義
------------------------ |
|
------------------------- 綁定變量
| |
| 捆綁
--------------- ----------- |
|
并行處理
|
執(zhí)行查詢
|
返回結(jié)果
|
關(guān)閉游標(biāo)
轉(zhuǎn)載:http://blog.csdn.net/wonth/archive/2007/05/06/1598446.aspx