学习一门新的技术选一本好书是很重要的,此次学习之旅我选择了《深入理解Oracle Exadata》。刚开始学习的时候总是有很多问号,当这些问号逐渐找到答案的时候就会慢慢的喜爱这门技术。
Exadata的目的是什么?
融合硬件和软件的组合来解决存储层和数据库层之间的瓶颈。
Exadata如何处理存储层和数据层之间的瓶颈?
有别于传统的Oracle架构。Exadata分为数据库层和存储层。存储层也称为存储节点,有独立的cpu和软件支持。使用卸载技术(offload)在数据层完成数据的处理,减少数据层向数据库层返回数据的量。缓存是Oracle查询的重要保证。如果查询的返回的数据量超过缓存的大小(SGA),那么缓存就失效了。卸载就是要处理这种要返回大量数据的应用。
卸载的概念:卸载是将处理能力从数据库服务器转移到存储层。不仅仅转移了cpu的使用,更能减少那些必须返回给数据库服务器的数据量,而这正是大多数大型数据库的主要瓶颈所在。
单张表中一条记录中的一列,并且知道rowid。在传统查询中该查询至少需要返回一个数据块(通常是8k),假设一个数据块中有50条记录,那么额外的49条数据就是无谓开销。如果查询一亿次,在大型数据仓库中这个问题就严重了。消减在存储和数据库服务之间传递完全不需要的数据所花费的时间,正是exadata想要解决的主要问题。
卸载的目标:
减少磁盘和数据库服务器之间的传输数据量
减少数据库服务器的cpu占用
减少存储层磁盘读取时间
Exadata已经有7年历史了,现在很多厂家在做一体机,QData,TDATA等等。我在银行里就听过两个厂家来宣传基于x86架构的一体机,这些一体机和Exadata有什么区别呢?
区别就在软件。Exadata也好Qdata也好,硬件都是透明的。按照这个规格都能搭建出来。但是如何有效的卸载,如何通过数据库层和存储层的配合真正减少数据传输量,减少数据库cpu压力,靠的是软件而不是硬件。
卸载中的核心是智能扫描Smart Scan,目的是减少需要传回数据库服务器端的数据量。
智能扫描方法一,字段投影(列)
只返回感兴趣的列(select中的列或者join操作的列)来限制数据库层和存储层之间的数据传输。选择额外的列就会需要更多的时间来完成查询。
只将返回感兴趣的行返回数据库层。通常过滤实在数据库层完成,谓词过滤可以在存储层来完成。
谓词过滤都是通过减少传输回数据库服务器端的数据量来提高性能(同时减少传输时间)
存储索引的目的不是为了传输回数据库的数据量。不管是否使用了存储索引,返回给数据库的数据量是一样的。它的目的是缩减从存储服务器自身的磁盘中读取数据的时间。
布隆过滤/函数卸载
可以通过select distinct name,version,offload from v$sqlfn_metadata order by 1,2; 来看那些函数支持卸载
压缩/解压缩
在发生smart scan时exadata将混合列示压缩(HCC)卸载到存储节点完成。
从减少传输数据量的角度来看,在存储节点卸载后在传输给数据库层显然增大了数据量。
加密/解密
加密是在数据库层完成,解密可以在数据库库层也可以在存储层完成。加密和压缩可以一起工作。
虚拟列
虚拟列可以通过表中字段计算得出,不用真正存储这部分计算后的值。卸载虚拟列可以减少返回给数据库服务器的数量,这比减少服务器CPU消耗重要。
数据挖掘卸载
可以通过下面的sql来确认哪些数据挖掘可以卸载:
select distinct name,version,offloadable from v$SQLFN_METADATA where v$SQLFN_METADATA where name like ‘PREDICT%’ order by 1,2;
非智能扫描类型的卸载
智能文件创建
加快数据块初始化动作。非exadata的操作是在数据库服务器格式化每个数据块,然后再写回磁盘,所有读写操作都会导致数据库服务器和存储之间大量的数据流量。有时候添加一个30GB的数据文件会等好久就是这个原因。在exadata中这些操作被卸载在存储层,不再与数据库层交互,减少了数据量。
RMAN增量备份
对当个块进行跟踪变化,显著减少需备份的数据块个数。
RMAN恢复
加快了存储节点恢复备份文件时初始化部分的速度。
必须要是对象上的全扫描,TABLE ACCESS STOREAGE FULL 和 INDEX STORAGE FAST FULL SCAN
扫描必须要使用Oracle直接路径读取机制
对象必须要存储在Exadata存储中
不能使用智能扫描的情况:
聚簇表,索引组织表,启用了ROWDEPENDENCIES
当存储节点的cpu很忙(解压HCC数据),而数据库层cpu空闲时cellsrv会跳过解压一部分数据,通过数据库节点强制解压。
如何判断是否使用了smart scan
10046跟踪,可以看到smart table scan或者cell smart index scan等待事件
比如:WAIT #2: name=‘cell smart table scan’ ela=39 cellhash#=3176594409 p2=0 p3=0 obj#=66849
v$sessstat视图
当天的cell scans总次数
select name,value from v$mystats s, v$statname n
where n.statistic#=s.statistic#
and n.statistic#=s.statistic#
and name like nvl(‘%&name%’,name)
order by 1
/
Enter value for name: cell scans
NAME VALUES
cell scans 833
执行新的sql语句
select avg(pk_col) from kso.skew2 where col1 > 0;
select name,value from v$mystats s, v$statname n
where n.statistic#=s.statistic#
and n.statistic#=s.statistic#
and name like nvl(‘%&name%’,name)
order by 1
/
Enter value for name: cell scans
NAME VALUES
cell scans 834
禁用卸载
alter session set cell_offload_processing=false;
select name,value from v$mystats s, v$statname n
where n.statistic#=s.statistic#
and n.statistic#=s.statistic#
and name like nvl(‘%&name%’,name)
order by 1
/
Enter value for name: cell scans
NAME VALUES
cell scans 834 < == 禁用卸载后不再出现cell scans
脚本方法
通过IO_CELL_OFFLOAD_ELIGIBLE_BYTES列的值是不是大于0
SQL监控
使用DBMS_SQLTUNE.REPORT_SQL_MONITOR来观察卸载结果
本篇完