




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
SQLSelect語句完整的執(zhí)行順序:1、from子句組裝來自不同數(shù)據(jù)源的數(shù)據(jù);2、where子句基于指定的條件對記錄行進行篩選;3、groupby子句將數(shù)據(jù)劃分為多個分組;4、使用聚集函數(shù)進行計算;5、使用having子句篩選分組;6、計算所有的表達式;7、使用orderby對結果集進行排序。另外:一個查詢語句各個部分的執(zhí)行順序:--8)SELECT(9)DISTINCT(11)<TOP_specification><select_list>--(1)FROM<left_table>--(3) <join_type>JOIN<right_table>--(2) ON<join_condition>--(4)WHERE<where_condition>--(5)GROUPBY<group_by_list>--(6)WITH{CUBE|ROLLUP}--(7)HAVING<having_condition>--(10)ORDERBY<order_by_list>SQLSelect語句完整的執(zhí)行順序2008-05-3012:09SQLSelect語句完整的執(zhí)行順序:1、from子句組裝來自不同數(shù)據(jù)源的數(shù)據(jù);2、where子句基于指定的條件對記錄行進行篩選;3、groupby子句將數(shù)據(jù)劃分為多個分組;4、使用聚集函數(shù)進行計算;5、使用having子句篩選分組;以下結論是通過在SqlServer2000上的實驗得出的結論,也可通過查看估計的執(zhí)行計劃(Ctrl+L)來查看執(zhí)行順序。1?先執(zhí)行等號(=)左邊是變量的表達式(A類),再執(zhí)行等號(=)左邊是列名的表達式(B類)。例:updatetablenamesetcolumnName=@variable,@variable=@variable+1先執(zhí)行@variable=@variable+1,再執(zhí)行columnName=@variable2.如果有多個A類(或B類)表達式,按從左到右順序執(zhí)行A類(或B類)表達式。例:updatetablenamesetcolumnName=@variable,@variable=@variable+1,@variable=2*@variable先執(zhí)行@variable=@variable+1,再執(zhí)行@variable=2*@variable,最后執(zhí)行columnName=@variable3.列名所代表的值永遠是原值。例:updatetablenamesetcolumnName=colunName+1,columnNameBagroupby在select語句中可以使用groupby子句將行劃分成較小的組,然后,使用聚組函數(shù)返回每一個組的匯總信息,另外,可以使用having子句限制返回的結果集。groupby子句可以將查詢結果分組,并返回行的匯總信息Oracle按照groupby子句中指定的表達式的值分組查詢結果。在帶有groupby子句的查詢語句中,在select列表中指定的列要么是groupby子句中指定的列,要么包含聚組函數(shù)selectmax(sal),jobempgroupbyjob;(注意max(sal),job的job并非一定要出現(xiàn),但有意義)查詢語句的select和groupby,having子句是聚組函數(shù)唯一出現(xiàn)的地方,在where子句中不能使用聚組函數(shù)。selectdeptno,sum(sal)fromempwheresal>1200groupbydeptnohavingsum(sal)>8500orderbydeptno;當在gropuby子句中使用having子句時,查詢結果中只返回滿足having條件的組。在一個sql語句中可以有where子句和having子句。having與where子句類似,均用于設置限定條件where子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),條件中不能包含聚組函數(shù),使用where條件顯示特定的行。having子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),條件中經(jīng)常包含聚組函數(shù),使用having條件顯示特定的組,也可以使用多個分組標準進行分組。查詢每個部門的每種職位的雇員數(shù)selectdeptno,job,count(*)fromempgroupbydeptno,job;OracleSQL性能優(yōu)化技巧選用適合的ORACLE優(yōu)化器ORACLE的優(yōu)化器共有3種A、RULE(基于規(guī)則)b、COST(基于成本)c、CHOOSE(選擇性)設置缺省的優(yōu)化器,可以通過對init.ora文件中OPTIMIZER_MODE參數(shù)的各種聲明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS。你當然也在SQL句級或是會話(session)級對其進行覆蓋。為了使用基于成本的優(yōu)化器(CBO,Cost-BasedOptimizer),你必須經(jīng)常運行analyze命令,以增加數(shù)據(jù)庫中的對象統(tǒng)計信息(objectstatistics)的準確性。如果數(shù)據(jù)庫的優(yōu)化器模式設置為選擇性(CHOOSE),那么實際的優(yōu)化器模式將和是否運行過analyze命令有關。如果table已經(jīng)被analyze過,優(yōu)化器模式將自動成為CBO,反之,數(shù)據(jù)庫將采用RULE形式的優(yōu)化器。在缺省情況下,ORACLE采用CHOOSE優(yōu)化器,為了避免那些不必要的全表掃描(fulltablescan),你必須盡量避免使用CHOOSE優(yōu)化器,而直接采用基于規(guī)則或者基于成本的優(yōu)化器。訪問Table的方式ORACLE采用兩種訪問表中記錄的方式:A、 全表掃描全表掃描就是順序地訪問表中每條記錄。ORACLE采用一次讀入多個數(shù)據(jù)塊(databaseblock)的方式優(yōu)化全表掃描。B、 通過ROWID訪問表你可以采用基于ROWID的訪問方式情況,提高訪問表的效率,ROWID包含了表中記錄的物理位置信息。ORACLE采用索引(INDEX)實現(xiàn)了數(shù)據(jù)和存放數(shù)據(jù)的物理位置(ROWID)之間的聯(lián)系。通常索引提供了快速訪問ROWID的方法,因此那些基于索引列的查詢就可以得到性能上的提高。共享SQL語句為了不重復解析相同的SQL語句,在第一次解析之后,ORACLE將SQL語句存放在內存中。這塊位于系統(tǒng)全局區(qū)域SGA(systemglobalarea)的共享池(sharedbufferpool)中的內存可以被所有的數(shù)據(jù)庫用戶共享。因此,當你執(zhí)行一個SQL語句(有時被稱為一個游標)時,如果它和之前的執(zhí)行過的語句完全相同,ORACLE就能很快獲得已經(jīng)被解析的語句以及最好的執(zhí)行路徑。ORACLE的這個功能大大地提高了SQL的執(zhí)行性能并節(jié)省了內存的使用??上У氖荗RACLE只對簡單的表提供高速緩沖(cachebuffering),這個功能并不適用于多表連接查詢。數(shù)據(jù)庫管理員必須在init.ora中為這個區(qū)域設置合適的參數(shù),當這個內存區(qū)域越大,就可以保留更多的語句,當然被共享的可能性也就越大了。當你向ORACLE提交一個SQL語句,ORACLE會首先在這塊內存中查找相同的語句。這里需要注明的是,ORACLE對兩者采取的是一種嚴格匹配,要達成共享,SQL語句必須完全相同(包括空格,換行等)。數(shù)據(jù)庫管理員必須在init.ora中為這個區(qū)域設置合適的參數(shù),當這個內存區(qū)域越大,就可以保留更多的語句,當然被共享的可能性也就越大了。共享的語句必須滿足三個條件:A、 字符級的比較:當前被執(zhí)行的語句和共享池中的語句必須完全相同。B、 兩個語句所指的對象必須完全相同:C、兩個SQL語句中必須使用相同的名字的綁定變量(bindvariables)o選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效)ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最后的表(基礎表drivingtable)將被最先處理。在FROM子句中包含多個表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎表。當ORACLE處理多個表時,會運用排序及合并的方式連接它們。首先,掃描第一個表(FROM子句中最后的那個表)并對記錄進行派序,然后掃描第二個表(FROM子句中最后第二個表),最后將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合并。如果有3個以上的表連接查詢,那就需要選擇交叉表(intersectiontable)作為基礎表,交叉表是指那個被其他表所引用的表。WHERE子句中的連接順序ORACLE采用自下而上的順序解析WHERE子句,根據(jù)這個原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在WHERE子句的末尾。6.SELECT子句中避免使用’*'當你想在SELECT子句中列出所有的COLUMN時,使用動態(tài)SQL列引用’*'是一個方便的方法。不幸的是,這是一個非常低效的方法。實際上,ORACLE在解析的過程中,會將'*'依次轉換成所有的列名,這個工作是通過查詢數(shù)據(jù)字典完成的,這意味著將耗費更多的時間。減少訪問數(shù)據(jù)庫的次數(shù)當執(zhí)行每條SQL語句時,ORACLE在內部執(zhí)行了許多工作:解析SQL語句,估算索引的利用率,綁定變量,讀數(shù)據(jù)塊等等。由此可見,減少訪問數(shù)據(jù)庫的次數(shù),就能實際上減少ORACLE的工作量。使用DECODE函數(shù)來減少處理時間使用DECODE函數(shù)可以避免重復掃描相同記錄或重復連接相同的表。整合簡單,無關聯(lián)的數(shù)據(jù)庫訪問如果你有幾個簡單的數(shù)據(jù)庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關系)刪除重復記錄用TRUNCATE替代DELETE當刪除表中的記錄時,在通常情況下,回滾段(rollbacksegments)用來存放可以被恢復的信息。如果你沒有COMMIT事務,ORACLE會將數(shù)據(jù)恢復到刪除之前的狀態(tài)(準確地說是恢復到執(zhí)行刪除命令之前的狀況)。而當運用TRUNCATE時,回滾段不再存放任何可被恢復的信息。當命令運行后,數(shù)據(jù)不能被恢復。因此很少的資源被調用,執(zhí)行時間也會很短。盡量多使用COMMIT只要有可能,在程序中盡量多使用COMMIT,這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少COMMIT所釋放的資源:A、 回滾段上用于恢復數(shù)據(jù)的信息。B、 被程序語句獲得的鎖。C、 redologbuffer中的空間。D、 ORACLE為管理上述3種資源中的內部花費。計算記錄條數(shù)和一般的觀點相反,count(*)比count(1)稍快,當然如果可以通過索引檢索,對索引列的計數(shù)仍舊是最快的。例如COUNT(EMPNO)用Where子句替換HAVING子句避免使用HAVING子句,HAVING只會在檢索出所有記錄之后才對結果集進行過濾。這個處理需要排序,總計等操作。如果能通過WHERE子句限制記錄的數(shù)目,那就能減少這方面的開銷。減少對
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車發(fā)電機及充電系統(tǒng)設計與制造考核試卷
- 豬的飼養(yǎng)飼養(yǎng)技術培訓與指導考核試卷
- 危險廢物處理行業(yè)監(jiān)管考核試卷
- 機場航站樓設計與旅客流線優(yōu)化考核試卷
- 全媒體運營師新技術應用案例的試題及答案
- 全媒體運營師應對快速變化的策略試題及答案
- 家長育兒信心提升技巧試題及答案
- 如何做好信息化物流師的職業(yè)規(guī)劃試題及答案
- 朋友聚會年會發(fā)言稿簡短
- 管理人員安全培訓考試題及參考答案(培優(yōu)B卷)
- 幼兒園畢業(yè)照拍攝方案
- 醫(yī)學檢驗、醫(yī)學影像檢查結果互認制度測試題
- 江西美術出版社七年級下冊圖形創(chuàng)意設計
- 燃氣管道工程施工安全管理培訓
- 初中數(shù)學九年級上冊 試卷講評(市一等獎)
- 從趙紫宸的神學思想看基督教與中國社會之關系
- 船用VHF通信設備
- 紅樓夢二十三回內容概括
- 急診科的喉頭水腫處理
- 勞務投標技術標
- 閃耀明天 二聲部合唱簡譜
評論
0/150
提交評論