利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率(目前只针对SQL Server 2000)可以提高很多
虚拟硬盘:就是把内存当作硬盘来用,比如有2G的内存,那么可以拿出来1G的内存当作硬盘来用。
自从知道了“虚拟硬盘”这个东东,我就一直在想如何才能把这个虚拟硬盘发挥到极致,上一篇也写了一些简单的应用,当然提高的效率并不多,并不是很理想。我最想提高的是提高数据库的读取速度,也就是提高分页效率。一开始是想把数据库文件放到虚拟硬盘里面,这样读取速度不就快乐吗?但是当我把一个250万条记录的数据库放在了虚拟硬盘上做测试后,发现效果并不理想。
250万条记录,利用主键排序(聚集索引),可以提高几倍的效率,但是如果换成一般的字段(nvarchar类型的,没有设置索引),查看第1000页的数据的时候居然超时了?!这个也太。。。还是“内存”了吗?无意间看了一眼硬盘指示灯,这个灯在显示数据的时候居然一直在亮!不会把,从虚拟硬盘里面读数据,硬盘灯为什么会亮呀?看来SQL Server2000在大量数据排序的时候会往硬盘里面写数据。查看了一下发现SQL Server2000会往Tempdb数据库里面写数据,居然写了100多M的数据,看来这是照成超时的原因了。
那么能不能把Tempdb换到虚拟硬盘里面呢?一开始用了一个笨着,竟然把SQL Server2000给弄死了,害得我重装了一遍。后来才发现,有现成的SQL语句可以使用。好了现在可以改Tempdb的位置了,再来测试一遍。这回效果比较理想,翻到第5000页,花费了11秒多,没有超时。
USE master
Go
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 't:datatempdb.mdf')
Go
ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 't:datatemplog.ldf')
Go
Tempdb数据库里并不会存放重要数据,丢掉了也不会有什么大问题,只需要在重启计算机后把文件拷贝过去就可以了,代价不大,效率却可以提高很多,有减少了硬盘的读写次数,保护了硬盘嘛,应该是一个很好的方法。
测试的具体情况:
SQL Server 2000 ,Northwind数据库里的Products表,表里面有2523136条记录数, 每页15条记录,共168210页。
ProductID 字段是主键,聚集索引,其他字段都没有索引。
1、使用颠倒Top的分页算法,按照ProductName,ProductID来排序。一开始比较慢,需要20多秒(需要把数据读取到Tempdb),后来就快了一些,11秒左右。就是说翻到了第1000页、第 5000页只需要11秒左右,硬盘灯也没怎么亮。第10000页,12秒。第十万页,22秒。(注意:这是250万条记录,按照nvarchar字段排序的结果)
第99999页使用的SQL语句:
select * from Products where productid in
( select top 15 productid from
( select top 1499985 productname,productid from Products
order by productname,productid ) as t
order by t.productname desc,t.productid desc )
order by productname,productid
2、使用Max分页算法,按照主键(ProductID)字段排序。这个就非常快了,10000页以内都是0毫秒到32毫秒,第五万页是200毫秒左右,第十万页是300多毫秒,第十六万页(快到最后了)是600毫秒左右。可以用秒杀来形容了。
第1600000页使用的SQL语句:
select top 15 * from Products
where productid>=
(SELECT max(productid ) from
(select top 2399986 productid from Products order by productid ) as t )
order by productid
2.1、同样的条件下,如果Tempdb放在物理硬盘里面的话,速度慢很多。下面是测试数据。(使用Max分页算法,按照主键(ProductID)字段排序)
页号 |
时间:毫秒 |
---|---|
第1页 |
156 |
第2页 |
15 |
第10000页 |
1390 |
第10001页 |
47 |
第140000页 |
8391 |
第140001页 |
546 |
第160000页 |
1766 |
第160001页 |
600 |
注意:这里并不是想说分页算法如何如何的快,而是想说,对于SQL Server2000来说,如果把Tempdb数据库的文件(tempdb.mdf)放在虚拟硬盘里面,可以提高很大的效率!至于SQL Server 2005还没有测试。
- SpringBoot详细研究-05微服务与拾遗
- 图的遍历之深度优先搜索(DFS)
- MyBatis快速入门
- 四字母域名hubx.com以22500美元价格易主
- 《大型网站技术架构》学习笔记-01概述
- 判断有向图是否有圈
- 深度优先生成树及其应用
- 《大型网站技术架构》学习笔记-02架构篇
- POJ2488-A Knight's Journey(DFS+回溯)
- FreeMarker快速入门
- 用只含一个链域的节点实现循环链表的双向遍历
- 亚马逊注册3个新域名引发预测,或成为最大数字货币交易所
- POJ-1979 Red and Black(DFS)
- 06-图2 Saving James Bond - Easy Version
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Redis系列:项目中哪些常用的命令
- Chrome 插件编写-用几行js代码实现写入剪贴板功能
- Python 技术篇-socket套接字实现服务器客户端消息传递,UDP实现
- Python 技巧篇-如何避免python报错导致强制关闭窗口
- UML急速入门
- Python 技术篇-socket套接字实现两个窗口间消息传递,TCP实现
- 解决HttpServletRequest的输入流只能读取一次的问题
- 使用RSA算法对接口参数签名及验签
- 最基础的动态数据结构:链表
- Python 微信机器人-如何查看别人撤回的消息,实战演示!
- Python 技术篇-全局变量引用,local variable referenced before assignment.解决办法
- 线性结构之栈和队列
- pyHook 转码问题-MouseSwitch() missing 8 required positional arguments...,原因及解决办法
- 将Java中的数组进行二次封装成属于我们自己的数组
- Windows 卡进程问题-请等待当前程序完成卸载或更改,轻松解决