利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率 续
2009-05-18 11:52 金色海洋(jyk)阳光男孩 阅读(...) 评论(...) 编辑 收藏续
上一篇引起了大家的讨论,看着讨论我是比较晕的,这也怪我没有说清楚,所以再补一个续把问题说清楚吧。
笔记本配置
CPU:Core 2 7250 2.0G
内存:4G,其中2G设置成了虚拟硬盘,虚拟硬盘的软件:Ramdisk。读取:5.5G,写入:3.5G。
硬盘:160G,平均读取:70M/s。写入:不详,估计没有读取快。
(内存的读取速度是硬盘的读取速度的785倍。)
这里是我的笔记本的测试:http://www.cnblogs.com/jyk/archive/2009/05/10/1453551.html
软件:SQL Server 2000,asp.net2.0
SQL Server 2000 里面有几个重要的数据库,master、model、msdb、tempdb,这里主要想说的是tempdb数据库,这里有一个MSND的介绍。
目的:提高SQL Server 2000显示数据时的速度。
想法:把tempdb 放在虚拟硬盘(即内存)里面,利用内存的读写速度远远大于硬盘的优势,提高速度。
事件的经过:
上周三,一开始的想法是想要把客户的数据库直接放在虚拟硬盘里面测试一下速度,也就是对比一下看看能够提高多少性能,如果性能能够提高很多的话,那么在考虑一下保证数据的安全性,也就是说在意外发生的时候,保证数据不能丢失。
我是想先看看性能到底能够提高多少,如果提高的多的话才有应用价值,如果提高微弱,那就一点价值都没有了。于是我利用SQL Server 2000自带的northwnd,把里面的Products表里面的数据copy到了250万条以便于测试。然后再把数据库文件复制成两份,一份放在物理硬盘里面,附加到数据库里,叫做northwnd_Disk;另一份放在虚拟硬盘(即内存)里面,附加到数据库里,叫做northwnd_Ram。好了两份数据库准备好了,下面开始测试。
我先测试了一下能够利用索引的情况,使用Max的分页算法,按照ProductID(主键,聚集索引)排序。两个数据库都没有超时,northwnd_Ram可以提高8倍左右的效率,基本还可以。
能够利用索引自然是好,但是好多情况是不能利用索引的呀,那么再不能利用索引的情况下,虚拟硬盘能够带来多少的性能提升呢?于是我又做了第二个实验。
不能利用索引的情况,还是用那两个数据库,这回按照 order by ProductName, ProductID的条件来分页,采用颠倒Top的分页算法(注意这里并不是想要讨论分页算法的效率问题,而是要看看虚拟硬盘的效率)。
这回我就傻眼了,两个数据库,第一页倒是都显示出来了,但是第500页,第1000页都是超时?数据库文件放在了物理硬盘里面超时了,这我还可以理解,硬盘读写速度慢呀。但是我明明把另一份数据库文件放在了虚拟硬盘(内存)里面了呀,怎么他也超时了?!文件放在内存里面都读不过来?这也太不可思议了吧!我检查了代码,有检查了数据库文件的设置,没有弄错呀。正在疑惑呢,突然发现硬盘灯在狂闪不止,都到了常亮的程度了,但是这时候我明明是在做northwnd_Ram(虚拟硬盘)的测试呀,这个时候为什么要读写硬盘呢?难道是灵异事件?代码和数据库的设置绝对没有错误,问题出在哪里呢?
我突然想到了一个事情,在我上大学学习数据结构的时候,老师讲解排序算法时说过,在对几百条数据进行排序的时候,排序算法好写,把数据都写到内存里面排序就可以了,但是如果数据达到几万条,几百万条的时候,要如何来写排序算法呢?难道要把几百万条数据都读到内存里面?对呀,在2000年的时候,内存可不像现在是以G为单位的,那时候才128M吧 ,服务器的内存也到不了多少,估计微软施舍不能占用太多的内存,而是把一些数据写到了硬盘里面,这样我就想到了Tempdb数据库,如果能够把Tempdb放在虚拟硬盘里面,那么速度是不是可以提升一些呢?当时就笨了,没有想到更改数据库文件的路径地方法,后来在周五的时候才找到了一个方法。测试了一下,效果明显,于是才引出了那篇帖子。
当时是很兴奋的,因为即使是northwnd_Disk(数据库文件放到了物理硬盘里),按照order by ProductName, ProductID都没有超时,这个意义就很大了。原先还想把客户的数据库放在虚拟硬盘(我当然知道这么做是很危险地)里呢,现在不用了,只需要把Tempdb放在虚拟硬盘里就可以提升很大的效率,这不就不用担心库户的数据的丢失问题了吗。而且在重启计算机(或者重启SQL服务)的时候,即使没有了tempdb.mdf文件,SQL服务也会重新建立一份文件(可惜不能建立文件夹),是不是很方便。速度也快了,数据也安全,除了tempdb.mdf文件的体积不能太大,几乎没有缺点了。
对于32位的操作系统,最大只能识别4G的内存,这样留给Tempdb的空间确实不是太多。我现在的一个客户,20多人使用,Tempdb的空间只有8M,可能是我不使用临时表的原因吧,至少对于我来说,我觉得我是完全可以把Tempdb放在虚拟硬盘里面的,我打算今天下午就试一下。
Ps:
1、我怀疑,在有的时候(比如排序),SQL 会对Tempdb进行很频繁的读写操作。
2、至于如果把客户的数据库放在了虚拟硬盘里面,如何才能保证数据的安全的问题,我也是想过的。最稳妥的方式就是,大家有过做数据库读写分离的吧,就是一个数据库专门负责数据的读取,叫做A数据库,另一个负责写入,叫做B数据库。然后把这个负责读取的A数据库文件放在虚拟硬盘里面,这样速度不就快了吗?而且A数据库的数据完全是从另B数据库里面订阅多来的,B数据库可是放在物理硬盘里面的,这样就不用担心数据丢失的问题了。
这个方案还行吧。
3、SSD
在百科里面查了一下,固态硬盘的存储介质分为两种,一种是采用闪存(FLASH芯片)作为存储介质,另外一种是采用DRAM作为存储介质。
数据存储速度:从PConline评测室的评测数据来看,固态硬盘相对传统硬盘性能提升2倍多。
价格:目前市场上80G Intel固态硬盘,价格为4000元左右。而这个价钱足够买几个容量为1TB的传统硬盘了。
详细内容:
http://baike.baidu.com/view/723957.html?tp=1_11