索引器的作用,Exadata中最有用的功能-存儲索引

 2023-12-09 阅读 23 评论 0

摘要:Exadata中最有用的功能-存儲索引 前所未聞的存儲索引是Exadata中最有用的功能,它不是像Oracle的B樹索引或者位圖索引那樣傳統的存儲在數據庫中的索引,事實上,它在傳統意義上甚至根本不能算是索引。我們無法通過存儲索引來定位擁有給定列上特定值的一系列

Exadata中最有用的功能-存儲索引

前所未聞的存儲索引是Exadata中最有用的功能,它不是像OracleB樹索引或者位圖索引那樣傳統的存儲在數據庫中的索引,事實上,它在傳統意義上甚至根本不能算是索引。我們無法通過存儲索引來定位擁有給定列上特定值的一系列記錄,相反的,存儲索引是存儲服務器上的軟件,它的設計目的是為了消除磁盤I/O。因為通過存儲索引可以定位的是不存在所需記錄的位置而非存在的位置,所以有時候我們稱其為“反向索引”。它保存每個磁盤存儲單元(默認是1MB大小)中存儲的字段的最小值和最大值,當使用智能掃描時,SQL謂詞是會傳遞到存儲服務器中的,因此存儲軟件就能在真正請求I/O之前比對謂詞和存儲索引元數據(最大值和最小值),任何不可能包含匹配記錄的存儲區間都會被跳過,在很多情況下,這將大幅度減少需要執行的I/O量。需要記住的是,由于存儲軟件需要謂詞來跟存儲索引中保存的最大與最小值進行比較,因此只有在智能掃描時此優化才生效。

并沒有文檔記錄存儲軟件維護和優化存儲索引的算法(雖然確實在啟動cellsrv前可以在存儲服務器上設置幾個隱含參數),實際上,甚至沒有什么方法來監控存儲索引,比如說,當存儲索引被讀取或者被更新的時候,并沒有什么等待事件來記錄消耗的時間。即使沒有任何命令可以用來操縱存儲索引,但是因為這是一個非常強大的功能,能帶來顯著的性能改善,因此了解它是如何工作的還是很重要的。

索引器的作用。??Kevin說:為了加深我自己心目中存儲索引的形象,我通常將這種優化手段勾勒成這樣一個畫面,極大提高在草垛中尋找一根銀針的效率,而非在草垛中尋找某一根稻草。

結構

存儲索引包含了最多8列的最小值和最大值,對于每1MB存儲單位(存儲區間)上都維護這樣的結構,存儲索引只保存在內存中而永遠不會寫入磁盤。

??Kevin說:存儲索引保存在cellsrv的堆(heap)中,所以從技術上而言,在某些極端場景下,是可能會跑到磁盤上的(交換區)……所以,也不能說是永遠不會……

索引存儲結構舉例、4-1顯示存儲索引中所含數據的概念圖。

??

?

如圖4-1中所示,Customer表中的第一個存儲區間中cust_age字段最大值為77,這表明它是有可能包含滿足查詢條件的記錄的(cust_age > 35),而圖中的其他存儲區間所包含的最大值不足以滿足查詢條件,因此就根本不會從磁盤讀取這些存儲區間。

索引和視圖主要起什么作用?除了最小值和最大值,還有一個標識表示了在存儲區間中是否存在包含空值(NULL)的記錄。在索引中存在空值指示著實有些讓人吃驚,因為在傳統的Oracle索引中都是不會保存空值的,存儲索引這種跟蹤空值的能力,實際上也許是受到設計方法和實現方法的影響,有些系統是完全不用空值的,比如SAP就使用一個空格來代替NULLSAP這樣做就是為了保證記錄可以通過B樹索引(該類索引不保存空值)查詢到。無論如何,存儲索引提供了一個類似于空值上的位圖索引一樣的功能,這使得尋找空值效率很高(假設空值只占一小部分)。

監控存儲索引

監控存儲索引的功能非常有限,優化器并不知道在一個SQL語句中存儲索引是不是會被使用,AWRASH也同樣捕捉不到任何有關存儲索引在SQL中是否使用到的信息,僅僅在數據庫級別有一個統計值可以跟蹤存儲索引的使用,另外還有一個未公開的跟蹤機制。

數據庫統計值

mysql索引存在內存還是硬盤。只有一個數據庫統計值跟存儲索引有關,就是“cell physical IO bytes saved by storage index”,記錄了因為使用了存儲索引而被避免的I/O累計值。該統計值可以從v$sesstatv$sysstat等相關視圖中查到,雖然這個統計值比較奇怪、并不精準,不過這是唯一一個可以輕易獲取的顯示存儲索引是否被使用到的指標。很不幸,由于統計值是累加的,就跟v$sesstat中的所有其他統計值一樣,必須要在SQL語句執行前和執行后都檢查該值才能確定存儲索引是否被使用了。下面是一個例子:

SYS@EXDB1> set echo on?

SYS@EXDB1> @si

SYS@EXDB1> col name for a70

什么是索引,SYS@EXDB1> col value for 99999999999999

SYS@EXDB1> select name, value

? 2from v$mystat s, v$statname n

? 3where n.statistic# = s.statistic#

索引存儲結構的適用范圍。? 4and name like '%storage%';

?

?

NAME???????????????????????????????????????????????????VALUE

怎么存成索引文件。------------------------------------------------------------

cell physical IO bytes saved by storageindex?????????????? 0

?

SYS@EXDB1> select avg(pk_col) fromkso.skew2 where col1 is null;

?

AVG(PK_COL)

-----------

?32000001

?

SYS@EXDB1> set echo off

SYS@EXDB1> @si

?

NAME???????????????????????????????????????????????????VALUE

------------------------------------------------------------

cell physical IO bytes saved by storageindex????? 3984949248

?

SYS@EXDB1> select avg(pk_col) fromkso.skew2 where col1 is null;

?

AVG(PK_COL)

-----------

??32000001

SYS@EXDB1> @si

?

NAME???????????????????????????????????????????????????VALUE

------------------------------------------------------------

cell physical IO bytes saved by storageindex????? 7969898496

正如你所見,si.sql腳本在v$mystat視圖中查詢包含“storage”單詞的統計值,除非當前會話中有SQL語句使用了存儲索引否則該統計值將為0。在我們的例子中,使用到存儲索引的查詢大概消減了40億字節的磁盤I/O,這些都是沒有存儲索引時不得不進行的額外I/O。由于v$mystat視圖顯示的是你當前會話的累計統計值,所以如果你再次執行這個語句,該值就會比第一次執行之后增加一倍,當然斷開會話(比如說退出SQL*Plus)會將v$mystat視圖中包括該統計值在內的大多數統計值都清零。

?

?

本文節選自《深入理解Oracle Exadata》一書

Kerry Osborne(凱里?奧斯本)

Randy Johnson(蘭迪?約翰遜)

Tanel P?der(托內耳?卜戴德)著

黃凱耀,張樂奕,張瑞譯

電子工業出版社出版

圖書詳細信息:http://blog.csdn.net/broadview2006/article/details/7844209

?

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/193897.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息