原創|其它|編輯:郝浩|2009-05-20 10:10:00.000|閱讀 1267 次
概述:周三,一開始的想法是想要把客戶的數據庫直接放在虛擬硬盤里面測試一下速度,也就是對比一下看看能夠提高多少性能,如果性能能夠提高很多的話,那么在考慮一下保證數據的安全性,也就是說在意外發生的時候,保證數據不能丟失。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
續
上一篇引起了大家的討論,看著討論我是比較暈的,這也怪我沒有說清楚,所以再補一個續把問題說清楚吧。
筆記本配置
CPU:Core 2 7250 2.0G
內存:4G,其中2G設置成了虛擬硬盤,虛擬硬盤的軟件:Ramdisk。讀取:5.5G,寫入:3.5G。
硬盤:160G,平均讀取:70M/s。寫入:不詳,估計沒有讀取快。
(內存的讀取速度是硬盤的讀取速度的785倍。)
這里是我的筆記本的測試:
軟件: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的傳統硬盤了。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園