一條SQL語句的旅行之路
第一部分 . 一條SQL語句的旅行之路
你可以在任意一個client執行一條sql statement,但是這條sql statement是如何被解析,執行,最後再把結果返回到client的呢。下面我們就一起來體驗一下sql statement的旅行之路。
一、 傳送sql語句
1. 傳送請求
如果你是通過網路連線到server端的資料庫的話。在client傳送一條sql statement,首先要通過user process向server端傳送請求(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建立連線
當client向server傳送請求的時候,server 端的監聽會分析client請求的資料庫service name。當監聽找到請求的資料庫之後,系統會啟動server process 與user process進行連線。到此,監聽對於已經與serverdatabase建立連線之後的session就沒有作用了。後面的任務就有server process 全權負責了
二、 處理sql語句
到了server process這都做了什麼呢?
Oracle的server process有oracle自動建立,用來處理連線到例項的使用者程式發出的請求。對於專用伺服器模式,user process和server process是一一對應的,而在共享伺服器莫斯下,一個oracleserver process程可以同時服務多個user process。
Server process主要的任務就是:
3. 解析、執行使用者提交的sql語句
Server process會對使用者提交的資料進行解析和執行,那它又是在何處完成這些工作的呢?
這裡就要談到oracle的記憶體結構中的PGA,PGA像server process的辦公室和工作站一樣,相當於server process的專用記憶體區域。PGA儲存著server process程式的資料和控制資訊。
a) 檢視執行計劃是否已存在
當一條sql語句在執行之前,server process會先到shared pool中的Library Cache中搜尋,看看是否有相同的sql語句被解析、執行過,如果能找到,那麼oracle就可以直接利用Library Cache中的儲存的執行計劃來執行,這個過程有一個專業的名詞叫做軟解析。這樣就可以省去,再重新進行解析,制定執行計劃的麻煩增大sql語句的執行效率。若沒有找到,就必須重新解析,這個過程也有個專業名稱叫做硬解析。
這裡說明一下,shared pool分為Library Cache、Dictionary Cache等幾個部分組成。Library Cache中主要存放使用者執行的SQL和PL/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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一條SQL語句的書寫SQL
- 一條很 巧妙的 SQL 語句SQL
- 一條sql語句的優化SQL優化
- 一條sql語句的改進探索SQL
- 一條簡單SQL語句的構成及語句解析SQL
- 一條sql語句的執行過程SQL
- 一條SQL語句的優化過程SQL優化
- 一條update SQL語句是如何執行的SQL
- 一條SQL更新語句是如何執行的SQL
- 一條SQL更新語句是如何執行的?SQL
- 一條全表掃描sql語句的分析SQL
- 一條sql語句的建議調優分析SQL
- 一條更新的SQL語句是如何執行的?SQL
- 一條 SQL 查詢語句是如何執行的?SQL
- 一條SQL語句在MySQL中如何執行的MySql
- 實現四則運算的一條sql語句SQL
- PL/SQL 條件控制語句SQL
- SQL SERVER 條件語句的查詢SQLServer
- MyBatis 一次執行多條SQL語句MyBatisSQL
- 【SQL】使用一條INSERT語句完成多表插入SQL
- 一條sql語句在mysql中是如何執行的MySql
- 一條SQL語句的執行計劃變化探究SQL
- 一條 SQL 語句在 MySQL 中是如何執行的?MySql
- 一條更新sql的執行之路SQL
- 一條sql語句優化不出來, 哭了一鼻子SQL優化
- MySQL日誌(一條sql更新語句是如何執行的)MySql
- 由一條sql語句導致的系統IO問題SQL
- 一條簡單的sql語句導致的系統問題SQL
- 一條簡單的sql語句執行15天的原因分析SQL
- SQL語句優化--十條經驗SQL優化
- 一條查詢sql的執行之路SQL
- 執行一條sql語句都經歷了什麼?SQL
- 執行一條 SQL 語句,期間發生了什麼?SQL
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- 騰訊面試:一條SQL語句執行得很慢的原因有哪些?面試SQL
- MySQL系列之一條SQL查詢語句的執行過程MySql
- 用一條SQL語句顯示所有可能的比賽組合SQL
- 第45期:一條 SQL 語句最佳化的基本思路SQL