Oracle執行計劃 講解(一)
看懂Oracle執行計劃是優化的第一步,讓我們從下面的例子開始吧。
下面為補充內容
1、建立測試表
- SQL> createtable t asselect 1 id,object_name from dba_objects;
- Table created
- SQL> update t set id=99 where rownum=1;
- 1 row updated
- SQL> commit;
- Commit complete
- SQL> createindex t_ind on t(id);
-
Index
oracle優化器:RBO和CBO兩種, 從oracle10g開始優化器已經拋棄了RBO,下面的列子說明CBO大概是怎樣的
- SQL> select /*+dynamic_sampling(t 0) */* from t where id=1;
- 50819 rows selected.
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 1376202287
-
-------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- -------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 195 | 15405 | 51 (0)| 00:00:01 |
-
| 1 | TABLE ACCESS BYINDEX ROWID| T | 195 | 15405 | 51 (0)| 00:00:01 |
- |* 2 | INDEX RANGE SCAN | T_IND | 78 | | 50 (0)| 00:00:01 |
- -------------------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 2 - access("ID"=1)
而實際情況如下所示:
- SQL> select * from t where id=1
- 2 ;
- 50819 rows selected.
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 1601196873
- --------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- --------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 49454 | 3815K| 67 (2)| 00:00:01 |
- |* 1 | TABLE ACCESS FULL| T | 49454 | 3815K| 67 (2)| 00:00:01 |
- --------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 1 - filter("ID"=1)
通過動態取樣,CBO估算出行數為49454,非常接近於真實50820數目。選擇了全表掃描。
我們來收集一下統計資訊
- SQL> exec dbms_stats.gather_table_stats(user,'t',cascade => true);
- SQL> select * from t where id=1;
- 50819 rows selected.
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 1601196873
- --------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- --------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 50815 | 1339K| 67 (2)| 00:00:01 |
- |* 1 | TABLE ACCESS FULL| T | 50815 | 1339K| 67 (2)| 00:00:01 |
- --------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 1 - filter("ID"=1)
現在掃描過的行數為50815。
如果我們更新了所有的id為99看看。
- SQL> update t set id=99;
- 50820 rows updated
- SQL> select * from t where id=99;
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 1376202287
- -------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- -------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 27 | 2 (0)| 00:00:01 |
- | 1 | TABLE ACCESS BYINDEX ROWID| T | 1 | 27 | 2 (0)| 00:00:01 |
- |* 2 | INDEX RANGE SCAN | T_IND | 1 | | 1 (0)| 00:00:01 |
- -------------------------------------------------------------------------------------
- Predicate Information (identified by operation id):
- ---------------------------------------------------
- 2 - access("ID"=99)
因為沒有對錶進行分析,所以表中的分析資料還是之前的資訊,CBO並不知道。我們可以看出Rows值為1,也就是說CBO人為表T中的ID=99的值只有1條,所有選擇仍然是索引。
我們收集一把統計資訊。
- SQL> exec dbms_stats.gather_table_stats(user,'t',cascade => true);
- PL/SQL procedure successfully completed
- SQL> select * from t where id=99;
- 50820 rows selected.
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 1601196873
- --------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- --------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 50815 | 1339K| 67 (2)| 00:00:01 |
-
|* 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. 什麼是執行緒? 通常我們所說執行緒是程序的最小單位。那麼問題來了,什麼是程序呢?程序就是作業系統結構