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相關:10060>10038>10031>
<10053>10053>
SQL TRACE:
<10046>10046>
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9533994/viewspace-1007887/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- SQL是如何執行的SQL
- PHP執行sqlPHPSQL
- MyBatis SQL執行MyBatisSQL
- [ORACLE] SQL執行OracleSQL
- sql語句如何執行的SQL
- sql更新是如何執行的?SQL
- SQL 執行 - 執行器最佳化SQL
- peewee 執行原生 sqlSQL
- Sql執行順序SQL
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- 17.Sql是如何執行的SQL
- 一條Sql的執行過程SQL
- sql查詢是如何執行的?SQL
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- SQL 解析與執行流程SQL
- postgresql怎麼執行sqlSQL
- Oracle sql執行計劃OracleSQL
- mybatis執行sql指令碼MyBatisSQL指令碼
- SQL執行內幕:從執行原理看調優的本質SQL
- 用 Explain 命令分析 MySQL 的 SQL 執行AIMySql
- 如何檢視SQL的執行計劃SQL
- 監控 SQL Server 的執行狀況SQLServer
- 批次殺執行某條sql的sessionSQLSession
- Laravel 獲取執行的sql語句LaravelSQL
- 自適應查詢執行:在執行時提升Spark SQL執行效能SparkSQL
- spring boot 執行sql檔案Spring BootSQL
- sql mysql 執行順序 (4)MySql
- MyBatis列印SQL執行時間MyBatisSQL
- SQL語句執行順序SQL
- MySQL 中一條 sql 的執行過程MySql
- Oracle提高SQL執行效率的三種方法ITOracleSQL
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- 一條sql語句的執行過程SQL
- 一條 sql 的執行過程詳解SQL
- Oracle SQL Profile固定執行計劃的方法OracleSQL
- SQL語句各子句的執行順序SQL