本次通過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 //循環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數據源,爲了能讓loadrunner能夠通過ODBC協議連接到我們建立的SQL SERVER數據路,我們需要在本機上建立ODBC數據源,建立方法如下:
控制面板—性能和維護—管理工具—數據源(ODBC)--添加,在列表中選擇SQL SERVER點擊完成,根據嚮導輸入數據源名稱,鏈接的服務器,下一步,輸入鏈接數據庫的用戶名和密碼,更改鏈接的數據庫,完成ODBC的配置,如果配置正確的話,在最後一步點擊“測試數據源”,會彈出測試成功的提示。
配置好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); //結束查詢事務
優化後,在執行上述腳本後,就可以得到登錄到數據庫的時間及運行select * from test_table這條語句的時間了,當然我們也可以根據實際情況對該條語句進行參數化,可以測試多條語句的執行時間,也可以將該語句改爲調用存儲過程的語句來測試存儲過程的運行時間。
接下來把該腳本在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也是在摸索中,如果文章有寫的不對,或理解錯誤的地方請指出,不甚感激。