利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率(目前只针对SQL Server 2000)可以提高很多...
?
上一篇:讓你的筆記本更快一點——我的筆記本的性能測試和虛擬硬盤(把內存當成硬盤)的使用感覺
?
??????虛擬硬盤:就是把內存當作硬盤來用,比如有2G的內存,那么可以拿出來1G的內存當作硬盤來用。
??????自從知道了“虛擬硬盤”這個東東,我就一直在想如何才能把這個虛擬硬盤發揮到極致,上一篇也寫了一些簡單的應用,當然提高的效率并不多,并不是很理想。我最想提高的是提高數據庫的讀取速度,也就是提高分頁效率。一開始是想把數據庫文件放到虛擬硬盤里面,這樣讀取速度不就快樂嗎?但是當我把一個250萬條記錄的數據庫放在了虛擬硬盤上做測試后,發現效果并不理想。
??????250萬條記錄,利用主鍵排序(聚集索引),可以提高幾倍的效率,但是如果換成一般的字段(nvarchar類型的,沒有設置索引),查看第1000頁的數據的時候居然超時了?!這個也太。。。還是“內存”了嗎?無意間看了一眼硬盤指示燈,這個燈在顯示數據的時候居然一直在亮!不會把,從虛擬硬盤里面讀數據,硬盤燈為什么會亮呀?看來SQL Server2000在大量數據排序的時候會往硬盤里面寫數據。查看了一下發現SQL Server2000會往Tempdb數據庫里面寫數據,居然寫了100多M的數據,看來這是照成超時的原因了。
??????那么能不能把Tempdb換到虛擬硬盤里面呢?一開始用了一個笨著,竟然把SQL Server2000給弄死了,害得我重裝了一遍。后來才發現,有現成的SQL語句可以使用。好了現在可以改Tempdb的位置了,再來測試一遍。這回效果比較理想,翻到第5000頁,花費了11秒多,沒有超時。
?
?
USE?masterGo
ALTER?DATABASE?tempdb?MODIFY?FILE?(NAME?=?tempdev,?FILENAME?=?'t:\data\tempdb.mdf')
Go
ALTER?DATABASE?tempdb?MODIFY?FILE?(NAME?=?templog,?FILENAME?=?'t:\data\templog.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還沒有測試。
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率(目前只针对SQL Server 2000)可以提高很多...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RAID5EE 含有上次残余信息的分析
- 下一篇: orale客户端与数据库连接