理解Oracle的優化第一回合:Sql語句的執行過程

理解Oracle的優化第一回合:Sql語句的執行過程

1.SQL語句的執行過程
我們平常都用PLSQL等工具去執行sql,其實工具會自動幫我們做很多事,我們自然不會關注到其中的細節,但是懂得sql的執行步驟,可以幫助我們寫出更好更有效的sql語句,在出現一些問題時,如select較慢,我們可以分析在哪個階段除了問題,找到解決辦法。

下面是sql的執行過程:
DML語句的處理:
每一種類型的語句都需要執行下面的步驟:
•第1步:CreateaCursor創建遊標
•第2步: Parse the Statement分析語句
•第5步:BindAnyVariables綁定變量
•第7步: Run the Statement運行語句
•第9步:ClosetheCursor關閉遊標

如果使用了並行功能,還會包含下面這個階段:
•第6步: Parallelize the Statement並行執行語句

如果是查詢語句,則需要以下幾個額外的步驟,如圖3所示:
•第3步: Describe Results of a Query描述查詢的結果集
•第4步: Define Output of a Query定義查詢的輸出數據
•第8步:FetchRowsofaQuery取查詢出來的行

下面具體來說下每一步都做了什麼?

第一步 創建遊標**
任何一個sql語句都會創建遊標,特別是運行DML時,但大多數情況下,都是自動創建,無需開發人員干預。當然在預編譯的proc中也有可能會顯示的創建。
第二步 分析語句**
這裏的分析,主要是語法的分析,sql語句和分析的信息都會被裝入到 共享sql區 ,這個階段可以解決許多類型的錯誤。

語法的分析主要有以下操作:

  • 翻譯sql語句,驗證它是否合法
  • 實現數據字典查找,判斷表、列是否定義
  • 獲取語法分析鎖,保障分析過程中不改變訪問對象的定義
  • 驗證操作的權限
  • 絕對此條語句的最佳執行計劃
  • 將此條語句裝入共享sql區
  • 對於分佈式的語句,檢查語句的路由是否包含所有的遠程節點

以上的任何一步有錯,都會中斷sql的執行。只有共享池中不存在等價的語句時,纔會執行語法分析 。這個功能主要依賴於綁定變量來實現的,也就是我們常說的共享sql。

所以這一步給出的sql優化技巧如下:
1.儘量編執行語法分析。
2.查詢語句較其他類型語句不同,因爲會返回一行或者多行數據。我們可以通過批量的fetch數據,降低網絡開銷。

第三步 描述查詢的結果集
當查詢由用戶交互的輸入查詢的列名時,需要描述查詢結果的特徵。

第四步 定義查詢的輸出語句
此階段可指定與查詢的列值對應的接受變量的位置、大小。數據類型,這樣我們就能通過接收變量就可以得到查詢結果。

第五步 綁定變量
此時oracle已知道SQL語句的意思,但仍然沒有足夠的信息用於執行該語句。需要得到語句中列出的所有變量的值,得到這個變量值的過程就是綁定變量。
select * from scott.emp where empno= :var_empno; 中得到 empno這個限定值的過程。

第六步 並行執行語句
並行可以使多個服務器進程爲同一個sql服務,但會耗費更多的資源,不到萬不得已不要使用。

第七步 執行語句
此時,一切準備就緒,準備執行了。update、delete等語句需要鎖定影響的行,保證數據的一致性。
這裏的優化技巧:對於一些語句,可指定執行的次數,可以減少網絡開銷。

第八步 取出查詢的行

第九步 關閉遊標
這是sql處理的最後的一個階段。

對於DDL語句,需要對數據字典進行修改,語句分析階段至包含 分析、查找數據字典的信息和執行。

事務的四大特性分別是:原子性、一致性、隔離性、持久性

原子性: 是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾
一致性:一個事務執行之前和執行之後都必須處於一致性狀態。比如,一個 事務給另一個事務轉10塊錢,那麼他倆一共只有10塊錢,總量是不可能改變的。
隔離性:多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾
持久性一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章