文章归档

关于SSD测试的几篇文章(推荐阅读)

这两天看到了多篇关于SSD在MySQL中的应用的测试, 感觉非常不错..

SSD Deployment Strategies for MySQL
View more presentations from Yoshinori Matsunobu.

下面的内容摘自上面来自slideShare的pdf文件.
基本结论如下

SSD is extremely good at random reads
SSD is very good at random writes
HDD is good enough at sequential reads/writes
No strong reason to use SSD for sequential writes

简单翻译

SSD 有非常好的随机读能力
SSD 有很好的随机写能力
HDD 对于顺序读写的场景来讲已经足够好
没有很好的理由来使用SSD到顺序写的场景

其他几篇不错的关于此的文章.
An Overview of Flash Storage for Databases
How Solid state Technologies are Transforming MySQL Server Performance and [...]

使用Oracle 11GR2 数据库Flash Cache

本文翻译自Guy Harrison的blog: Using the Oracle 11GR2 database flash cache, 这是他写的关于Flash Cache系列文章的第一篇, 后面还有两篇, 我也将陆续翻译出来放到此处, 另外还会翻译两篇Kevin Closson写的关于Flash Cache的相关文章.

使用Oracle 11GR2 数据库Flash Cache
Oracle最近发布了一个补丁程序,使得你可以在Oracle Enterprise Linux中使用数据库Flash Cache,即使你并没有使用Exadata存储.这个补丁的名字有点隐晦:

8974084:META BUG FOR FLASH CACHE 11.2PL BUGS TO BACKPORT TO 11.2.0.1 OEL

只要安装好这个补丁,你就可以使用任何已存在的flash 设备作为数据库的Flash Cache.下面是我在一个非常旧的服务器与一个非常便宜的usb flash设备上做的初步尝试.相对于更优质的硬件来讲, 测试结果并不具有代表性,但是我认为,它仍然是很有趣的.

安装与配置

如果你也像我一样想在一个USB flash设备上做试验,那么也必须先挂载这个设备.在我的机器上,我创建了一个目录”/mnt/usbflash”,接着在/etc/fstab文件新增了一个如下的条目:
/dev/sda1 /mnt/usbflash vfat noauto,users,rw,umask=0 0 0
在你的系统中,你可能需要将”/dev/sda1″改成其他的设备,这依赖于你如何配置磁盘.然后就可以通过输入”mount /dev/sda1″来挂载这个闪存盘(flash drive).
一旦挂载完毕,就可以通过设置系统参数db_flash_cache_files与db_flash_cache_size来配置flash cache了. 如下是我的相关设置:

注意, 参数DB_FLASH_CACHE_FILE的值必须是一个存储在闪存盘上的文件,而不是这个闪存盘的挂载点本身.
一旦这些参数设置完毕,flash cache就会被激活,并且将充当buffer cache的二级缓存. 当从主缓存移出一个block的时候,它将被移到flash [...]

最佳字段顺序-数据库物理设计

附注: 摘录自我翻译的《Oracle性能优化艺术》
很少有人关心如何寻找一个表的最佳字段顺序。根据环境的不同,可能一点影响也没有,也可能产生很大的开销。为了理解在哪些情形下可能带来很大的开销,必须先理解数据库引擎是如何将数据保存到数据块中的。
保存到数据块中的记录有个非常简单的结构(查看图12-1)。首先,会有一个头(H)记录这条记录的一些基本属性,诸如是否被锁住或者包含多少个字段。其次,就是它的字段。由于每个字段可能有不同的大小,所以每个字段包含两个部分。前一部分是数据的长度(Ln)。后一部分是数据本身(Dn)。

图12-1 存储在数据库库块中每一行记录的格式(H=行头,Ln=字段n的长度,Dn=字段n的数据)
理解这个格式的关键是,数据库引擎不知道一条记录中每个字段的偏移量(offset)。例如,如果需要定位字段3,必须从字段1开始。接着根据字段1的长度来定位字段2。最后,根据字段2的长度来定位字段3。因此,无论何时一条含有多个字段的记录,靠近记录开始的地方的字段定位的速度会明显快于靠近记录末尾的字段。为了更好地理解这一点,你可以运行脚本column_order.sql来进行测试,以估算搜索一个字段的额外开销。

(1) 创建一个包含250个字段的表:
create table t (n1 number,n2 number,….,n249 number,n250 number);
(2) 插入1万条记录。每条记录的每个字段都保存同样的内容。
(3) 估算下面这条语句的响应时间,针对这个表的每个字段执行一下下面的语句,一个循环执行1千次。
select count(colx) from t

图12-2概括了我的测试服务器运行这个测试的结果。特别要强调的是,引用第一个字段(位置1)的SQL语句的执行速度差不多是引用最后一个字段(位置 250)的执行速度的5倍。这是因为数据库引擎优化了每一个访问,从而避免了定位以及读出不需要处理的字段。例如,查询语句SELECT count(n3) FROM t在定位到第三个字段之后就停止了对记录的访问。图12-2也显示,在位置0,也就是查询count(*),任何字段都不需要访问。
图12-2 字段在记录中的位置和访问它需要的响应时间
由于这个原因,一般的规则是将访问频繁的字段放在前面。为了利用这一点,需要仔细确认只访问(引用)真正需要的字段。无论如何,从性能的角度看,查询不需要的字段(或者更甚,使用SELECT *引用所有的字段,即使事实上只有几个字段被应用程序使用,很遗憾,这种事经常发生)都是不好的,不仅是因为当从数据块中读出时会有额外开销,而且是因为在服务器端和客户端都需要分配更多的内存来临时保存这些数据,以及需要更多的时间和资源来通过网络传输这些数据,简单来讲,就是只要数据被处理,就会带来开销。
实际操作中,与字段顺序相关的额外开销在下面几种情况中(更加)显而易见。

当一张表包含大量的字段,并且SQL语句经常访问记录后面的很少几个字段。
当从同一个数据块中读取很多记录时,比如在做全表扫描的时候。这是因为,定位并访问一个数据块的开销要比定位并访问字段(只读取几条记录)时的开销多很多。

由于末尾的NULL值是不保存的,所以将可能包含NULL值的字段放在表的末端是合适的。这样,实际存储的物理字段数量以及相应的行的平均大小也可能降低。

Oracle 11g Adaptive direct path read的几篇链接.

11g and direct path reads
http://oracledoug.com/serendipity/index.php?/archives/1321-11g-and-direct-path-reads.html
一篇关于Adaptive direct path reads的基本介绍.

http://afatkulin.blogspot.com/2009/01/11g-adaptive-direct-path-reads-what-is.html

11G’s ability to do direct path reads during full table scans without utilizing PQ was covered in a number of places already (see this post by Doug Burns for example).

When direct path reads starts to happen?

It is known that somewhat reliable figure is your _small_table_threshold multiplied by 5 [...]