SQL的執行

jlttt發表於2008-07-26

白老師就是那麼牛,再轉。

最近有網友問我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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章