1. 程式人生 > >Oracle執行計劃 講解(一)

Oracle執行計劃 講解(一)

看懂Oracle執行計劃是優化的第一步,讓我們從下面的例子開始吧。

 下面為補充內容

1、建立測試

  1. SQL> createtable t asselect 1 id,object_name from dba_objects;  
  2. Table created  
  3. SQL> update t set id=99 where rownum=1;  
  4. 1 row updated  
  5. SQL> commit;  
  6. Commit complete  
  7. SQL> createindex t_ind on t(id);  
  8. Index
     created  

        oracle優化器:RBO和CBO兩種, 從oracle10g開始優化器已經拋棄了RBO,下面的列子說明CBO大概是怎樣的

  1. SQL>  select /*+dynamic_sampling(t 0) */* from t where id=1;  
  2. 50819 rows selected.  
  3. Execution Plan  
  4. ----------------------------------------------------------
  5. Plan hash value: 1376202287  
  6. -------------------------------------------------------------------------------------
  7. | Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |  
  8. -------------------------------------------------------------------------------------
  9. |   0 | SELECT STATEMENT            |       |   195 | 15405 |    51   (0)| 00:00:01 |  
  10. |   1 |  TABLE ACCESS BYINDEX ROWID| T     |   195 | 15405 |    51   (0)| 00:00:01 |  
  11. |*  2 |   INDEX RANGE SCAN          | T_IND |    78 |       |    50   (0)| 00:00:01 |  
  12. -------------------------------------------------------------------------------------
  13. Predicate Information (identified by operation id):  
  14. ---------------------------------------------------
  15.    2 - access("ID"=1)  
       現象t表還沒有被分析,提示/*+dynamic_sampling(t 0) */*的目的是讓CBO無法通過動態取樣獲取表中的實際資料情況,此時CBO只能根據T表中非常有限的資訊(比如表中的extents數量,資料塊的數量)來猜測表中的資料。從結果中可以看到CBO猜出表中id=1的有195條,這個數值對於表的總數來說,是一個非常小的值,所以CBO選擇了索引而不是全表掃描。
      而實際情況如下所示:
  1. SQL> select * from  t where id=1  
  2.   2  ;  
  3. 50819 rows selected.  
  4. Execution Plan  
  5. ----------------------------------------------------------
  6. Plan hash value: 1601196873  
  7. --------------------------------------------------------------------------
  8. | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
  9. --------------------------------------------------------------------------
  10. |   0 | SELECT STATEMENT  |      | 49454 |  3815K|    67   (2)| 00:00:01 |  
  11. |*  1 |  TABLE ACCESS FULL| T    | 49454 |  3815K|    67   (2)| 00:00:01 |  
  12. --------------------------------------------------------------------------
  13. Predicate Information (identified by operation id):  
  14. ---------------------------------------------------
  15.    1 - filter("ID"=1)  

       通過動態取樣,CBO估算出行數為49454,非常接近於真實50820數目。選擇了全表掃描。
       我們來收集一下統計資訊

  1. SQL> exec dbms_stats.gather_table_stats(user,'t',cascade => true);  
  2. SQL> select * from  t where id=1;  
  3. 50819 rows selected.  
  4. Execution Plan  
  5. ----------------------------------------------------------
  6. Plan hash value: 1601196873  
  7. --------------------------------------------------------------------------
  8. | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
  9. --------------------------------------------------------------------------
  10. |   0 | SELECT STATEMENT  |      | 50815 |  1339K|    67   (2)| 00:00:01 |  
  11. |*  1 |  TABLE ACCESS FULL| T    | 50815 |  1339K|    67   (2)| 00:00:01 |  
  12. --------------------------------------------------------------------------
  13. Predicate Information (identified by operation id):  
  14. ---------------------------------------------------
  15.    1 - filter("ID"=1)  

現在掃描過的行數為50815。

如果我們更新了所有的id為99看看。

  1. SQL> update t set id=99;  
  2. 50820 rows updated  
  3. SQL> select * from  t where id=99;  
  4. Execution Plan  
  5. ----------------------------------------------------------
  6. Plan hash value: 1376202287  
  7. -------------------------------------------------------------------------------------
  8. | Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |  
  9. -------------------------------------------------------------------------------------
  10. |   0 | SELECT STATEMENT            |       |     1 |    27 |     2   (0)| 00:00:01 |  
  11. |   1 |  TABLE ACCESS BYINDEX ROWID| T     |     1 |    27 |     2   (0)| 00:00:01 |  
  12. |*  2 |   INDEX RANGE SCAN          | T_IND |     1 |       |     1   (0)| 00:00:01 |  
  13. -------------------------------------------------------------------------------------
  14. Predicate Information (identified by operation id):  
  15. ---------------------------------------------------
  16.    2 - access("ID"=99)  

        因為沒有對錶進行分析,所以表中的分析資料還是之前的資訊,CBO並不知道。我們可以看出Rows值為1,也就是說CBO人為表T中的ID=99的值只有1條,所有選擇仍然是索引。

       我們收集一把統計資訊。 

  1. SQL> exec dbms_stats.gather_table_stats(user,'t',cascade => true);  
  2. PL/SQL procedure successfully completed  
  3. SQL> select * from  t where id=99;  
  4. 50820 rows selected.  
  5. Execution Plan  
  6. ----------------------------------------------------------
  7. Plan hash value: 1601196873  
  8. --------------------------------------------------------------------------
  9. | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
  10. --------------------------------------------------------------------------
  11. |   0 | SELECT STATEMENT  |      | 50815 |  1339K|    67   (2)| 00:00:01 |  
  12. |*  1 |  

    相關推薦

    Oracle執行計劃 講解

    看懂Oracle執行計劃是優化的第一步,讓我們從下面的例子開始吧。  下面為補充內容 1、建立測試表 SQL> createtable t asselect 1 id,object_name from dba_objects; 

    c#串口通信講解winform、wpf

    定義 cep 回調 true comm ive get exc pre 串口操作需要註意的幾點如下: 1、如果是USB轉串口;則需要安裝USB轉串口驅動,附件有此驅動。 2、串口打開狀態最好不要直接插拔串口,可能會導致中控板或者串口線燒壞。 3、使用串口調試工具CEIWEI

    ORACLE RAC部署實錄ORACLE ASMLIB

    oracle asm[root@king01 ~]# yum install -y kmod-oracleasm* [root@king01 ~]# rpm -ivh oracleasmlib-2.0.4-1.el6.x86_64.rpm [root@king01 ~]# rpm -ivh oracleasm

    Oracle入門SQL練習

    inf != 開頭 工作 排序 desc 令行 查詢排序 模糊查詢 以下內容以scott用戶下Oracle自帶實例orcl庫中四張表進行查詢,作為Oracle入門SQL基礎練習筆記,不忘初心,加油! --1).查詢一個用戶下所有的表SELECT * FROM tab; --

    區塊鏈的共識算法 及 分叉 的通俗講解

    一段 過大 關系 動物 .net 公式 廣播 安全 user 作者:林冠宏 / 指尖下的幽靈 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguanh

    java併發學習--執行緒池

    關於java中的執行緒池,我一開始覺得就是為了避免頻繁的建立和銷燬執行緒吧,先建立一定量的執行緒,然後再進行復用。但是要具體說一下如何做到的,自己又說不出一個一二三來了,這大概就是自己的學習習慣流於表面,不經常深入的結果吧。所以這裡決定系統的學習一下執行緒池的相關知識。   自己稍微總結了一下,

    Oracle 資料庫 體系結構:儲存結構

    目錄 為什麼要學習體系結構? 體系結構的定義 Oracle 物理結構 Oracle 邏輯結構 總結 為什麼要學習體系結構? 之前的文章有講解到 MySQL 、MongoDB 資料庫,這些資料庫我們安裝好了就能拿來用,比如直接可以做一些:增、刪、改

    Oracle單表查詢

    1.1獲取表中所有的行與列 若領導要看所有員工的資訊,大家應該都會用,直接select * 就可以了。 1.2從表中檢索出部分行   例如我們只想看job是‘salesman’的員工,則增加判斷條件 where job='SALESMAN'(此處必須是大寫,oracle的關鍵字、表名、使用

    Oracle資料庫入門安裝

    目錄 Oracle資料庫是什麼? Oracle資料庫和其他資料庫的區別是什麼? Oracle資料庫的安裝 解決方案[INS-13001]環境不滿足最低要求 配置安裝: 驗證oracle安裝成功 Oracle資料庫是什麼? Oracle Database

    虛擬機器安裝Oracle WebCenter Sites 12c 搭建安裝環境,安裝虛擬機器

           因為工作原因需要我在虛擬機器上安裝 Oracle Webcenter 12C ,百度上找了很多資料,自己第一次研究安裝,安裝過程中有很多麻煩,為了防止自己以後忘記,也能為了幫助別人,特意記錄下來,希望能有所幫助,記得點贊。 安裝 Oracle

    oracle多表查詢

       在進行多表查詢之前,我們先查詢一下部門表和員工表有多少資料。這個可以用count完成。 select count(*) from emp; select count(*) from dept;    在這裡注意,當我們在日常工作中接手一個新的庫的時候,都會要

    java多執行緒系列:Thread、Runnable、Callable實現多執行緒的區別

    實現多執行緒 java實現多執行緒的方法有三種,分別是繼承thread類,實現runnable介面,實現callable介面(call方法有返回值) /** * 繼承Thread */ public class MyThread extends Thread{ int a = 0;

    Oracle學習——資料庫建立

    一:使用DBCA以靜默方式建立資料庫 dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbname test -sid test -responseFile NO_VALUE -characterSet AL32UT

    java多執行緒-初探

    啥是多執行緒?跟程序又是啥關係?   比方說:我去洗手,洗完手去吃飯。 程序(Processor) 洗手跟吃飯是兩個程序。 執行緒(Thread) 在洗手的程序裡,我同時聽歌,還唱歌。那這裡洗手是一個程序,聽歌跟唱歌是兩個執行緒。 在吃飯的程序裡,我同時聽歌,還

    Oracle 資料庫入門總結

    1,虛擬機器的安裝 參考文章:最新超詳細VMware虛擬機器下載與安裝  https://blog.csdn.net/qq_40950957/article/details/80467513   2,oracle10g資料庫的安裝 可以參考我換在的這篇文章

    效能測試實戰--計劃測試

      一、效能測試流程 計劃測試->建立指令碼->建立場景->執行場景->分析效能資料->生成x效能測試報告,如下圖所示: 1.1 計劃測試 在任何型別的測試中,編寫測試計劃都是必要的步驟。有條不紊、計劃周密的計劃,可以確保在執行中能夠有章

    scrapy簡單入門及例項講解

    初識Scrapy Scrapy是一個用於Web網站抓取的應用框架,輸出的結構化資料可以廣泛用於各類程式,比如:資料探勘、資料處理、資料存檔等 儘管Scrapy是為Web抓取設計的,但也可以用於從API中提取資料 通過一個例項認識spider 為了快速認識S

    Docker在Linux上執行NetCore系列配置執行DotNetCore控制檯

    轉發請註明此文章作者與路徑,請尊重原著,違者必究。   本篇文章作業系統資訊       Linux:ubuntu 16.04.3 amd64   檢視NetCore支援的Linux系統    &n

    haproxy 7層負載均衡代理轉發實戰講解-老男孩筆記系列

    ######################################################### # haproxy L7 實戰講解 #date:2010-06-09 #作者:老男孩---《老男孩linux就業培訓中心 》 #QQ:31333741 MAIL:[email 

    執行緒基礎

    最近讀了高洪巖的《Java多執行緒程式設計核心技術》一書,打算記錄下多執行緒的基礎知識點,也算對本書的一個讀後感了。目前打算分四五篇博文進行記錄。 第一篇主要是記錄執行緒的概念,建立,常用的基礎方法等。 1. 什麼是執行緒? 通常我們所說執行緒是程序的最小單位。那麼問題來了,什麼是程序呢?程序就是作業系統結構