Oracle查詢執(zhí)行計(jì)劃
執(zhí)行計(jì)劃(Execution Plan)也叫查詢計(jì)劃(Query Plan),它是數(shù)據(jù)庫執(zhí)行SQL語句的具體步驟和過程。SQL查詢語句的執(zhí)行計(jì)劃主要包括:
● 訪問表的方式。數(shù)據(jù)庫通過索引或全表掃描等方式訪問表中的數(shù)據(jù)。
● 多表連接的方式。數(shù)據(jù)庫使用什么連接算法實(shí)現(xiàn)表的連接,包括多個(gè)表的先后訪問順序。
● 分組聚合以及排序等操作的實(shí)現(xiàn)方式。
雖然不同數(shù)據(jù)庫對(duì)于SQL查詢的執(zhí)行過程采用了不同的實(shí)現(xiàn)方式,但是一個(gè)查詢語句大致需要經(jīng)過分析器、優(yōu)化器以及執(zhí)行器的處理并返回最終結(jié)果,同時(shí)還可能利用各種緩存來提高訪問性能。
簡(jiǎn)單來說,一個(gè)查詢語句從客戶端的提交開始,直到服務(wù)器返回最終的結(jié)果,整個(gè)過程大致如圖所示。
首先,客戶端提交SQL語句。在此之前客戶端必須連接到數(shù)據(jù)庫服務(wù)器,圖中的連接器就是負(fù)責(zé)建立和管理客戶端連接的組件。
然后,分析器(解析器)解析SQL語句的各個(gè)組成部分,進(jìn)行語法分析,并檢查SQL語句的語法是否符合規(guī)范。
例如,以下語句中的FROM關(guān)鍵字錯(cuò)寫成了FORM:
在這種情況下,所有的數(shù)據(jù)庫管理系統(tǒng)都會(huì)返回一個(gè)語法錯(cuò)誤。
然后,優(yōu)化器會(huì)利用數(shù)據(jù)庫收集到的統(tǒng)計(jì)信息決定SQL語句的最佳執(zhí)行方式。例如,是通過索引還是通過全表掃描的方式訪問單個(gè)表,使用什么順序連接多個(gè)表,如何實(shí)現(xiàn)數(shù)據(jù)的排序等。
優(yōu)化器是決定查詢性能的關(guān)鍵組件,而數(shù)據(jù)庫的統(tǒng)計(jì)信息是優(yōu)化器判斷的基礎(chǔ)。
最后,執(zhí)行器根據(jù)優(yōu)化之后的執(zhí)行計(jì)劃調(diào)用相應(yīng)的執(zhí)行模塊來獲取數(shù)據(jù),并將結(jié)果返回客戶端。
執(zhí)行計(jì)劃的查看方式
方法一:語句查看
在Oracle數(shù)據(jù)庫中,我們同樣可以使用EXPLAIN PLAN FOR命令生成執(zhí)行計(jì)劃,不過需要執(zhí)行兩條命令:
EXPLAIN PLAN FOR SELECT * FROM T_USER1 t where t.user_name = 'Admin'; SELECT * FROM TABLE(dbms_xplan.display);
使用EXPLAIN PLAN FOR命令生成執(zhí)行計(jì)劃,并將其存儲(chǔ)到系統(tǒng)表PLAN_TABLE中,然后通過一個(gè)查詢語句顯示生成的執(zhí)行計(jì)劃。
其中dbms_xplan.display是一個(gè)Oracle系統(tǒng)函數(shù)。返回的結(jié)果顯示,該語句在Oracle中是通過'SYS_C0016771'索引范圍掃描來查找數(shù)據(jù)的。
方法二:利用工具查看
在常用的Oracle數(shù)據(jù)庫開發(fā)工具PL/SQL中,選擇一段SQL腳本,按F5鍵,即可自動(dòng)顯示該腳本的執(zhí)行計(jì)劃信息,跟方法一查詢出的結(jié)果相同。
在Oracle數(shù)據(jù)庫中,我們可以通過系統(tǒng)表user_indexes和user_ind_columns查詢索引以及相關(guān)的字段信息。
SELECT * FROM user_indexes; SELECT * FROM user_ind_columns;
到此這篇關(guān)于Oracle查詢執(zhí)行計(jì)劃的文章就介紹到這了,更多相關(guān)Oracle查詢執(zhí)行計(jì)劃內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle遠(yuǎn)程連接服務(wù)器出現(xiàn) ORA-12170 TNS:連接超時(shí) 解決辦法
oracle遠(yuǎn)程連接服務(wù)器出現(xiàn) ORA-12170 TNS:連接超時(shí) 解決辦法,需要的朋友可以參考一下2013-03-03oracle數(shù)據(jù)排序后獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式)
項(xiàng)目中用到Oracle分組查詢?nèi)∶拷M排序后的前N條記錄,group?by?只能返回每個(gè)組的單條統(tǒng)計(jì),下面這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)排序后獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式),需要的朋友可以參考下2022-12-12Oracle中查詢表結(jié)構(gòu)的6種方法總結(jié)
工作中查看oracle表結(jié)構(gòu)經(jīng)常會(huì)遇到,下面這篇文章主要給大家介紹了關(guān)于Oracle中查詢表結(jié)構(gòu)的6種方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04RAC cache fusion機(jī)制實(shí)現(xiàn)原理分析
本文將詳細(xì)介紹RAC cache fusion機(jī)制實(shí)現(xiàn)原理,需要了解更多的朋友可以參考下2012-12-12解決Hibernate JPA中insert插入數(shù)據(jù)后自動(dòng)執(zhí)行select last_insert_id()
這篇文章主要介紹了Hibernate JPA中insert插入數(shù)據(jù)后自動(dòng)執(zhí)行select last_insert_id()的解決方法。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12Oracle實(shí)現(xiàn)主鍵字段自增的四種方式
眾所周知MySQL數(shù)據(jù)庫的主鍵自增設(shè)置非常簡(jiǎn)單,任何一個(gè)常用的可視化工具都支持,只要打一下勾就可以開啟主鍵自增了,然而Oracle并沒有那么簡(jiǎn)單,這篇文章主要給大家介紹了關(guān)于Oracle實(shí)現(xiàn)主鍵字段自增的四種方式,需要的朋友可以參考下2023-03-03