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語句
| |
| 分析
| |
| 定義
------------------------ |
|
------------------------- 綁定變量
| |
| 捆綁
--------------- ----------- |
|
并行處理
|
執行查詢
|
返回結果
|
關閉游標
新聞熱點
疑難解答