SQL的執行
白老師就是那麼牛,再轉。
最近有網友問我SQL的執行有哪些步驟。實際上SQL執行是一個十分複雜的事情。這裡僅介紹SQL提交到SQL引擎後的幾個重要的階段。一個SQL的執行分為分析(PARSE),執行(EXECUTE)和FETCH三個大的階段。
SQL執行的第一步是對語法進行分析,首先根據SQL語句,計算出SQL的HASHVALUE,然後根據HASHVALUE查詢LIBRARY CACHE,是否存在這個SQL,如果存在,那麼說明語法是經過檢查的,不需要進行語法檢查。如果不存在,那麼要在LIBRARY CACHE中分配記憶體,這時候會涉及到SHARED POOL,LIBRARY CACHE閂鎖。
第二步是進行語意的檢查和SQL Transformation,對於子查詢、檢視等,需要透過這個階段,轉化為JOIN等
第三步是生成執行樹,如果是RBO直接根據規則生成,如果是CBO,則根據最佳化規則,統計資料等,進行獨立物件訪問成本計算、連線順序成本計算等,最終生成執行樹(這部分可以透過10053事件獲得詳細的資訊)
到此,PARSE階段就完成了,下面進行EXECUTE階段
EXECUTE階段對繫結變數分配空間,然後繫結數值。並且驅動執行分析階段生成的執行計劃。在這個階段並沒有對DATA BLOCK進行訪問,真正對DATA BLOCK的訪問要在下一個階段進行。
FETCH階段會訪問DATA BLOCK,並且返回需要的行。
在實際SQL的執行中,這三個階段是相融合的,並且有些步驟可能前置或者後置。比如對於繫結變數的值如果對於執行計劃生成有影響,那麼變數繫結會前置到分析階段。
如果要深入研究SQL的執行,可以透過以下一些事件來獲得詳細的資訊:
ROW SOURCE相關:
<10031> "row source debug event (R*)"
<10038> "dump row source tree (QBADRV)"
PREDICATE相關:
<10060> "dump predicates in optimiser (kko)"
CBO相關:
<10053>
SQL TRACE:
<10046>
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9533994/viewspace-1007887/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- SQL是如何執行的SQL
- SQL的執行計劃SQL
- MyBatis SQL執行MyBatisSQL
- [ORACLE] SQL執行OracleSQL
- Oracle中檢視已執行sql的執行計劃OracleSQL
- SQL 執行 - 執行器最佳化SQL
- sql更新是如何執行的?SQL
- sql語句如何執行的SQL
- 取消超時執行的sqlSQL
- 檢視正在執行的SQLSQL
- 執行大的sql語句SQL
- 捕捉執行很久的SQL(轉)SQL
- 定位SQL的執行次數SQL
- PL/SQL執行動態SQLSQL
- java中執行sql與pl/sql dev中執行sql快慢差距大原因JavaSQLdev
- Sql執行順序SQL
- peewee 執行原生 sqlSQL
- PostgreSQL SQL執行流程SQL
- sql 執行計劃SQL
- yii直接執行sqlSQL
- sql 執行過程SQL
- MySQL 5.7獲取指定執行緒正在執行SQL的執行計劃資訊MySql執行緒
- 決定一個SQL執行效率的是執行計劃, 而不是SQL的寫法SQL
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- run sql in the backgroud 後臺執行sqlSQL
- sql查詢是如何執行的?SQL
- 一條Sql的執行過程SQL
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- 一條更新sql的執行之路SQL
- sql的執行計劃 詳解SQL
- SQL 執行順序 你懂的SQL
- Oracle檢視正在執行的SQL以及執行計劃分析OracleSQL
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- 利用pl/sql執行本地的sql檔案中的sql語句SQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- SQL Server中檢視SQL句子執行所用的時間SQLServer