一條SQL語句的旅行之路

蘭在晨發表於2012-09-04

 


第一部分 .             一條SQL語句的旅行之路

你可以在任意一個client執行一條sql statement,但是這條sql statement是如何被解析,執行,最後再把結果返回到client的呢。下面我們就一起來體驗一下sql statement的旅行之路。

一、        傳送sql語句

1.       傳送請求

如果你是通過網路連線到server端的資料庫的話。在client傳送一條sql statement,首先要通過user processserver端傳送請求(serving naming服務)向server傳送請求。是如何通過serving naming服務向server傳送請求的呢?

Serving nameing的配置可以 通過檢視tnsnames.ora檔案瞭解。

[oracle@lzc admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0.1/db_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

 

LZCDB =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.5.5.11)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = lzcdb)

    )

  )

紅色標記的為server端資料庫的的服務名,在8i之前都是使用SID

一個資料庫可以有多個服務名,它通過監聽對外提供服務。就是說首先服務名得被註冊到監聽中之後才能被client連線。

可以在sqlplus中執行以下命令檢視資料庫的服務名,和新增服務名

SQL> show parameter service_name

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

service_names                        string      dblzc

修改服務名

SQL> alter system set service_names='dblzc,dblzc_test';

System altered.

2.       server process建立連線

clientserver傳送請求的時候,server 端的監聽會分析client請求的資料庫service name。當監聽找到請求的資料庫之後,系統會啟動server process user process進行連線。到此,監聽對於已經與serverdatabase建立連線之後的session就沒有作用了。後面的任務就有server process 全權負責了

二、        處理sql語句

到了server process這都做了什麼呢?

Oracleserver processoracle自動建立,用來處理連線到例項的使用者程式發出的請求。對於專用伺服器模式,user processserver process是一一對應的,而在共享伺服器莫斯下,一個oracleserver process程可以同時服務多個user process

Server process主要的任務就是:

3.       解析、執行使用者提交的sql語句

Server process會對使用者提交的資料進行解析和執行,那它又是在何處完成這些工作的呢?

這裡就要談到oracle的記憶體結構中的PGAPGAserver process的辦公室和工作站一樣,相當於server process的專用記憶體區域。PGA儲存著server process程式的資料和控制資訊。

a)        檢視執行計劃是否已存在

當一條sql語句在執行之前,server process會先到shared pool中的Library Cache中搜尋,看看是否有相同的sql語句被解析、執行過,如果能找到,那麼oracle就可以直接利用Library Cache中的儲存的執行計劃來執行,這個過程有一個專業的名詞叫做軟解析。這樣就可以省去,再重新進行解析,制定執行計劃的麻煩增大sql語句的執行效率。若沒有找到,就必須重新解析,這個過程也有個專業名稱叫做硬解析。

這裡說明一下,shared pool分為Library CacheDictionary Cache等幾個部分組成。Library Cache中主要存放使用者執行的SQLPL/SQL語句,oracle設計Dictionary Cache的目的就是為了執行過的語句能被重用。

b)        讀取相關資料

當解析、制定完執行計劃之後,是不是就要從資料檔案中直接檢索資料了呢?當然,先不要著急。

在從資料檔案中直接檢索資料之前會先從SGA中的data buffer cache中查詢,看所要請求的資料是否在記憶體中已經存在。如果已經存在則直接從data buffer cache中讀取資料,這樣就就不需要再重新從資料檔案中檢索資料,提高了sql的執行速度。

data buffer cache中並未儲存該語句請求的資料,則server process會從資料檔案中重新讀資料。將資料複製到 data buffer cache中,另外會複製一份映象到undo段中用一致性查詢,以及事務回退等。資料載入到data buffer cache中被放入那個緩衝池是由物件的儲存屬性決定的,可以再存storage儲存引數子句中指定物件載入到記憶體時存放的緩衝池型別。

CREATE TABLE TEST id number STORAGE(BUFFER_POOL KEEP);

譬如這條語句就建立了一個TEST的表存放在緩衝池中大的keep池。

4.       返回執行結果

最後當server process完成了對資料的一列的操作之後會把結果返回到client。至此,這條sql語句,就算基本完成了它的整個旅途。

參考文件:三思筆記之一步步學習oracle

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26723566/viewspace-742655/,如需轉載,請註明出處,否則將追究法律責任。

相關文章