天天看點

SQL select執行順序

sql文法的分析是從右到左 一、sql語句的執行步驟: 1)文法分析,分析語句的文法是否符合規範,衡量語句中各表達式的意義。 2)語義分析,檢查語句中涉及的所有資料庫對象是否存在,且使用者有相應的權限。 3)視圖轉換,将涉及視圖的查詢語句轉換為相應的對基表查詢語句。 4)表達式轉換, 将複雜的 SQL 表達式轉換為較簡單的等效連接配接表達式。 5)選擇優化器,不同的優化器一般産生不同的“執行計劃” 6)選擇連接配接方式, ORACLE 有三種連接配接方式,對多表連接配接 ORACLE 可選擇适當的連接配接方式。 7)選擇連接配接順序, 對多表連接配接 ORACLE 選擇哪一對表先連接配接,選擇這兩表中哪個表做為源資料表。 8)選擇資料的搜尋路徑,根據以上條件選擇合适的資料搜尋路徑,如是選用全表搜尋還是利用索引或是其他的方式。 9)運作“執行計劃” 二、oracle 共享原理: ORACLE将執行過的SQL語句存放在記憶體的共享池(shared buffer pool)中,可以被所有的資料庫使用者共享。 當你執行一個SQL語句(有時被稱為一個遊标)時,如果它和之前的執行過的語句完全相同,ORACLE就能很快獲得已經被解析的語句以及最好的執行路徑.。這個功能大大地提高了SQL的執行性能并節省了記憶體的使用。 三、oracle 語句提高查詢效率的方法: 1:where column in(select * from ... where ...); 2:... where exists (select 'X' from ...where ...); 第二種格式要遠比第一種格式的效率高。 在Oracle中可以幾乎将所有的IN操作符子查詢改寫為使用EXISTS的子查詢。 使用EXIST,Oracle系統會首先檢查主查詢,然後運作子查詢直到它找到第一個比對項, 這就節省了時間Oracle系統在執行IN子查詢時,首先執行子查詢,并将獲得的結果清單存放在在一個加了索引的臨時表中。 避免使用having子句。HAVING 隻會在檢索出所有記錄之後才對結果集進行過濾。 這個處理需要排序,總計等操作。如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷。 四、SQL Select語句完整的執行順序:

SQL語言不同于其他程式設計語言的最明顯特征是處理代碼的順序。在大多資料庫語言中,代碼按編碼順序被處理。但在SQL語句中,第一個被處理的子句式FROM,而不是第一出現的SELECT。SQL查詢處理的步驟序号: (1)  FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) WITH {CUBE | ROLLUP} (7) HAVING <having_condition>   (8) SELECT   (9) DISTINCT  (9) ORDER BY <order_by_list>   (10) <TOP_specification> <select_list> 以上每個步驟都會産生一個虛拟表,該虛拟表被用作下一個步驟的輸入。這些虛拟表對調用者(用戶端應用程式或者外部查詢)不可用。隻有最後一步生成的表才會會給調用者。如果沒有在查詢中指定某一個子句,将跳過相應的步驟。 邏輯查詢處理階段簡介: 1、 FROM:對FROM子句中的前兩個表執行笛卡爾積(交叉聯接),生成虛拟表VT1。 2、 ON:對VT1應用ON篩選器,隻有那些使為真才被插入到TV2。 3、 OUTER (JOIN):如果指定了OUTER JOIN(相對于CROSS JOIN或INNER JOIN),保留表中未找到比對的行将作為外部行添加到VT2,生成TV3。如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到處理完所有的表位置。 4、 WHERE:對TV3應用WHERE篩選器,隻有使為true的行才插入TV4。 5、 GROUP BY:按GROUP BY子句中的列清單對TV4中的行進行分組,生成TV5。 6、 CUTE|ROLLUP:把超組插入VT5,生成VT6。 7、 HAVING:對VT6應用HAVING篩選器,隻有使為true的組插入到VT7。 8、 SELECT:處理SELECT清單,産生VT8。 9、 DISTINCT:将重複的行從VT8中删除,産品VT9。 10、ORDER BY:将VT9中的行按ORDER BY子句中的列清單順序,生成一個遊标(VC10)。 11、TOP:從VC10的開始處選擇指定數量或比例的行,生成表TV11,并傳回給調用者。 where子句中的條件書寫順序 1、基本上對sql性能沒有影響

http://blog.sina.com.cn/s/blog_61c006ea0100mlgq.html

繼續閱讀