针对数据库的测试,市面上已经有很多工具了,Google 上搜一下 sql testing tool , 他为你选出的工具,琳琅满目,看花双眼。

比如:40+ Best Database Testing Tools - Popular Data Testing Solutions 这篇文章列举了总共 43 个测试工具,可以用来完成 SQL 的测试,包括生成测试数据,功能性测试,逻辑性测试,当然还有压力测试。

在这里罗列几个工具,以便有应用场景的时候,可以拿起来直接用。

现在的应用系统,一般都会有好几层,比如 UI, Access Layer, Business Layer, 数据库。每一层都有自己独立的测试工具,下面的工具可能会同时支持其中1,2层对应的测试。

Test Data Generator:

1 data factory商业用数据库数据生成工厂。主要特点有:1.生成数据2.压力测试2  MockupData3 DTM Data Generator

SQL-Based Tools:

1. SQL Server Database tools2. SQL Test: uses tSQLt framework to make test on views, stored procedures and functions。 使用的是 tSQLt 测试框架,用来测试试图,存储过程以及函数3. tSQLt:dedicated to sql server4. oracle sql developer:5. NoSQLUnit:6. NoSQLMap:7. SeLite:combination of selenium and SQLite, known as Selenium extension8. SQLMap: open source tool for SQLite, MySQL, SQL Server, DB2, PostgreSQL

DB based Level Testing tools:

  1. HammerDB: open source tool for database load testing, used as benchmarking tool for sql server, mysql, db2, oracle。 这款工具的优点在于,他是
    open
    source即开源的工具,意味着你可以完全看到他的测试方案。看不到测试方案的工具,其实对自己理解测试报告,是有障碍的,比如并发是怎么协调的,测试用的逻辑脚本是不是能体现出测试要求。

UI Enhanced Tools: 自带绚丽UI的一体化工具

1. Toad。 这款工具就不用多说了,和 Oracle 打交道并且是大厂项目的话,Toad 基本是必用工具。2. DBVisualizer: toad 旗下的可视化开发工具, 最有用的一点是可以快速建立ER图3. Database benchmark: open source tool for performing stress testing on a database that contains a large volume of data. Graphic visualization and reporting options are advanced features of this tool. 开源工具,可视化配置测试用例,性能测试报告。

针对 MySQL, Oracle, MariaDB :

  1. Navicat: for mySQL, also manage data in sql server , oracle, mysql, SQLite

  2. LoadRunner for Oracle:

在 Brent Ozar 的博客上找到一个非常棒的工具: SQLQueryStress, 并且是open source 开源的。可以从github 上下载并使用。

https://www.brentozar.com/archive/2015/05/how-to-fake-load-tests-with-sqlquerystress

说了那么多,这才是本文的主角。

如果你是手机的 Geek, 我想你一定会喜欢 Andriod.

iPhone 当然也有玩头,只不过 App Store 上线一应用,审批实在麻烦。

这款 SQLQueryStress 就像是 Andriod 上的应用一样,随你拆开来玩,一睹内部玄妙的机关。Github 是个重武器库,当今的软件替代品差不多都能找到。大家看到的题图,都是用了 GitHub 上的小爬虫,从 Instagram 上扣下来的。

首先交代测试环境:

1 测试工具: SQLQueryStress

下载路径:https://github.com/ErikEJ/SqlQueryStress

2 测试用 SQL Server 服务器:

个人的vmware 虚拟机,配置较低Windows Server 20122GB RAMIntel Core i3CPU @3.07 GHZ20GB SSD

3 测试方案:

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_body NVARCHAR(max);DECLARE my_cur CURSORFORSELECT TOP 10 'create procedure ' + schema_name(schema_id) + '.get' + NAME + ' as begin ' + 'select count(*) as cnt from ' + schema_name(schema_id) + '.' + NAME + ' end  ' + CHAR(10) + 'go'FROM sys.objectsWHERE type_desc = 'user_table'OPEN my_curFETCH NEXTFROM my_curINTO @sql_bodyPRINT @sql_bodyWHILE @@fetch_status = 0BEGINFETCH NEXTFROM my_curINTO @sql_bodyPRINT @sql_body;ENDCLOSE my_curDEALLOCATE my_curGO

总调度存储过程:

CREATE PROCEDURE dbo.usp_randRunQuery @threads INT = 10ASBEGINDECLARE @sql_body NVARCHAR(max);CREATE TABLE #temp_procs (procedurename NVARCHAR(max),id INT identity(1, 1))INSERT INTO #temp_procsSELECT TOP 10 'exec ' + schema_name(schema_id) + '.' + NAMEFROM sys.objectsWHERE type_desc = 'SQL_STORED_PROCEDURE'ORDER BY create_date DESCSELECT @sql_body = procedurenameFROM #temp_procsWHERE id = @@spid % @threadsEXEC sp_executesql @stmt = @sql_body;DROP TABLE #temp_procsEND

当 10 个线程,调用不同的存储过程时,响应速度依旧可以。有峰值,但不过百

在执行过程中,我发现并不是每一次的 iteration 都是固定的线程,有可能每一次执行,分配的处理线程会改变,因此需要多循环几次,来保证每一个存储过程都被调用,并且一段时间内有足够多的并发在运行

我的猜想是,到了一定的时间之后,相应时间会趋稳。

所以做了一个记录每一个查询的执行时间的功能,如下:

1 加一张Log表:

create table execution_log(execid bigint identity(1,1), spid int,
procname nvarchar(2000),start_dt datetime, end_dt datetime)

2 修改我们的调度过程

CREATE PROCEDURE dbo.usp_randRunQuery @threads INT = 10ASBEGINBEGINDECLARE @execid BIGINTDECLARE @sql_body NVARCHAR(2000);CREATE TABLE #temp_procs (procedurename NVARCHAR(2000),id INT identity(1, 1))INSERT INTO #temp_procsSELECT TOP 10 'exec ' + schema_name(schema_id) + '.' + NAMEFROM sys.objectsWHERE type_desc = 'SQL_STORED_PROCEDURE'ORDER BY create_date DESCSET IDENTITY_INSERT #temp_procs OFFINSERT INTO #temp_procs (id,procedurename)SELECT 0,procedurenameFROM #temp_procsWHERE id = 6SET IDENTITY_INSERT #temp_procs ONSELECT @sql_body = procedurenameFROM #temp_procsWHERE id = @@spid % @threads % 10INSERT INTO execution_log (spid,procname,start_dt)VALUES (@@spid,@sql_body,getutcdate())SELECT @execid = SCOPE_IDENTITY()EXEC sp_executesql @stmt = @sql_body;UPDATE execution_logSET end_dt = getutcdate()WHERE execid = @execid;DROP TABLE #temp_procsENDEND

果不出所料,再多的请求,相应时间也稳定下来了

SQL 压力测试实战相关推荐

  1. Jmeter验证码图片识别注册接口压力测试实战

    写在前面 前段时间写了一篇博文<Jmeter验证码注册接口压力测试实战>,前两天又登录对应的网站看了一下.发现原来滑动验证的方式改成了图片验证码的方式,防止用户多次发送手机验证码. 看到这 ...

  2. android 获取monkey日志_Android压力测试:monkey压力测试实战

    主要分享的主题是 Android App 专项测试, 通过 monkey 进行压力测试. 一.测试步骤 1.安装ADB 2.连接被测手机和电脑 3.打开CMD命令行 4.输入monkey命令 adb ...

  3. Jmeter验证码注册接口压力测试实战

    主要学习的内容包括发送HTTP请求.HTTP信息头管理器.HTTP cookies管理器.用户定义的变量.响应断言.CSV数据文件设置的使用. 测试网址及测试接口等说明 提供的测试网址为: http: ...

  4. 压力测试实战,压力测试步骤压力测试数据 (史上最全最详细教程)

    目录:导读 前言 一.为什么准备数据 二.测试数据分类 三.测试数据准备要求 四.测试数据准备思路 五.总结 前言 压力测试只有在服务器处于高压状态时,才能真正反映各种设置暴露出来的问题.现在很多压力 ...

  5. Jmeter 接口压力测试实战(一):Jmeter将测试结果写入到Excel中

    1.Jmeter写入结果到Excel之环境准备 下载jxl.jar包 下载好之后,将这个包放到jmeter安装路径下的lib目录下 jxl.jar的作用:完成对excel的读写以及修改等操作 2.如何 ...

  6. SQL压力测试用的语句和相关计数器

    将数据库中所有表的所有的内容选一遍: IF object_id('tempdb..#temp')   is   not   null      BEGIN DROP TABLE #temp END D ...

  7. Android App压力测试

    前言:写这篇文章的目的,一是因为不少同学作为Android开发,很少会自己去做压力测试,不了解相关的技术,不知道压力测试是什么.怎么工作的:二是询问过身边的一些测试同学,他们进行压力测试的时候,很多情 ...

  8. Java秒杀系统实战系列~JMeter压力测试重现秒杀场景中超卖等问题

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十二篇,本篇博文我们将借助压力测试工具Jmeter重现秒杀场景(高并发场景)下出现的各种典型的问题,其中最为经典的当属&quo ...

  9. [SQL Server]用于压力测试和性能分析的两个支持实用工具[转]

    微软有两个不提供支持服务的SQL Server压力测试和性能分析工具.具体看微软知识库: http://support.microsoft.com/?kbid=887057 分别是: Read80Tr ...

最新文章

  1. Python中的小细节
  2. 用脑科学支持人工智能
  3. WebSocket的故事(六)—— Springboot中,实现更灵活的WebSocket
  4. 【Flutter学习】组件学习之目录
  5. mac电脑循环次数多少算新_ARM架构电脑之路,苹果需要从微软Surface ProX中吸取哪些教训?...
  6. 一本好的教辅,可以少走很多弯路:算法分析和设计 王晓东
  7. [C#]最简单的Base64加密解密
  8. 第三次学JAVA再学不好就吃翔(part26)--static关键字
  9. 谷粒商城高级篇资料_一文搞定剑指offer面试题【分文别类篇】
  10. ASCII码与string的相互转换
  11. sql 拆分_实践参考:MySQL架构设计从开发规范、选型、拆分到减压实战指南
  12. c/c++ 求字符数组长度(非所占内存大小)
  13. java 数组 null值_数组的元素String在java中包含null
  14. js正则替换html字符串,js正则找出字符串的内容,并替换内容
  15. 模式化窗口问题![window.dialogArguments]
  16. Take Your Seat
  17. [书籍阅读] Spring Persistence with Hibernate
  18. this.$refs使用方法
  19. 计算机原理课堂,计算机原理课堂测验题集.ppt
  20. vue3 + vite + ts + setup , 第七练 TSX的使用

热门文章

  1. excel怎么把竖排变成横排_排版丑怎么办?5个方法拯救你
  2. ms721调试总结及光电传感器板测试总结
  3. 磁带存储发展趋势浅析
  4. PGP生成秘钥对及应用
  5. IDM产品安全机制说明
  6. IFS认证辅导,国际食品企业认证BRC和IFS起源和发展
  7. Unity Shader UV动画之高光材质加上透明材质与UV动画
  8. 如何购买SAP软件?
  9. 视觉显著性python_OpenCV—python 图像显著性检测算法—HC/RC/LC/FT
  10. 29.递归三元表达式生成式匿名函数