看了一篇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語句
| |
| 分析
| |
| 定義
------------------------ |
|------------------------- 繫結變數
| |
| **
--------------- ----------- |
|並行處理
|執行查詢
|返回結果
|關閉游標
Lua順序 執行順序
nginx下lua處理階段與使用範圍 例如lua shared dict共享記憶體的申請,只有當nginx重起後,共享記憶體資料才清空,這常用於統計。set by lua 設定乙個變數,常用與計算乙個邏輯,然後返回結果 該階段不能執行output api control api subrequest...
Oracle資料庫Where條件執行順序
1.oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾.例如 低效 select from emp e where sal 50000 and job manager and 25 ...
Oracle資料庫Where條件執行順序
由於sql優化起來比較複雜,並且還會受環境限制,在開發過程中,寫sql必須必須要遵循以下幾點的原則 1.oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾.即 最大地減少資料範圍的條...