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

前所未闻的存储索引是Exadata中最有用的功能,它不是像Oracle的B树索引或者位图索引那样传统的存储在数据库中的索引,事实上,它在传统意义上甚至根本不能算是索引。我们无法通过存储索引来定位拥有给定列上特定值的一系列记录,相反的,存储索引是存储服务器上的软件,它的设计目的是为了消除磁盘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就使用一个空格来代替NULL,SAP这样做就是为了保证记录可以通过B树索引(该类索引不保存空值)查询到。无论如何,存储索引提供了一个类似于空值上的位图索引一样的功能,这使得寻找空值效率很高(假设空值只占一小部分)。

监控存储索引

监控存储索引的功能非常有限,优化器并不知道在一个SQL语句中存储索引是不是会被使用,AWR和ASH也同样捕捉不到任何有关存储索引在SQL中是否使用到的信息,仅仅在数据库级别有一个统计值可以跟踪存储索引的使用,另外还有一个未公开的跟踪机制。

数据库统计值

只有一个数据库统计值跟存储索引有关,就是“cell physical IO bytes saved by storage index”,记录了因为使用了存储索引而被避免的I/O累计值。该统计值可以从v$sesstat和v$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

Exadata中最有用的功能-存储索引相关推荐

  1. SQL Server中的列存储索引

    先决条件 (Prerequisite ) 通过理论和实践措施可以更好地解释与SQL Server 2012列存储索引有关的讨论. 因此,对于实际测量部分–我将使用AdventureWorksDW201 ...

  2. mysql按照列构建索引_列存储索引增强功能–在线和离线(重新)构建

    mysql按照列构建索引 In this article, we will explore ' Clustered columnstore online index build and rebuild ...

  3. SQL Server 2016 列存储索引功能增强

     列存储索引(columnstore index)在SQL Server 2012中已经引入,其带来性能提升的同时也有很多限制,比如对带有列存储索引的表进行INSERT, UPDATE和DELET ...

  4. SQL Server 2014聚集列存储索引

    转发请注明引用和原文博客(http://www.cnblogs.com/wenBlog) 简介 之前已经写过两篇介绍列存储索引的文章,但是只有非聚集列存储索引,今天再来简单介绍一下聚集的列存储索引,也 ...

  5. SQL Server 2016新特性:列存储索引新特性

    SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...

  6. 数据库索引统计信息不一致_列存储索引增强功能–克隆数据库中的索引统计信息更新

    数据库索引统计信息不一致 SQL Server was launched in 1993 on WinNT and it completed its 25-year anniversary recen ...

  7. 行存储索引改换成列存储索引_列存储索引增强功能–数据压缩,估计和节省

    行存储索引改换成列存储索引 Data compression is required to reduce database storage size as well as improving perf ...

  8. predicate 列存储索引扫描_MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

    不知道从什么时候开始,网上流传着这么一个说法: MySQL的WHERE子句中包含 IS NULL.IS NOT NULL.!= 这些条件时便不能使用索引查询,只能使用全表扫描. 这种说法愈演愈烈,甚至 ...

  9. 互联网行业中最常用的数据库——MySQL 索引、事务与存储引擎

    MySQL 索引.事务与存储引擎 一.MySQL 索引 1.1 索引的概念 1.2 索引的作用及缺点 1.2.1 优点 1.2.2 缺点 1.3 创建索引的原则依据 1.4 索引的分类和创建 1.4. ...

  10. ES2019 中 8 个非常有用的功能

    ES2019 规范是对 JavaScript的小规模扩展,但仍带来了一些有趣的功能.本文向你展示八个 ES2019 的功能,这些功能可以使你的开发变得更轻松. String.prototype.tri ...

最新文章

  1. C++ char 与uchar区别
  2. dedecms模板中首页实现分页的方法
  3. mysql设计的步骤_mysql笔记8_数据库设计步骤
  4. 探秘JVM(二)——编译进行时
  5. 正方体最快最简单画_素描新手入门第一幅画可不只是“正方体”
  6. java二级分销排行统计_直播分销系统排行
  7. STM32 中断详解
  8. 【黑金动力社区】【bf531 体验板教程】第六章 可编程标志口(八)
  9. jquery中object对象循环遍历的方法
  10. 2020软考信息系统项目管理师-上午历年真题解析视频课程-任铄-专题视频课程
  11. c程序设计(谭浩强)阅读与实操 1章 (新手向)
  12. java练习题,个人所得税计算
  13. Ubuntu 误删恢复
  14. git rebase origin/develop
  15. APP软件测试点着重详解
  16. CIO40知识星球—天道勤酬
  17. HTML中加入背景音乐
  18. BD-Rate和BD-PSNR
  19. C语言,练习8.9 n*n阶矩阵对角线元素之和
  20. 微信公众号会替代手机APP吗?

热门文章

  1. div+css命名大全
  2. 北京理工计算机 上机复试2000年
  3. 针对不同手机系统的LBS地图定位解决方案
  4. ADFS3.0 Customizing the AD FS Sign-in Pages
  5. C#中获去一个字符串中的汉字的个数 C#获取字符串全角的个数
  6. [最小割][Kruskal] Luogu P5039 最小生成树
  7. 【BZOJ2839】集合计数【BZOJ3622】已经没有什么好害怕的了
  8. Python __getattribute__ vs __getattr__
  9. 用指针实现对二维数组元素的访问
  10. 20155315 2016-2017-2 实验二《Java面向对象程序设计》实验报告