oracle|過程|語句
07年開始,換了一家公司,資料庫使用的是ORACLE10G,以前一直使用的是INFORMIX和MSSERVER,感覺ORACLE功能還真強大,比Informi和msserver都好用多啦,體繫結構和管理方式都有了許多變化,但使用兩個月下來,其實資料庫的基本原理是一樣的,現結合以前的工作經驗和學習的資料,總結ORACLE資料庫的一些知識,今天先寫Oracle SQL語句處理過程:
一般來說,資料庫處理SQL都會經過三個過程:分析、執行、返回結果,比如COGNOS ReportNet通過拖放式完成表現層後,還是會自動產生SQL,然後將SQL傳遞到ORACLE進行處理。
1。分析
分析是處理SQL語句的第一步,它是SQL語句處理過程較為重要的一步,它又包含幾個方面:
(1)文法分析,oracel是採用資料庫常用的自底向上的分析方法,包含檢查文法規範,命名規範,它是處理SQL語句中最消耗時間且代價最高的步驟,主要表現在綁定變數和預存程序等方面:
A.綁定變數:這也是為什麼使用在某種情況下綁定變數方式會比非綁定方式效率和效能高出幾倍,主要是綁定變數只會編譯一次,隨後就會把查詢計劃儲存在一個共用池裡,以便以後擷取和重用這個查詢計劃。
B.預存程序:預存程序比一般的SQL語句要快,就是它不用再次編譯,而且還可以利用資料庫裡許多特性,使得它的速度會比一般SQL語句快很多
(2)語義分析,學過編譯原理的都知道,這一步是非常重要的,ORACLE主要是分析SQL語句格式是否正確,各個對象是否存在,以及它是否有足夠的許可權執行
(3)視圖轉換,它會將涉及的視圖的查詢語句轉換為較為簡單的等效串連運算式,有些人認為視圖一定執行速度會比使用表要快,其實不一定的,主要具體情況具體分析,只要把這篇文章真正理解,自己分析是不困難的;
(4)運算式轉換。將複雜的SQL運算式轉換為相應的對基表的查詢語句。寫SQL的標準
A.不要再WHERE字句中進行計算,如SELECT AT_ID FROM ARTICLE WHERE AT_ID >10*10000 AND AT_ID<(10+1)*10000是不允許的就是這個原理
B.注意資料類型的匹配
SELECT BK_ID FROM BOOK WHERE BK_PRICE>30 就比不上SELECT BK_ID FROM BOOK WHERE BK_PRICE>30.00好啦
(5)選擇最佳化器,學過編譯原理時候就知道,使用不用的最佳化器是會有不同的執行效率,當然,最好是能根據批量的SQL自己編一個特定的最佳化器
(6)選擇串連方式。INFORMIX就有簡單的歸併串連 和排序-歸併串連技術之分,主要看是否使用索引的問題。
(7)選擇串連順序。多表串連,oracle選擇那一個對錶先串連,並選擇來源資料表
(8)選擇資料搜尋路徑,根據以上條件選擇合適的資料搜蘇路徑,如選用全表搜尋還是利用索引或是其他方式搜尋
(9)到SQL中為該SQL語句找到一個共用SQL區,如已經有共用SQL區,則直接執行共用區內容。
2。執行
主要在於使用UPDATE和DELETE語句時,必須將行鎖定,以免其他使用者修改。ORACLE先從資料庫緩衝區中尋找是否存在所要的資料區塊,如果存在,就直接讀或修改,否則從物理檔案中讀到資料庫緩衝區中。
3。返回結果
對SELECT 語句需要返回結果的語句,首先看是否需要排序,需要,則排序後返回給使用者,然後根據記憶體的大小不同,可以一次取出一行資料,一可以一次取一組資料。這時,可能要用到資料結構中的外部排序,並歸排序等演算法,所以如記憶體允許的話,盡量大會提高效能的;
最後總結一下經用使用的SELECT的處理步驟:
開啟遊標
|
---------查看共用SQL區,是否有相同的SQL語句
| |
| 分析
| |
| 定義
------------------------ |
|
------------------------- 綁定變數
| |
| 捆綁
--------------- ----------- |
|
平行處理
|
執行查詢
|
返回結果
|
關閉遊標