数据库性能测试方法讨论.doc
《数据库性能测试方法讨论.doc》由会员分享,可在线阅读,更多相关《数据库性能测试方法讨论.doc(18页珍藏版)》请在咨信网上搜索。
数据库性能测试方法讨论 发布时间: 2008-5-04 16:18 作者: 陈嘉祥 王治 方耀等 来源: 51Testing投稿 字体: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿 | 每周一问,答贴有奖 摘要:在LOADRUNNER中使用脚本和JAVA程序进行数据库性能测试。 关键词:LOADRUNNER,JAVA, Benchmark 一、 前言 在测试工作中经常需要对数据库进行性能测试,以对数据库进行调优,保证数据库的稳定和高效。 本文使用常用的性能测试工具LOADRUNNER,JAVA和专用数据库性能测试工具Benchmark,讨论数据库性能测试的不同方法,希望能抛砖引玉,寻找出更新更好的方法。 二、 任务引入 数据库性能测试的需求,一般来源于下面几个方面: 1、 数据库调优; 2、 数据库选型; 3、 数据库服务器选型; 4、 其他; 下面,就针对于这些常用的需求,列举几个不同的实例,共享一下测试方法。 1) LOADRUNNER应用 测试任务:评估某项目的核心业务逻辑(数据查询、数据复用、抽取同步整合)在不同压力下的性能表现,判断系统瓶颈,得到最优系统配置参数和建议,并为数据库的试运行工作提供可靠的性能可行性依据; 数据查询性能指标:900个用户并发,平均响应时间在3秒以内; 数据库性能测试需求:数据库调优或服务器选型; include "lrd.h" Action() { static LRD_INIT_INFO InitInfo = {LRD_INIT_INFO_EYECAT}; static LRD_DEFAULT_DB_VERSION DBTypeVersion[] = { {LRD_DBTYPE_NONE, LRD_DBVERSION_NONE} }; static void FAR * OraEnv1; static void FAR * OraSvc1; static void FAR * OraSrv1; static void FAR * OraSes1; static void FAR * OraStm1; unsigned long rownum; lrd_init(&InitInfo, DBTypeVersion); lrd_initialize_db(LRD_DBTYPE_ORACLE,3, 0); lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1, 0, 0); lrd_ora8_handle_alloc(OraEnv1, SVCCTX, &OraSvc1, 0); lrd_ora8_handle_alloc(OraEnv1, SERVER, &OraSrv1, 0); lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes1, 0); //连接数据库 lrd_server_attach(OraSrv1, "vmvare_192.168.1.47", -1, 0, 0); lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0); //设定数据库密码 lrd_ora8_attr_set(OraSes1, USERNAME, "username", -1, 0); lrd_ora8_attr_set(OraSes1, PASSWORD, "password", -1, 0); //初始化连接session lrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0); //开始连接数据库 lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0); lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm1, 0); //设定查询语句 lrd_ora8_stmt(OraStm1, "SELECT * FROM T_TASK_ALARM_TYPE WHERE TYPE_CODE=7", 1, 0, 0); //执行查询语句 lrd_ora8_exec(OraSvc1, OraStm1, 0, 0,&rownum, 0, 0, 0, 0, 1); //释放连接数据库的各种变量 lrd_handle_free(&OraStm1, 0); lrd_session_end(OraSvc1, OraSes1, 0, 0); lrd_server_detach(OraSrv1, 0, 0); lrd_handle_free(&OraEnv1, 0); //lrd_end(0); return 0; } 上面的LoadRunner脚本在Virtual User Generator调试通过后,在Controller中打开,用900个模拟用户并发测试,即可得出性能指标(LoadRunner的操作这里就不在赘述,google一下)。 从上面的例子看出,此应用比较难懂,是LoadRunner专属的方法,而且可扩展性不强。如果再遇到其他类型的数据库测试,协议将会是一个很大的问题。所以,为了容易理解,可扩展性强,引出了下面的JAVA应用方法。 2) JAVA应用 测试任务:测试待选的数据库的性能; 数据查询性能指标:20个用户并发,每秒执行增删改语句数不少于1000条; 数据库性能测试需求:数据库选型; import java.sql.*; import java.util.Date; import java.util.Properties; public class testsybase { String sDbDriver = "com.*.*.*.*"; String sConnStr = "jdbc:*:*:ip_adress:port/sid"; private Connection conn = null; private Statement stmt = null; ResultSet rs = null; public testsybase() { try { Class.forName(sDbDriver); } catch (java.lang.ClassNotFoundException e) { System.err.println("testdb():" + e.getMessage()); } } public void executeUpdate() { stmt = null; rs = null; try { conn = DriverManager.getConnection(sConnStr, "*", "*"); stmt = conn.createStatement(); System.out.println(new Date()); int j=0; for(int i=0;i<10000;i++){ j=10001+i; //追加 sql="insert into tablename(*, *, *...) "+"values('test"+i+"',*,*...)"; //更新 //sql="update tablename set field_no='testupdate',*,*... where filed_no="+j; //删除 //sql="delete from tablename where tablename="+j; //查询 //sql="select * from tablename where tablename="+j; stmt.executeUpdate(sql); //rs=stmt.executeQuery(sql); //rs.next(); } System.out.println(new Date()); //rs.close(); stmt.close(); conn.close(); System.out.println("Update is secuessful!"); } catch (SQLException ex) { System.err.println("executeUpdate:" + ex.getMessage()); } } public void executeSql(String sql) { stmt = null; rs = null; try { conn = DriverManager.getConnection(sConnStr, "*", "*"); stmt = conn.createStatement(); rs=stmt.executeQuery(sql); rs.next(); System.out.println("Count is "+rs.getString(1)); stmt.close(); conn.close(); //System.out.println("OK"); } catch (SQLException ex) { System.err.println("executeSql:" + ex.getMessage()); } } public static void main(String[] args) { testsybase mytest = new testsybase(); mytest.executeUpdate(); } } 上面的java代码调试通过后,可以通过注释不同的代码段,分别测试增加、修改、删除、查询的等情况的性能,并得出时长,反算出性能。 这里说明一点,java代码即可以单独的打成jar包,放在服务器上运行,也可以直接在本地IDE运行。如果觉得LoadRunner专业,也可以放到LoadRunner里运行,选择Java Vuser协议,这里需要注意的是,LoadRunner运行时,需要设置好Runtime Settings中的Classpath,代码运行需要的jar包都要加到这里。提醒一点的是,笔者使用的是LoadRunner 8.0,在跑上面的代码时,使用的是Java 1.4的虚拟机,高版本如1.5就不能成功运行。 从这个例子可以看出,此种应用灵活性强,任何数据库都可以做测试,只要有提供的驱动即可,如果需要,还可以扩展其他的方法。但测试人员需至少掌握一种高级编程语言,对数据库操作也必须很熟悉,要求较高,所以又引出了下面的Benchmark的应用方法。 3) Benchmark应用 1. 引言 诚然上述的编写代码以进行数据库性能测试,对于初级测试员来说还显得有点难度,如何才能使用比较简单的方法进行测试呢?这里将会介绍Quest公司的Benchmark Factory,它以向导的方式一步步指引你开展测试,是一个很容易上手的工具。 2. 模型设计 假设有一个正在使用的数据库,库中有相当数量的数据,作为支撑某个系统用。每天上班时间中大概有500人次的A表写入记录,也大约有500人次的A表查询;系统的程序每天大概会往数据库的B表写进50000条记录,以及5000条C表记录,还有1000条A表记录,删除500条A表记录,更新100条D表记录;然后管理员要对B表、C表及D表进行50人次查询。根据二八原则,百分之八十的工作在百分之二十的时间内完成,即上述列出的工作量,其80%将在1.6小时完成。 另外作为对比,本次测试再对该模型进行缩减处理,即在二八原则的基础上,工作量及时间都缩减为原来的10%。 最终的结果是10分钟内,对数据库进行的查询操作有40条A表查询、BCD表各4条查询;写操作有120条A表记录、4000条B表记录、400条C表记录;更新操作有8条D表记录;删除操作有40条A表记录。 3. 语句构建 相关的SQL语句构建如下: 1、查询A表 select * from A 2、查询B表 select * from B 3、查询C表 select * from C 4、查询D表 select * from D 5、写入A表 insert into A (a,b,c) values (1,2,3) 6、写入B表 insert into B(e,f,g) values (4,5,6) 7、写入C表 insert into C(h,i,j) values (7,8,9) 8、更新D表 update D set k = $BFRand(100) 9、删除A表记录 delete from A WHERE ROWNUM<=1 注:$BFRand(100)是Benchmark Factory提供的一个随即函数。 4. 方案建立 在Benchmark Factory里面建立好ORACLE的profile后,新建一个Scenario (Create a custom load scenario) 因为有多个SQL语句,所以类型选择混合(Mix) 接着选择添加SQL语句 一一填写完成并根据模型设计赋予不同的权重(Weight) 大约设置一下并发用户数,完成后可以看到脚本区有着新增的事务列表 在右侧窗口还可以设置每次迭代的时间与并发用户数 然后再到左边脚本区,在右键菜单中选择Submit Job,这时候Benchmark Factory就开始自动跑起来了。 5. 测试结果 注:红色加粗字体为值得关注部分 1、10分钟10个并发用户 Run Information Test Run Id 12 Status Completed Start Time 2008-3-25 12:31 Stop Time 2008-3-25 12:42 Comment 10min test2(10users) Timing Settings Sampling Time 0h:9m:41s Pre-Sample Time 0h:0m:0s Overall Results Userload Test Phase TPS BPS Rows Bytes 10 1 9.75 36714.62 40097 21330928 Transaction Results - User Load: 10 Name Executions Rows Bytes Avg Time delete from A WHERE ROWNUM<=1 58 0 0 0.011 update D set k = $BFRand(100) 12 0 0 0.094 select * from D 5 5 120 0.002 select * from C 4 1406 792984 0.065 select * from B 6 34396 18195484 0.987 select * from A 48 4290 2342340 0.021 insert into C(h,i,j) values (7,8,9) 473 0 0 0.024 insert into B(e,f,g) values (4,5,6) 4918 0 0 0.021 insert into A (a,b,c) values (1,2,3) 137 0 0 0.03 可见TPS约为并发用户数,应该还有上升空间,各SQL语句执行次数比较符合理想目标。用时方面就是B表查询需时较长(同时B表的行数也比较多),其他比较理想。另估计是B表的查询延迟了其他的操作,导致SQL脚本总体执行次数不算太多。 2、80~100个并发虚拟用户逐渐增加的5次迭代 Run Information Test Run Id 13 Status Completed Start Time 2008-3-25 14:02 Stop Time 2008-3-25 16:43 Comment 1h40m 80~100users Test Information Name: Custom Mix Load Scenario Test Type: Mixed Workload Database Test Test Id: 9 Version Overall Results Userload Test Phase TPS BPS Rows Bytes 80 1 74.62 1908954 4138842 2213872937 85 1 53.74 4319793 9608651 5125378346 90 1 33.93 4819426 13545885 7213793995 95 1 28.85 4622486 15843582 8435056936 100 1 25.05 4469853 18239866 9712356930 Transaction Results - User Load: 80 Name Executions Rows Bytes Avg Time delete from A WHERE ROWNUM<=1 753 0 0 0.039 update D set k = $BFRand(100) 145 0 0 0.015 select * from D 78 78 1872 0.003 select * from C 73 343813 193910532 1.438 select * from B 72 3063689 1620691481 12.13 select * from A 743 731262 399269052 0.336 insert into C(h,i,j) values (7,8,9) 7360 0 0 0.07 insert into B(e,f,g) values (4,5,6) 75025 0 0 0.055 insert into A (a,b,c) values (1,2,3) 2216 0 0 0.031 这里原先构想是100分钟内并发用户从80个提升到100个,但Benchmark Factory使用的是分开多次迭代来进行对比,于是便有上述图例(具体语句的执行情况只精选了80、90、100三次迭代)。 从数据中分析,在80个并发用户时,TPS还是约等于并发用户数,并且在20分钟内就完成了模型中的操作量。在90个并发用户时,TPS已经大为下跌,事务处理时间大为增加,但在20至30分钟左右还是能够基本完成模型中的操作量。至100个并发用户时,TPS就相当低下,部分事务处理时间到了一个比较难以忍受的地步,使用的时间也耗费40多分钟。虽然因为到后面数据库表中的数据越来越多,但如此的性能还是需要优化。 从事务角度入手,文章开头所设计的模型大概在80个并发用户左右会遭遇瓶颈,如果并发用户数目不多,则该ORACLE数据库足够可以应付。另外B表的数据量增长得很快,进行对该表查询的事务时间亦随之呈几何级别增长,必须对该表进行索引管理以提高效率。其余两个需要经常查询的表同理。 6. 后记 此应用是针对已经投入生产使用的ORACLE数据库,通过Benchmark Factory调用系统中常用的SQL语句来进行数据库性能测试,此乃Benchmark Factory的冰山一角也。读者不妨在阅读本文后,尝试Benchmark Factory的其他测试向导,找出Benchmark Factory的强大所在。 三、 小结 综合上面的3种应用,我们分析一下各自的优缺点和适用范围: LoadRunner是一种工业级的性能测试工具,也得到了业界的广泛认可,但对于数据库性能测试来说,它显得有点勉为其难,同时提供的协议支持也不多,对于初中级测试人员来说,是个很大的挑战; JAVA应用是需要自己对编码和数据库操作都比较熟悉的情况下才选择的方案,当然也可以用c和其他的开发工具,关键是能够按照自己的意愿实施性能测试。对于初中级测试人员来说,也将是个很大的挑战; Benchmark应用也是一种比较简单适用的数据库性能测试工具,它自身支持的数据库类型较多,如mysql,db2,sybase,oracle等,对于初学者来说,是个不错的选择; 纵观上面的应用,我们是从难到易找到各种方法进行测试的,目的就是要逐步提高我们的测试水平,提高测试效率,同时让不同层次的测试人员掌握数据库性能测试方法。些许经验,共享之,错漏难免,不吝赐教。- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 性能 测试 方法 讨论
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文