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語句
| || 分析
| || 定義
------------------------|
|-------------------------繫結變數
| || **
--------------------------|
|並行處理
|執行查詢
|返回結果
|關閉游標
SQL語句處理過程
sql優化首先了解sql的執行過程 1.sql語句處理過程 open parse bind execute fetch close 2.sql語句詳細處理過程 dml語句和select查詢語句都會經歷如下過程 2.1.create a cursor 2.2.parse the statement 2...
Oracle SQL語句解析過程
目錄 oracle sql語句解析過程 1 軟硬解析 2 sql解析過程 sql語句在到達oracle例項後,需要先進行解析,分析出最優的執行計畫後,再按照執行計畫,開始執行sql。根據能否復用執行計畫,解析過程可以分析以下兩大類 注意 oracle中只有完全相同的語句,包大小寫 空格 換行都要求一...
USB host處理過程
在usbh core.c中有乙個函式usbh process 這個函式很重要,main 函式每迴圈一次,它就執行一次,它處理所有usb核心狀態的變化,typedef enum host state 根據這個當前狀態 phost gstate 處於以上哪個狀態的不同,做出不同的處理過程。其中最重要的要...