利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率 续

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 续 上一篇引起了大家的讨论,看着讨论我是比较晕的,这也怪我没有说清楚,所以再补一个续把问题说清楚吧。   笔记本配置 CPU:Core 2 7250 2.0G 内存:4G,其中2G设置成了虚拟硬盘,虚拟硬盘的软件:Ramdisk。

上一篇引起了大家的讨论,看着讨论我是比较晕的,这也怪我没有说清楚,所以再补一个续把问题说清楚吧。

 

笔记本配置
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  

 

 


 

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
4月前
|
XML Ubuntu Linux
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
|
17天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
191 2
|
1月前
|
Java 关系型数据库 MySQL
如何用java的虚拟线程连接数据库
本文介绍了如何使用Java虚拟线程连接数据库,包括设置JDK版本、创建虚拟线程的方法和使用虚拟线程连接MySQL数据库的示例代码。
44 6
如何用java的虚拟线程连接数据库
|
1月前
|
存储 缓存 API
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
42 6
|
1月前
|
固态存储 内存技术
升级电脑内存和硬盘
升级电脑内存和硬盘
45 6
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
128 5
|
3月前
|
存储 缓存 NoSQL
Redis内存管理揭秘:掌握淘汰策略,让你的数据库在高并发下也能游刃有余,守护业务稳定运行!
【8月更文挑战第22天】Redis的内存淘汰策略管理内存使用,防止溢出。主要包括:noeviction(拒绝新写入)、LRU/LFU(淘汰最少使用/最不常用数据)、RANDOM(随机淘汰)及TTL(淘汰接近过期数据)。策略选择需依据应用场景、数据特性和性能需求。可通过Redis命令行工具或配置文件进行设置。
78 2
|
3月前
|
设计模式 uml
在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Hard
该博客文章通过一个电脑主机启动的示例代码,展示了外观模式(Facade Pattern)的设计模式,其中主机(MainFrame)类通过调用内部硬件组件(如内存、CPU、硬盘)和操作系统的启动方法来实现开机流程,同时讨论了外观模式的优缺点。
|
3月前
|
KVM 虚拟化
[kvm]cpu内存硬盘配置
[kvm]cpu内存硬盘配置
|
4月前
|
SQL 缓存 关系型数据库
(十二)MySQL之内存篇:深入探寻数据库内存与Buffer Pool的奥妙!
MySQL是基于磁盘工作的,这句几乎刻在了每个后端程序员DNA里,但它真的对吗?其实答案并不能盖棺定论,你可以说MySQL是基于磁盘实现的,这点我十分认同,但要说MySQL是基于磁盘工作,这点我则抱否定的态度,至于为什么呢?这跟咱们本章的主角:Buffer Pool有关,Buffer Pool是什么?还记得咱们在《MySQL架构篇》中聊到的缓存和缓冲区么,其中所提到的写入缓冲区就位于Buffer Pool中。
314 1