2010年9月10日 星期五

HP Mercury Loadrunner 測試SQL 語句性能

本次通過HP Mercury Loadrunner錄製Sql Server介紹一下如何測試一個sql語句或存儲過程的執行性能。

主要分如下幾個步驟完成:
第一步、測試準備
第二步、配置ODBC資料來源
第三步、錄製SQL語句在Sql Server查詢分析器中的運行過程
第四步、優化錄製腳本,設置事務
第五步、改變查詢數量級查看SQL語句的性能
第六步、在controller中運行腳本

下面開始具體的介紹:
第一步、測試準備
測試準備階段我們首先要確認測試資料庫伺服器:我們可以在本地安裝SQL SERVER資料庫服務端及用戶端,也可以確定一台裝好的SQL SERVER伺服器。
接下來,準備測試資料:對資料庫測試時我們要考慮的不是SQL語句是否能夠正確執行,而是在某數量級的情況下SQL語句的執行效率及資料庫服務的運行情況,所以我們分別準備不同數量級的測試資料,即根據實際的業務情況預估資料庫中的記錄數,在本次講解中我們不考慮業務邏輯也不考慮資料表之間的關係,我們只建立一張表,並向此表中加入不同數量級的資料,如分別加入1000條、10000條、50000條、100000條資料查看某SQL語句的執行效率。

在查詢分析器中運行如下腳本:
--建立測試資料庫
create database loadrunner_test;
use loadrunner_test
--建立測試資料表
create table test_table
(username varchar(50),sex int,age int,address varchar(100),post int)
--通過一段程式插入不同數量級的記錄,具體的語法在這裡就不多說了
declare @i int
set @i=0
while @i<1000>
begin
BEGIN TRAN T1
insert into test_table (username,sex,age,address,post) values ('戶瑞海'+cast(@i as varchar),@i-1,@i+1,'北京市和平里'+cast(@i as varchar)+'號',123456);
IF @@ERROR <> 0
begin
rollback;
select @@error
end
else
begin
commit;
set @i = @i+1
end
end

好了,執行完上述語句後,建立的資料表中已經有1000條記錄了

第二步、配置ODBC資料來源
下面進行第二步的操作,配置ODBC資料來源,為了能讓Loadrunner能夠通過ODBC協議連接到我們建立的SQL SERVER資料庫,我們需要在本機上建立ODBC資料來源,建立方法如下:
控制台—性能和維護—管理工具—資料來源(ODBC)--添加,在列表中選擇SQL SERVER點擊完成,根據嚮導輸入資料來源名稱,連結的伺服器,下一步,輸入連結資料庫的用戶名和密碼,更改連結的資料庫,完成ODBC的配置,如果配置正確的話,在最後一步點擊“測試資料來源”,會彈出測試成功的提示。

第三步、錄製SQL語句在Sql Server查詢分析器中的運行過程
配置好ODBC資料來源後就要錄製SQL語句在查詢分析器中的執行過程了:
1、 打開loadrunner,選擇ODBC協議
2、 在start recording中的application type 選擇win32 application;program to record中錄入SQL SERVER查詢分析器的路徑“..\安裝目錄\isqlw.exe”
3、 開始錄製,首先通過查詢分析器登錄SQL SERVER,在打開的查詢分析器視窗中輸入要測試的SQL語句,如“select * from test_table;”
4、 在查詢分析器中執行該語句,執行完成後,結束錄製
好了,現在就可以看到loadrunner生成的腳本了(由於腳本過長,在這裡就不粘貼了,有需要的朋友可以加我QQ,我把腳本發給你們),通過這些語句,我們可以看出,登錄資料庫的過程、執行SQL語句的過程

第四步、優化錄製腳本,設置事務
接下來,我們來優化腳本,我們分別為資料庫登錄部分和執行SQL語句的部分加一個事物,在增加一個double的變數獲取事務執行時間,簡單內容如下:
Action()
{ double trans_time; //定義一個double型變數用來保存事務執行時間
lr_start_transaction("sqserver_login"); //設置登錄事務的開始
lrd_init(&InitInfo, DBTypeVersion); //初始化連結(下面的都是loadrunner生成的腳本了,大家可以通過説明查到每個函數的意思)
lrd_open_context(&Ctx1, LRD_DBTYPE_ODBC, 0, 0, 0);
lrd_db_option(Ctx1, OT_ODBC_OV_ODBC3, 0, 0);
lrd_alloc_connection(&Con1, LRD_DBTYPE_ODBC, Ctx1, 0 /*Unused*/, 0);
………………
trans_time=lr_get_transaction_duration( "sqserver_login" ); //獲得登錄資料庫的時間
lr_output_message("sqserver_login事務耗時 %f 秒", trans_time); //輸出該時間
lr_end_transaction("sqserver_login", LR_AUTO); //結束登錄事務
lr_start_transaction("start_select");//開始查詢事務
lrd_cancel(0, Csr2, 0 /*Unused*/, 0);
lrd_stmt(Csr2, "select * from test_table;\r\n", -1, 1, 0 /*None*/, 0);//此句為執行的SQL
lrd_bind_cols(Csr2, BCInfo_D42, 0);
lrd_fetch(Csr2, -10, 1, 0, PrintRow24, 0);
……………..
trans_time=lr_get_transaction_duration( "start_select" ); //獲得該SQL的執行時間
lr_output_message("start_select事務耗時 %f 秒", trans_time); //輸出該時間
lr_end_transaction("start_select", LR_AUTO); //結束查詢事務

第五步、改變查詢數量級查看SQL語句的性能
優化後,在執行上述腳本後,就可以得到登錄到資料庫的時間及運行select * from test_table這條語句的時間了,當然我們也可以根據實際情況對該條語句進行參數化,可以測試多條語句的執行時間,也可以將該語句改為調用存儲過程的語句來測試存儲過程的執行時間。

第六步、在controller中運行腳本
接下來把該腳本在controller中運行,設置虛擬使用者數,設置集合點,這些操作我就不說了,但是值得注意的是,沒有Mercury 授權的SQL SERVER用戶license,在運行該腳本時回報錯,提示“You do not have a license for this Vuser type.
Please contact Mercury Interactive to renew your license.”我們公司窮啊買不起loadrunner,所以我也無法繼續試驗,希望有license朋友們監控一下運行結果!
最起碼在VUGen中運行該腳本我們可以得到任意一個SQL語句及存儲過程的執行時間,如果我們測試的B/S結構的程式,我們也可以通過HTML協議錄製的腳本在CONTROLLER中監控SQL SERVER伺服器的性能情況,這樣兩方面結合起來就可以對資料庫性能做一個完整的監控了。
本人對LOADRUNNER也是在摸索中,如果文章有寫的不對,或理解錯誤的地方請指出,不甚感激

沒有留言: