[SQL][效能調校]OCZ ZD-XL SQL Accelerator 測試心得

[SQL][效能調校]OCZ ZD-XL SQL Accelerator 測試心得

最近借測試了一張 OCZ 所製作的 PCIe SSD 800GB 的設備,想說是否真的如傳言所說,在確保資料安全的狀況下,還能大幅提升資料庫的效能。因此請同事幫忙找了一台可以使用 PCIe x8 的介面的 PC Server,重新打掉原本的作業系統,重新安裝 Windows Server 2012 R2 搭配 SQL Server 2012 R2 來測試看看。當安裝好之後,就如同本機的硬碟一般,在磁碟管理下會多了一個磁碟來讓我們使用,此時最簡單的用法就是把他當一般磁碟來用,因此用 Crystal DiskMark 測試一下,速度真的是很驚人。

image

 

而為了要搭配 SQL Server 來使用,一種是把 SQL Server 的資料庫就直接放到 SSD 上,一種是搭配 ZD-XL SQL Accelerator 的軟體來使用。前者方式就跟一般使用上沒有甚麼差別,因此我主要測試是搭配 ZD-XL SQL Accelerator 的使用效益是否真的有改善。

 

首先我先執行 ZD-XL SQL Accelerator 的安裝檔,安裝方式就如同一般的軟體,幾乎都是下一步、下一步…然後就完成了。

ZDXL001

ZDXL002

ZDXL003

 

到這裡幾乎都沒有甚麼好選的,唯有這裡要注意一下,如果你有多台主機有 PCIe 的 SSD 卡的時候,可以設定由其中一台來管理其他的主機,但如果沒有的話,記得在本機要安裝 「ZD-XL Manager

ZDXL004

ZDXL005

ZDXL006

 

 

ZDXL007

 

安裝好之後,就可以使用瀏覽器連接本機的 10122 的 Port 來進行管理了。

ZDXL008

 


 

安裝好之後的第一次,他會要你設定一組密碼可以進來做管理,設定好之後就可以登入了,執行畫面如下:

ZDXL010

 

除了第一次登入用 Wizard 的方式來進行設定外,也可以自己手動的方式來建立。在我們選擇自己的主機之後,可以在畫面的右邊,選擇「Configure」來做設定,這裡就如同中間的說明,按下按鈕去選擇要連接的 SQL Server Instance

ZDXL012

 

設定好帳密之後,就可以連接所指定的 SQL Server Instance 了。

ZDXL013

 

就可以選擇我們要作用的資料庫進行設定,但此時我們要是按下中間如同閃電的按鈕,會發現因為還沒有設定 Cache File,因此無法設定。

image

 

因此我們選擇右邊的 Menu 內的選項「Tools」,在畫面中間選擇「SSD Setup」,選擇你要建立 Cache File 的 Volume 之後,這個時候下方會出現問你在這個 SSD 上要保留多少空間,剩下的要去建立 Cache File,這裡我想全部都拿去當 Cache,因此設定保留 0GB 的空間下來,確定好之後就可以按下下方「Apply」的按鈕。

image

 

此時在磁碟內就會真的去建立一個 Cache 檔案,如同我們所指定的大小。

image

 

而建立好 Cache 檔案之後,我們就可以回到之前的步驟,回到選擇「Configure」來做設定,此時針對我們要測試的資料庫,就可以按下中間閃電圖示的「Accelerate Using Cache」按鈕之後,就設定好該 DEMO 資料庫,當有讀取的時候就會將資料放到 Cache 中存放一份,加速日後的使用。

image

 


 

完成安裝之後,那我們就要正式來測試一下效果如何囉。

USE [DEMO]
GO

CREATE TABLE [BigTable]
(
	A1	NVARCHAR(4),
	A2	NVARCHAR(10),
	A3	NCHAR(100),
	A4	NCHAR(200),
	A5  INT
)
GO

DECLARE @I INT;
DECLARE @J INT;
DECLARE @K INT;


SET @J = 0;

SET NOCOUNT ON;
WHILE @J < 100
BEGIN
	SET @I = 0;
	BEGIN TRAN
	WHILE @I < 100000 
	BEGIN
		SET @K = @J*100000+@I ;
		INSERT INTO [BigTable] ( A1,A2,A3,A4,A5 ) VALUES ( 'AAA', RIGHT('0000000000'+STR(@K),10), NEWID(),NEWID(),@K )
		SET @I += 1; 
	END	
	COMMIT
	SET @J += 1; 
END

SET @J = 0;

SET NOCOUNT ON;
WHILE @J < 100
BEGIN
	SET @I = 0;
	BEGIN TRAN
	WHILE @I < 100000 
	BEGIN
		SET @K = @J*100000+@I ;
		INSERT INTO [BigTable] ( A1,A2,A3,A4,A5 ) VALUES ( 'BBB', RIGHT('0000000000'+STR(@K),10), NEWID(),NEWID(),@K )
		SET @I += 1; 
	END	
	COMMIT
	SET @J += 1; 
END

 

首先在資料庫內放入 20,000,000 筆的資料,接著我們用亂數去找資料

DECLARE @I INT;
DECLARE @J INT;
DECLARE @K INT;

SET @I = 0 ;
SET @J = 0 ;
WHILE @I < 10
BEGIN
	SET @K = ROUND( DATEPART( ms, GETDATE())*37/49.0*10000 , 0 ) ;
	SELECT * FROM BigTable where A5 = @K;
	SET @J = @J + @@ROWCOUNT ;
	SET @I+=1 ;
END	
PRINT @J	

 

為了避免 Data Buffer 的影響,因此我限制 SQL Server 的記憶體上限為 256MB 的記憶體,且故意在資料表上沒有加入索引,這樣勢必會造成大量的 Table Scan。在我們還沒有使用 SSD 當 Cache 之前,上述的這樣一段語法執行十次的時間,大約要花上 13 分鐘

image

 

而如果有開啟 Cache 的狀況下,由於第一次讀取的時候,大部分的資料都沒有放到 Cache 中,所以這個時候的速度跟沒有 Cahce 是相同的。但在迴圈跑到第二次的時候,因為讀取的資料幾乎都在 SSD 內了,後續的速度就會整個飆起來了,因此一開始執行十次的結果花上 2分17秒。

image

image

 

但接下來幾次的測試時間,就大約會是 1 分鐘 4 秒到 1 分鐘 6 秒的時間。這樣的數據跟完全沒有使用 Cahce 的 13 分鐘比較起來,大約是 12 倍的提升。

image

 


 

因此看起來以這樣的設備來說,對於資料庫如果有需要大量讀取的狀況下,且 SQL Server 所分配給 SQL Server Instance 的記憶體遠低於資料庫的大小,看來是有很不錯的效能提升。且在使用的時候,他可以支援 SQL Server 2008 以上的 64 位元版本,因此不一定要升級到 SQL Server 2014 使用 BPE,就可以達到有類似的果效了。但要注意一點的是這個效能提升只限於讀取資料,如果是在資料寫入的話,則是沒有加速的效果,因此再使用之前,建議最好先確定資料庫是否有很大量的資料讀取的瓶頸,如果是的話,則該解決方案應該是個不錯的方法。