SQL 壓力測試實戰篇 - GetIt01
文章推薦指數: 80 %
針對資料庫的測試,市面上已經有很多工具了,Google 上搜一下sql testing tool , 他為你選出的工具,琳琅滿目,看花雙眼。
比如:40+ Best Database Testing Tools - ...
標籤:MySQLSQL資料庫
SQL壓力測試實戰篇
05-28
SQL壓力測試實戰篇
來自專欄有關SQL針對資料庫的測試,市面上已經有很多工具了,Google上搜一下sqltestingtool,他為你選出的工具,琳琅滿目,看花雙眼。
比如:40+BestDatabaseTestingTools-PopularDataTestingSolutions這篇文章列舉了總共43個測試工具,可以用來完成SQL的測試,包括生成測試數據,功能性測試,邏輯性測試,當然還有壓力測試。
在這裡羅列幾個工具,以便有應用場景的時候,可以拿起來直接用。
現在的應用系統,一般都會有好幾層,比如UI,AccessLayer,BusinessLayer,資料庫。
每一層都有自己獨立的測試工具,下面的工具可能會同時支持其中1,2層對應的測試。
TestDataGenerator:
1.datafactory商業用資料庫數據生成工廠。
主要特點有:1.生成數據2.壓力測試2.MockupData3.DTMDataGeneratorSQL-BasedTools:1.SQLServerDatabasetools2.SQLTest:usestSQLtframeworktomaketestonviews,storedproceduresandfunctions。
使用的是tSQLt測試框架,用來測試試圖,存儲過程以及函數3.tSQLt:dedicatedtosqlserver
4.oraclesqldeveloper:5.NoSQLUnit:6.NoSQLMap:7.SeLite:combinationofseleniumandSQLite,knownasSeleniumextension8.SQLMap:opensourcetoolforSQLite,MySQL,SQLServer,DB2,PostgreSQLDBbasedLevelTestingtools:1.HammerDB:opensourcetoolfordatabaseloadtesting,usedasbenchmarkingtoolforsqlserver,mysql,db2,oracle。
這款工具的優點在於,他是opensource即開源的工具,意味著你可以完全看到他的測試方案。
看不到測試方案的工具,其實對自己理解測試報告,是有障礙的,比如並發是怎麼協調的,測試用的邏輯腳本是不是能體現出測試要求。
UIEnhancedTools:自帶絢麗UI的一體化工具1.Toad。
這款工具就不用多說了,和Oracle打交道並且是大廠項目的話,Toad基本是必用工具。
2.DBVisualizer:toad旗下的可視化開發工具,最有用的一點是可以快速建立ER圖
3.Databasebenchmark:opensourcetoolforperformingstresstestingonadatabasethatcontainsalargevolumeofdata.Graphicvisualizationandreportingoptionsareadvancedfeaturesofthistool.開源工具,可視化配置測試用例,性能測試報告。
針對MySQL,Oracle,MariaDB:1.Navicat:formySQL,alsomanagedatainsqlserver,oracle,mysql,SQLite2.LoadRunnerforOracle:在BrentOzar的博客上找到一個非常棒的工具:SQLQueryStress,並且是opensource開源的。
可以從github上下載並使用。
https://www.brentozar.com/archive/2015/05/how-to-fake-load-tests-with-sqlquerystress說了那麼多,這才是本文的主角。
如果你是手機的Geek,我想你一定會喜歡Andriod.iPhone當然也有玩頭,只不過AppStore上線一應用,審批實在麻煩。
這款SQLQueryStress就像是Andriod上的應用一樣,隨你拆開來玩,一睹內部玄妙的機關。
Github是個重武器庫,當今的軟體替代品差不多都能找到。
大家看到的題圖,都是用了GitHub上的小爬蟲,從Instagram上扣下來的。
首先交代測試環境:1.測試工具:SQLQueryStress下載路徑:https://github.com/ErikEJ/SqlQueryStress2.測試用SQLServer伺服器:個人的vmware虛擬機,配置較低[email protected].測試方案:
3.1用戶響應時間:讀3.2伺服器CPU利用率今天暫時針對CPU做測試。
1.10個並發的情況下,平均響應時間在0.4973秒。
可以說妥妥的。
但細心的朋友肯定注意到,其實這裡只是單純的運行同一個SQL,想想是不是哪裡不夠嚴謹,哪裡可以提高,哪裡是瓶頸?2.200個並發下,平均響應時間已經超過1s,接近2s了當這200個並發,一直在運行著查詢的時候,即使是同一個查詢,響應時間也已經不可接受了。
我們在本次實驗中,應用的是同一段腳本,同一段腳本運行完了之後,執行計劃會被緩存起來,相應的數據,也會在資料庫的緩存中保留下來,這樣的環境下,連續的發出查詢請求,其實對伺服器的CPU考核已經不是很嚴格了,不需要硬解析,不需要從資料庫磁碟拿出數據,但並發的響應時間依然不合格。
假如我們用一個總調度,根據線程ID來隨機抽取一個只讀存儲過程進行查詢,這樣的查詢對CPU的考驗才叫嚴格與真實。
剛才我們用10個並發的時候,系統沒有明顯的壓力,響應時間夠快。
這次我們就做10個存儲過程,當10個並發同時調用這10個存儲過程的時候,檢查響應時間,是不是依然合格!1利用AdventureWorks資料庫,編寫10個簡單的存儲過程2編寫一個總調度存儲過程,根據各自的線程ID,即session_id,來隨機調取其中一個存儲過程10個簡單的存儲過程可以這麼快速生成:DECLARE@sql_bodyNVARCHAR(max);DECLAREmy_curCURSORFORSELECTTOP10createprocedure+schema_name(schema_id)+.get+NAME+asbegin+selectcount(*)ascntfrom+schema_name(schema_id)+.+NAME+end+CHAR(10)+go
FROMsys.objectsWHEREtype_desc=user_tableOPENmy_curFETCHNEXTFROMmy_curINTO@sql_bodyPRINT@sql_bodyWHILE@@fetch_status=0BEGINFETCHNEXT
FROMmy_curINTO@sql_bodyPRINT@sql_body;ENDCLOSEmy_curDEALLOCATEmy_curGO總調度存儲過程:CREATEPROCEDUREdbo.usp_randRunQuery@threadsINT=10AS
BEGINDECLARE@sql_bodyNVARCHAR(max);CREATETABLE#temp_procs(procedurenameNVARCHAR(max),idINTidentity(1,1))INSERTINTO#temp_procsSELECTTOP10exec+schema_name(schema_id)+.+NAMEFROMsys.objectsWHEREtype_desc=SQL_STORED_PROCEDUREORDERBYcreate_dateDESCSELECT@sql_body=procedurenameFROM#temp_procsWHEREid=@@spid%@threadsEXECsp_executesql@stmt=@sql_body;DROPTABLE#temp_procsEND當10個線程,調用不同的存儲過程時,響應速度依舊可以。
有峰值,但不過百在執行過程中,我發現並不是每一次的iteration都是固定的線程,有可能每一次執行,分配的處理線程會改變,因此需要多循環幾次,來保證每一個存儲過程都被調用,並且一段時間內有足夠多的並發在運行我的猜想是,到了一定的時間之後,相應時間會趨穩。
所以做了一個記錄每一個查詢的執行時間的功能,如下:1加一張Log表:createtableexecution_log(execidbigintidentity(1,1),spidint,procnamenvarchar(2000),start_dtdatetime,end_dtdatetime)2.修改我們的調度過程CREATEPROCEDUREdbo.usp_randRunQuery@threadsINT=10ASBEGINBEGINDECLARE@execidBIGINTDECLARE@sql_bodyNVARCHAR(2000);CREATETABLE#temp_procs(procedurenameNVARCHAR(2000),idINTidentity(1,1))INSERTINTO#temp_procsSELECTTOP10exec+schema_name(schema_id)+.+NAMEFROMsys.objectsWHEREtype_desc=SQL_STORED_PROCEDUREORDERBYcreate_dateDESCSETIDENTITY_INSERT#temp_procsOFFINSERTINTO#temp_procs(id,procedurename)SELECT0,procedurenameFROM#temp_procsWHEREid=6SETIDENTITY_INSERT#temp_procsONSELECT@sql_body=procedurenameFROM#temp_procsWHEREid=@@spid%@threads%10INSERTINTOexecution_log(spid,procname,start_dt)VALUES(@@spid,@sql_body,getutcdate())SELECT@execid=SCOPE_IDENTITY()EXECsp_executesql@stmt=@sql_body;UPDATEexecution_logSETend_dt=getutcdate()WHEREexecid=@execid;DROPTABLE#temp_procsENDEND果不出所料,再多的請求,相應時間也穩定下來了推薦閱讀:
※MySQL資料庫應用總結(八)—MySQL資料庫索引的操作※如何修改mysql密碼?※國內做分散式資料庫開發的現狀如何,有怎樣的發展前景?※注意!Riddle漏洞正在影響低版本OracleMySQL,請立即更新!※MySql的資料庫操作
TAG:SQL|MySQL|資料庫|
一點新知
GetIt01
延伸文章資訊
- 1SQL 壓力測試實戰篇 - GetIt01
針對資料庫的測試,市面上已經有很多工具了,Google 上搜一下sql testing tool , 他為你選出的工具,琳琅滿目,看花雙眼。 比如:40+ Best Database Testi...
- 2資料庫壓力測試方法小結
在前面的壓力測試過程中,主要關注的是對介面以及伺服器硬體效能進行壓力測試,評估請求介面和硬體效能對服務的影響。但是對於多數Web應用來說,整個系統 ...
- 3學習使用Jmeter做壓力測試(三)--資料庫測試 - ITREAD01.COM
資料庫測試. JMeter可以做為Web伺服器與瀏覽器之間的代理閘道器,以捕獲瀏覽器的請求和Web伺服器的響應,這樣就可很容易的生成效能測試指令碼。
- 4[資料庫]000 - Sysbench 資料庫壓力測試工具 - IT人
000 - Sysbench 資料庫壓力測試工具sysbench 是一個開源的、模組化的、跨平臺的多執行緒效能測試工具,可以用來進行CPU、記憶體、磁碟I/O、執行緒、 ...
- 5Toad for SQL Server-如何進行資料庫系統壓力測試 - iT 邦幫忙
Toad for SQL Server-如何進行資料庫系統壓力測試. mpinfo. 12 年前‧ 12642 瀏覽. 11. 壓力測試(Stress Test) – 用以驗證系統在超出預期的負...