ORACLE虛擬索引(Virtual Index)

来源:http://www.cnblogs.com/kerrycode/archive/2017/09/15/7526970.html
-Advertisement-
Play Games

ORACLE虛擬索引(Virtual Index) 虛擬索引概念 虛擬索引(Virtual Indexes)是一個定義在數據字典中的假索引(fake index),它沒有相關的索引段。虛擬索引的目的是模擬索引的存在而不用真實的創建一個完整索引。這允許開發者創建虛擬索引來查看相關執行計劃而不用等到真實... ...


ORACLE虛擬索引(Virtual Index)

 

虛擬索引概念

 

虛擬索引(Virtual Indexes)是一個定義在數據字典中的假索引(fake index),它沒有相關的索引段。虛擬索引的目的是模擬索引的存在而不用真實的創建一個完整索引。這允許開發者創建虛擬索引來查看相關執行計劃而不用等到真實創建完索引才能查看索引對執行計劃的影響,並且不會增加存儲空間的使用。如果我們觀察到優化器生成了一個昂貴的執行計劃並且SQL調整指導建議我們對某些的某列創建索引,但在生產資料庫環境中創建索引與測試並不總是可以操作。我們需要確保創建的索引將不會對資料庫中的其它查詢產生負面影響,因此可以使用虛擬索引。

 

A virtual index is a "fake" index whose definition exists in the data dictionary, but has no associated index segment. The purpose of virtual indexes is to simulate the existence of an index - without actually building a full index. This allows developers to run an explain plan as if the index is present without waiting for the index creation to complete and without using additional disk space. If we observe that optimizer is creating a plan which is expensive and SQL tuning advisor suggest us to create an index on a column, in case of production database it may not be always feasible to create an index and test the changes. We need to make sure that the created index will not have any negative impact on the execution plan of other queries running in the database.So here is why a virtual index comes into picture.

 

 

 

虛擬索引應用

 

 

虛擬索引是Oracle 9.2.0.1以後開始引入的,虛擬索引的應用場景主要是在SQL優化調優當中,尤其是在生產環境的優化、調整。這個確實是一個開創性的功能,試想,如果一個SQL性能很差,但是涉及幾個數據量非常大的表,你嘗試新增一個索引,但是你也不確定優化器一定就能使用該索引或者使用該索引後,執行計劃就能朝著預想的那樣發展,但是在大表上創建索引、刪除索引也是一個代價非常高的動作,有可能引起一些性能問題或者影響其他SQL的執行計劃,而且創建一個實際的索引需要較長的時間,而虛擬索引幾乎非常快速,在性能優化和調整中經常被使用。其實說白了,虛擬索引主要是給DBA做SQL優化使用,根據它的測試效果來判斷是否需要創建實際索引。

 

 

虛擬索引測試

 

創建一個測試表,我們在這個測試表上做一些實驗。

 

SQL> set linesize 1200
SQL> select version from v$instance;
 
VERSION
-----------------
11.2.0.1.0
 
SQL> create table test          
  2  as
  3  select * from dba_objects;
 
Table created.
SQL> set autotrace traceonly explain;
SQL> select * from test where object_id=60;
 
Execution Plan
----------------------------------------------------------
Plan hash value: 1357081020
 
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    11 |  2277 |   282   (1)| 00:00:04 |
|*  1 |  TABLE ACCESS FULL| TEST |    11 |  2277 |   282   (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("OBJECT_ID"=60)
 
Note
-----
   - dynamic sampling used for this statement (level=2)

 

 

clip_image001

 

 

創建虛擬索引,檢查執行計劃是否走索引掃描。實際上創建虛擬索引就是普通索引語法後面加一個NOSEGMENT關鍵字即可,B*TREE INDEX和BITMAP INDEX都可以。

 

SQL> set autotrace off;
SQL> 
SQL> create index idx_test_virtual on test(object_id) nosegment;
 
Index created.
 
SQL> set autotrace traceonly explain;
SQL> select * from test where object_id=60;
 
Execution Plan
----------------------------------------------------------
Plan hash value: 1357081020
 
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    11 |  2277 |   282   (1)| 00:00:04 |
|*  1 |  TABLE ACCESS FULL| TEST |    11 |  2277 |   282   (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("OBJECT_ID"=60)
 
Note
-----
   - dynamic sampling used for this statement (level=2)

 

 

如上所示,並沒有使用虛擬索引。如果要使用所創建的虛擬索引,必須設置隱含參數"_USE_NOSEGMENT_INDEXES"=TRUE(預設為FALSE)後CBO優化器模式才能使用虛擬索引,RBO優化器模式無法使用虛擬索引

 

SQL> alter session set "_USE_NOSEGMENT_INDEXES"=true;
 
Session altered.
 
SQL> select * from test where object_id=60;
 
Execution Plan
----------------------------------------------------------
Plan hash value: 1235845473
 
------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |    11 |  2277 |     5   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST             |    11 |  2277 |     5   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_TEST_VIRTUAL |   263 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_ID"=60)
 
Note
-----
   - dynamic sampling used for this statement (level=2)
 
SQL> 

 

 

clip_image002

 

但是實際執行計劃還是走全表掃描,如下測試。

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • UIScrollView,UICollectionView 和UITableView 三者之間的關係:UIScrollView是 UICollectionView 和 UITableView 的父類. UIScrollView 一個可以滾動的視圖控制項,可以用來查看比屏幕大很多的視圖內容. 常用屬性: ...
  • OC開發中一般都會使用model來處理數據,經常會碰到定義好的欄位因為各種原因 後臺突然改欄位或者空值 造成model中對應的數值為nil,這個時候 我們如果取這個值加入數組中使用就會發現數組中的參數個數少了,造成閃退。因為在OC中數組無需要預先申請空間 數組每增加或刪除一個元素,就增加或刪除一個節 ...
  • 首先手機連接電腦,打開 ITunes. 左上角點擊文件,再點擊添加到資料庫。 找到你要安裝的ipa點擊選擇打開 好了ipa已經添加進去後,你會看你你剛纔添加進去的應用在列表內,點擊左上角一個手機的圖標。 點擊安裝,右下角同步 便成功安裝到手機上了。 此隨筆乃本人學習工作記錄,如有疑問歡迎在下麵評論, ...
  • 移動的號段:134(0-8)、135、136、137、138、139、147(預計用於TD上網卡) * 、150、151、152、157(TD專用)、158、159、187(未啟用)、188(TD專用) 聯通的號段:130、131、132、155、156(世界風專用)、185(未啟用)、186(3g ...
  • 作為一個一直使用windows系統的人,還真不知道mac上的svn如何使用,偶然機會下現在需要。 查過後發現 mac 是自帶svn的,在我裝好xcode後,再安裝 Command Line Tools 1.打開終端 輸入 點擊安裝,過幾分鐘就安好了。 2.再輸入此命令查看版本號,有版本號就是安裝好了 ...
  • mysql -h 192.168.1.104 -P3306 -uroot -p 然後輸入你安裝時設置的MySQL密碼 發現Can't connect to MySQL server 你的IP 解決方法: (1)用localhost 登錄 mysql -h localhost -P3306 -uroo ...
  • 一 快速性 如果在記憶體中運行MapRaduce,要比Hadoop快100倍 如果在磁碟中運行,要比Hadoop快10倍 Spark使用先進的有向無環圖執行引擎來支持非迴圈的數據流在記憶體中計算 二 易用性 Spark提供超過80個高階運算元,這些運算元使其很容易構建並行應用 這些運算元支持多種語言 按照切合 ...
  • MySqlInnoDB的事務隔離級別有四個:(預設是可重覆讀repeatable read) 未提交讀 read uncommit : 在另一個事務修改了數據,但尚未提交,在本事務中SELECT語句可能會查詢到這些未被提交的數據,而發生臟讀。 提交讀 read commit : 在一個事務中發生兩次 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...