不应该是家,窝更适合一点

发布新日志

  • 写出高性能SQL语句的十三条法则【zt】

    2011-02-21 08:55:52


      1、首先要搞明白什么叫执行计划?

      执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用“全表扫描”方式。

      可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要:

      (1)SQL语句是否清晰地告诉查询优化器它想干什么?

      (2)查询优化器得到的数据库统计信息是否是最新的、正确的?

      2、统一SQL语句的写法

      对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。

    select * from dual 

    select * From dual

      其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行!

      3、不要把SQL语句写得太复杂

      我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。

      一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,我可以保证数据库也会晕的。

      另外,执行计划是可以被重用的,越简单的SQL语句被重用的可能性越高。而复杂的SQL语句只要有一个字符发生变化就必须重新解析,然后再把这一大堆垃圾塞在内存里。可想而知,数据库的效率会何等低下。

      4、使用“临时表”暂存中间结果

      简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。

      5、OLTP系统SQL语句必须采用绑定变量

    select * from orderheader where changetime > ‘2010-10-20 00:00:01’ 
    select * from orderheader where changetime > ‘2010-09-22 00:00:01’

      以上两句语句,查询优化器认为是不同的SQL语句,需要解析两次。如果采用绑定变量

    select * from orderheader where changetime > @chgtime

      @chgtime变量可以传入任何值,这样大量的类似查询可以重用该执行计划了,这可以大大降低数据库解析SQL语句的负担。一次解析,多次重用,是提高数据库效率的原则。

      6、绑定变量窥测

      事物都存在两面性,绑定变量对大多数OLTP处理是适用的,但是也有例外。比如在where条件中的字段是“倾斜字段”的时候。

    倾斜字段”指该列中的绝大多数的值都是相同的,比如一张人口调查表,其中“民族”这列,90%以上都是汉族。那么如果一个SQL语句要查询30岁的汉族人口有多少,那“民族”这列必然要被放在where条件中。这个时候如果采用绑定变量@nation会存在很大问题。

    试想如果@nation传入的第一个值是“汉族”,那整个执行计划必然会选择表扫描。然后,第二个值传入的是“布依族”,按理说“布依族”占的比例可能只有万分之一,应该采用索引查找。但是,由于重用了第一次解析的“汉族”的那个执行计划,那么第二次也将采用表扫描方式。这个问题就是著名的“绑定变量窥测”,建议对于“倾斜字段”不要采用绑定变量。

      7、只在必要的情况下才使用begin tran

      SQL Server中一句SQL语句默认就是一个事务,在该语句执行完成后也是默认commit的。其实,这就是begin tran的一个最小化的形式,好比在每句语句开头隐含了一个begin tran,结束时隐含了一个commit。

      有些情况下,我们需要显式声明begin tran,比如做“插、删、改”操作需要同时修改几个表,要求要么几个表都修改成功,要么都不成功。begin tran 可以起到这样的作用,它可以把若干SQL语句套在一起执行,最后再一起commit。好处是保证了数据的一致性,但任何事情都不是完美无缺的。Begin tran付出的代价是在提交之前,所有SQL语句锁住的资源都不能释放,直到commit掉。

      可见,如果Begin tran套住的SQL语句太多,那数据库的性能就糟糕了。在该大事务提交之前,必然会阻塞别的语句,造成block很多。

      Begin tran使用的原则是,在保证数据一致性的前提下,begin tran 套住的SQL语句越少越好!有些情况下可以采用触发器同步数据,不一定要用begin tran。

      8、一些SQL查询语句应加上nolock

      在SQL语句中加nolock是提高SQL Server并发性能的重要手段,在oracle中并不需要这样做,因为oracle的结构更为合理,有undo表空间保存“数据前影”,该数据如果在修改中还未commit,那么你读到的是它修改之前的副本,该副本放在undo表空间中。这样,oracle的读、写可以做到互不影响,这也是oracle广受称赞的地方。SQL Server 的读、写是会相互阻塞的,为了提高并发性能,对于一些查询,可以加上nolock,这样读的时候可以允许写,但缺点是可能读到未提交的脏数据。使用nolock有3条原则。

      (1)查询的结果用于“插、删、改”的不能加nolock !

      (2)查询的表属于频繁发生页分裂的,慎用nolock !

      (3)使用临时表一样可以保存“数据前影”,起到类似oracle的undo表空间的功能,

      能采用临时表提高并发性能的,不要用nolock 。

      9、聚集索引没有建在表的顺序字段上,该表容易发生页分裂

      比如订单表,有订单编号orderid,也有客户编号contactid,那么聚集索引应该加在哪个字段上呢?对于该表,订单编号是顺序添加的,如果在orderid上加聚集索引,新增的行都是添加在末尾,这样不容易经常产生页分裂。然而,由于大多数查询都是根据客户编号来查的,因此,将聚集索引加在contactid上才有意义。而contactid对于订单表而言,并非顺序字段。

      比如“张三”的“contactid”是001,那么“张三”的订单信息必须都放在这张表的第一个数据页上,如果今天“张三”新下了一个订单,那该订单信息不能放在表的最后一页,而是第一页!如果第一页放满了呢?很抱歉,该表所有数据都要往后移动为这条记录腾地方。

      SQL Server的索引和Oracle的索引是不同的,SQL Server的聚集索引实际上是对表按照聚集索引字段的顺序进行了排序,相当于oracle的索引组织表。SQL Server的聚集索引就是表本身的一种组织形式,所以它的效率是非常高的。也正因为此,插入一条记录,它的位置不是随便放的,而是要按照顺序放在该放的数据页,如果那个数据页没有空间了,就引起了页分裂。所以很显然,聚集索引没有建在表的顺序字段上,该表容易发生页分裂。

      曾经碰到过一个情况,一位哥们的某张表重建索引后,插入的效率大幅下降了。估计情况大概是这样的。该表的聚集索引可能没有建在表的顺序字段上,该表经常被归档,所以该表的数据是以一种稀疏状态存在的。比如张三下过20张订单,而最近3个月的订单只有5张,归档策略是保留3个月数据,那么张三过去的15张订单已经被归档,留下15个空位,可以在insert发生时重新被利用。在这种情况下由于有空位可以利用,就不会发生页分裂。但是查询性能会比较低,因为查询时必须扫描那些没有数据的空位。

    重建聚集索引后情况改变了,因为重建聚集索引就是把表中的数据重新排列一遍,原来的空位没有了,而页的填充率又很高,插入数据经常要发生页分裂,所以性能大幅下降。

      对于聚集索引没有建在顺序字段上的表,是否要给与比较低的页填充率?是否要避免重建聚集索引?是一个值得考虑的问题!

      10、加nolock后查询经常发生页分裂的表,容易产生跳读或重复读

      加nolock后可以在“插、删、改”的同时进行查询,但是由于同时发生“插、删、改”,在某些情况下,一旦该数据页满了,那么页分裂不可避免,而此时nolock的查询正在发生,比如在第100页已经读过的记录,可能会因为页分裂而分到第101页,这有可能使得nolock查询在读101页时重复读到该条数据,产生“重复读”。同理,如果在100页上的数据还没被读到就分到99页去了,那nolock查询有可能会漏过该记录,产生“跳读”。

      上面提到的哥们,在加了nolock后一些操作出现报错,估计有可能因为nolock查询产生了重复读,2条相同的记录去插入别的表,当然会发生主键冲突。

      11、使用like进行模糊查询时应注意

      有的时候会需要进行一些模糊查询比如

    select * from contact where username like ‘%yue%’

      关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%,

      12、数据类型的隐式转换对查询效率的影响

      sql server2000的数据库,我们的程序在提交sql语句的时候,没有使用强类型提交这个字段的值,由sql server 2000自动转换数据类型,会导致传入的参数与主键字段类型不一致,这个时候sql server 2000可能就会使用全表扫描。Sql2005上没有发现这种问题,但是还是应该注意一下。

      13、SQL Server 表连接的三种方式

      (1)Merge Join

      (2)Nested Loop Join

      (3)Hash Join

      SQL Server 2000只有一种join方式——Nested Loop Join,如果A结果集较小,那就默认作为外表,A中每条记录都要去B中扫描一遍,实际扫过的行数相当于A结果集行数x B结果集行数。所以如果两个结果集都很大,那Join的结果很糟糕。

      SQL Server 2005新增了Merge Join,如果A表和B表的连接字段正好是聚集索引所在字段,那么表的顺序已经排好,只要两边拼上去就行了,这种join的开销相当于A表的结果集行数加上B表的结果集行数,一个是加,一个是乘,可见merge join 的效果要比Nested Loop Join好多了。

      如果连接的字段上没有索引,那SQL2000的效率是相当低的,而SQL2005提供了Hash join,相当于临时给A,B表的结果集加上索引,因此SQL2005的效率比SQL2000有很大提高,我认为,这是一个重要的原因。

      总结一下,在表连接时要注意以下几点:

      (1)连接字段尽量选择聚集索引所在的字段

      (2)仔细考虑where条件,尽量减小A、B表的结果集

      (3)如果很多join的连接字段都缺少索引,而你还在用SQL Server 2000,赶紧升级吧。

  • liunx 任务作业

    2010-12-07 13:13:48

     任务调度使用crontab
    1、设置任务
     crontab -e 
    2、每隔一定时间去执行 
      date > /home/mydate1
      1)、希望,每天凌晨2:00去执行 date >>/home/mydate2
       可以在crontab -e 中加入
       0 2 * * * date >> /home/mydate
      2)、希望,每分去执行
        可以在crontab -e 中加入
        * * * * * date >> /home/mydate
    3,怎么去调度多个任务?
     1),可以直接在crontab -e 中添加
     2),可以吧所有的任务,写入到一个可执行文件(shell编程)
       vi mytask.sh  
         date >>/home/mydata3
         cp /home/mydata3 /root/
     3),加x(执行)权限
         chmod 744 mytask.sh
     4),设置任务 
       crontab -e
          * * * * * /root/mytask.sh 
    4、终止任务
        crontab -r  
    5、列出当前有那些调度任务
        crontab -l  
    6、“*” 整数取值范围及意义是
    0~59 表示分 
    1~23 表示小时 
    1~31 表示日 
    1~12 表示月份 
    0~6 表示星期(其中0表示星期日) 
  • Baidu畅想之质量保证三境界

    2010-11-18 10:49:36


    1、Find bugs as much as possible 

    2、Find bugs as early as possible

    3、Bug prevention
  • 修改QC数据密码,用户不能登录QC问题

    2010-11-10 10:52:04

        今天无意中修改了QC数据库密码,本以为没什么问题,结果用户登录不上QC,花了一两个小时也没有搞清楚为什么,最后只好还原初始密码,问题才得以解决,看来还是不能瞎搞,想一下,万一不记得以前的密码,岂不是很麻烦啦...
        报错信息:
    Failed to check authentication of user 'admin';
    [Mercury][Oracle JDBC Driver][Oracle]ORA-01017: 用户名/口令无效; 登录被拒绝
    ;

    Stack Trace:
    java.sql.SQLException: [Mercury][Oracle JDBC Driver][Oracle]ORA-01017: 用户名/口令无效; 登录被拒绝

    at com.mercury.jdbc.base.BaseExceptions.createException(Unknown Source)
    at com.mercury.jdbc.base.BaseExceptions.getException(Unknown Source)
    at com.mercury.jdbc.oracle.OracleImplConnection.connectAndAuthenticate(Unknown Source)
    at com.mercury.jdbc.oracle.OracleImplConnection.open(Unknown Source)
    at com.mercury.jdbc.base.BaseConnection.connect(Unknown Source)
    at com.mercury.jdbc.base.BaseConnection.setupImplConnection(Unknown Source)
    .....

        这两天又发现每个项目的默认密码是:tdtdtd,其实网上已经有很多地方说过了,只是当时不太理解tdtdtd究竟是那个密码,汗了一把


  • Loadrunner 性能测试服务器监控指标

    2010-11-02 10:58:34

       服务器资源监控指标:原文转自:http://blog.csdn.net/zzzmmmkkk/archive/2010/01/21/5221799.aspx

    内存:

    1 UNIX资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。

    2 Windows资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。

    内存资源成为系统性能的瓶颈的征兆:

    很高的换页率(high pageout rate);

    进程进入不活动状态;

    交换区所有磁盘的活动次数可高;

    可高的全局系统CPU利用率;  

    内存不够出错(out of memory errors)

    处理器:

    1 UNIX资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于Server,可接受的最大上限是80-85%  

    合理使用的范围在60%至70%。

    2 Windows资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。

    CPU资源成为系统性能的瓶颈的征兆:  

    很慢的响应时间(slow response time)  

    CPU空闲时间为零(zero percent idle CPU)  

    过高的用户占用CPU时间(high percent user CPU)  

    过高的系统占用CPU时间(high percent system CPU)  

    长时间的有很长的运行进程队列(large run queue size sustained over time)

    磁盘I/O:

    1 UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。

    2 Windows资源监控中,如果 Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。

    I/O资源成为系统性能的瓶颈的征兆 :

    过高的磁盘利用率(high disk utilization)  

    太长的磁盘等待队列(large disk queue length)  

    等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O)  

    太高的物理I/O速率:large physical I/O rate(not sufficient in itself)  

    过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself))  

    太长的运行进程队列,但CPU却空闲(large run queue with idle CPU)

    4.数据库服务器:

    SQL Server数据库:

    1 SQLServer资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。

    2 如果Full Scans/sec(全表扫描/秒)计数器显示的值比1或2高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。  

    3 Number of Deadlocks/sec(死锁的数量/秒):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0。

    4 Lock Requests/sec(锁请求/秒),通过优化查询来减少读取次数,可以减少该计数器的值。

    Oracle数据库:

    1 如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。

    快存(共享SQL区)和数据字典快存的命中率:  

    select(sum(pins-reloads))/sum(pins) from v$librarycache;  

    select(sum(gets-getmisses))/sum(gets) from v$rowcache;  

    自由内存: select * from v$sgastat where name=’free memory’;  

    2 如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。

    缓冲区高速缓存命中率:

    select name,value from v$sysstat where name in (’db block gets’,

    ‘consistent gets’,'physical reads’) ;

    Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))

    3 如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。

    日志缓冲区的申请情况 :

    select name,value from v$sysstat where name = ‘redo log space requests’ ;

    4 如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序 。

    内存排序命中率 :

    select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’

    注:上述SQL Server和Oracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的 技术,进一步的分析可查相关资料。

  • QC相关

    2010-10-29 10:26:15

        前一段时间在liunx搭建了QC10.0版本的,简单试用了一下因其他事情给搁浅了,今天想把LR9.5跟QC连一下,结果发现忘记了很多,这里记一下,以免过一段时间又给忘记了

    1、启动QC,也就是启动jbsoo:
        /opt/HP/QualityCenter/jboss/bin/run.sh start

    2、QC管理员登录:
        http://10.10.90.98:8086/sabin/
        用户名:admin  密码:test(网上流传tdtdtd),试了一下不可以,不知道是不是默认是tdtdtd,修改过就不可以了

    3、QC用户登录:
        http://10.10.90.98:8086/sabin/
        用户名:项目成员姓名  密码:同用户名
    4、简单记录一下安装的一些问题:
    qc unix oralce 安装
    设置权限
    chmod +x linux_setup

    安装
    -W dbValidatorSequence.active=false不检查数据库版本
    ./linux_setup -W dbValidatorSequence.active=false
        

        安装相关的文档放到附件中

  • 最近很难集中精力把一件事情做好.....

    2010-10-23 16:04:13

        最近很难集中精力把一件事情做好,不对,应该是一直以来就没有把某些想做点事情做得很好,当然这些事情专指测试学习:

        近半年来工作不是很忙,就想好好学习一下,期待有个更好的发展。于是选择了几个学习的方向:

        一、liunx:表面上看,从安装---常用命令学习---常用软件安装---常用服务器配置---到公司测试环境的搭建都已成功的做好了,单总感觉停留在基础的层面不能更深入的学习liunx。某君A曾经交流时提起shell比较重要,那是也有点点心动,或者说是学习的想法吧,但跟现实工作一点都没关系,只是简单了解了下就放弃了。最近又把心思放到其他方面,估计近期不会再认真学liunx了。

        二、测试工具:接触过的测试工具有好多,包括QTP,selenium,loadrunner,Jmeter,IBM系列的两个,但真实在测试中用的比较多的只有jmeter,相对而言也对Jmeter熟悉一点,其他工具只是停留在录制回放的阶段。

        三、写代码:自己感觉是对写代码没有天赋,也曾花过一写时间学习过,但效果不是很明显,也可能是没实践吧,希望接下来几个月能把ruby好好学一下,对java有更多的熟悉

        四、今年以来除了日常的测试工作外,多了设计,编写文档等工作,这个也没有做好

        测试工作,虽说是要掌握很多领域的工作,但也要有所专长,很多时候需要的是你的专,而不是杂而不精,知其然而不知其所以然。
  • Loadrunner关联

    2010-10-13 14:33:00

        文章写的很详细,个人认为对初学lr关系有很大的帮助,详细内容请看原博文。


    转自:http://www.51testing.com/?270355
  • Load runner 常见错误之--Web录制常见错误解决方法

    2010-09-16 23:05:09

    录制脚本为空

     

    LR录制是客户端与服务器的数据交互,只有在有交互的时候才可以录制到脚本

     

    1. 交互方式不一样,通过客户端的server进行交互,scrīpt中选择最后一个track processes created as COM local servers  [选择scrīpt里的最后一个选项]

     

    2. 非客户端与服务器的交互的一种操作,在页面上点前进或后退,如果页面是从缓存中取出来的,那么也就没有和服务器数据交互,所以也录制的为空脚本.   [windows注册表中禁用缓存]

     

    3. 协议选择错误,b/s不一定走http协议,还可能是https(http+ssl).   [最基础的错误]

     

    录制出错

     

    1.  选择internet里选项里的连接里的局域网设置的代理不能选,因为LR在录制的时候会动态选择

     

    2.  网页里的恶意代码,检测的时候响应LR录制脚本[用工具检测恶意代码,然后卸载恶意代码,eg:Ad_Aweare]

     

    3. 防病毒软件和防火墙,在录制时暂时关闭

     

    4. 因为LR自身原因报错或者有些脚本不能录制下来[录制是最好选用scrīpt view,此时会报错,但能写下脚本,是因为LR无法解析,可以手工修改,tree view 就直接停止了

     

    Loadrunner不支持默认的浏览器

     

    有时候,我们上网的时候,不小心会将某个浏览器设置为默认的浏览器,而我们不知道,这个时候,我们用loadrunner进行录制的时候,会提示loadrunner不支持系统设置的默认的浏览器,因此,需要我们重新选择浏览器,我们可以利用Reconding optiom中的Browser选项设置支持的浏览器,我们还可以利用下面的方法,将IE设置为默认的浏览器,因为loadrunner是支持IE的。设置方法如下:

     

    IE“工具(T)”菜单→“Interner选项”→“程序选项卡里,确保检查Internet Explorer是否为默认的浏览器选项打上。然后在你启动IE时,如果IE非默认浏览器就会出现提示窗是否把IE设置为默认。

  • 描述性统计与性能结果分析

    2010-09-14 19:20:25

    LoadRunner中的90%响应时间是什么意思?这个值在进行性能分析时有什么作用?本文争取用最简洁的文字来解答这个问题,并引申出“描述性统计”方法在性能测试结果分析中的应用。

     

    为什么要有90%用户响应时间?因为在评估一次测试的结果时,仅仅有平均事务响应时间是不够的。为什么这么说?你可以试着想想,是否平均事务响应时间满足了性能需求就表示系统的性能已经满足了绝大多数用户的要求?

    假如有两组测试结果,响应时间分别是 {1351016} {56789},它们的平均值都是7,你认为哪次测试的结果更理想?

    假如有一次测试,总共有100个请求被响应,其中最小响应时间为0.02秒,最大响应时间为110秒,平均事务响应时间为4.7秒,你会不会想到最小和最大响应时间如此大的偏差是否会导致平均值本身并不可信?

    为了解答上面的疑问,我们先来看一张表:

    在上面这个表中包含了几个不同的列,其含义如下:

    CmdID   测试时被请求的页面

    NUM      响应成功的请求数量

    MEAN    所有成功的请求的响应时间的平均值

    STD DEV      标准差(这个值的作用将在下一篇文章中重点介绍)

    MIN              响应时间的最小值

    50 th(60/70/80/90/95 th)          如果把响应时间从小到大顺序排序,那么50%的请求的响应时间在这个范围之内。后面的60/70/80/90/95 th 也是同样的含义

    MAX      响应时间的最大值

    我想看完了上面的这个表和各列的解释,不用多说大家也可以明白我的意思了。我把结论性的东西整理一下:

    1.      90%用户响应时间在 LoadRunner中是可以设置的,你可以改为80%或95%;

    2.      对于这个表,LoadRunner中是没有直接提供的,你可以把LR中的原始数据导出到Excel中,并使用Excel中的PERCENTILE 函数很简单的算出不同百分比用户请求的响应时间分布情况;

    3.      从上面的表中来看,对于Home Page来说,平均事务响应时间(MEAN)只同70%用户响应时间相一致。也就是说假如我们确定Home Page的响应时间应该在5秒内,那么从平均事务响应时间来看是满足的,但是实际上有10-20%的用户请求的响应时间是大于这个值的;对于Page 1也是一样,假如我们确定对于Page 1 的请求应该在3秒内得到响应,虽然平均事务响应时间是满足要求的,但是实际上有20-30%的用户请求的响应时间是超过了我们的要求的;

    4.      你可以在95 th之后继续添加96/ 97/ 98/ 99/ 99.9/ 99.99 th,并利用Excel的图表功能画一条曲线,来更加清晰表现出系统响应时间的分布情况。这时候你也许会发现,那个最大值的出现几率只不过是千分之一甚至万分之一,而且99%的用户请求的响应时间都是在性能需求所定义的范围之内的;

    5.      如果你想使用这种方法来评估系统的性能,一个推荐的做法是尽可能让你的测试场景运行的时间长一些,因为当你获得的测试数据越多,这个响应时间的分布曲线就越接近真实情况;

    6.      在确定性能需求时,你可以用平均事务响应时间来衡量系统的性能,也可以用90%或95%用户响应时间来作为度量标准,它们并不冲突。实际上,在定义某些系统的性能需求时,一定范围内的请求失败也是可以被接受的;

    7.      上面提到的这些内容其实是与工具无关的,只要你可以得到原始的响应时间记录,无论是使用LoadRunner还是JMeter或者OpenSTA,你都可以用这些方法和思路来评估你的系统的性能。

     

    事实上,在性能测试领域中还有更多的东西是目前的商业测试工具或者开源测试工具都没有专门讲述的——换句话说,性能测试仅仅有工具是不够的。我们还需要更多其他领域的知识,例如数学和统计学,来帮助我们更好的分析性能数据,找到隐藏在那些数据之下的真相。

  • LoadRunner常见问题【ZT】

    2010-09-08 08:57:48

    原博文转自:


    lr_tree_response中文乱码问题
    1、解决方法:
    http://bbs.51testing.com/viewthread.php?tid=144567&pid=1218174&page=1&extra=page%3D9#pid1218174

    2、函数转换:
    lr_convert_string_encoding(lr_eval_string("{ReplyContents}"),LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"ReplyMessage");
  • RHEL5 (x64)下安装oracle11G

    2010-09-01 16:50:27

       闲来无事,在RHEL5 (x64)下安装oracle11G玩玩,下面附件具体的操作:


  • Jmeter 问题汇总

    2010-09-01 09:30:01

        这篇文章记录一下平日用Jmeter碰到的问题和解决方法:

    1,中文乱码问题
    现象:使用badboy录制脚本后发现中文都变成乱码了,报错在数据库中的也是乱码
    解决:去掉请求发送值编码已打的“勾”

    2,401错误
    现象:脚本运行后发现除登录请求执行成功,其他请求都包401错误
    解决:添加http Cookie管理器
  • 测试中用到的几个复制表的sql语句

    2010-08-21 16:39:30

        1、只复制表结构的sql

      create table b as select * from a where 1<>1

      2、即复制表结构又复制表中数据的sql

      create table b as select * from a

      3、复制表的指定字段的sql

      create table b as select row_id,name,age from a where 1<>1//前提是row_id,name,age都是a表的列

      4、复制表的指定字段及这些指定字段的数据的sql

      create table b as select row_id,name,age from a

      以上语句虽然能够很容易的根据a表结构复制创建b表,但是a表的索引等却复制不了,需要在b中手动建立。

      5、insert into 会将查询结果保存到已经存在的表中

      insert into t2(column1, column2, ....) select column1, column2, .... from t1

  • samba安装成功了

    2010-08-04 16:22:35

        成功完成samba的安装,记录一下关键的步骤:
    1,安装
    tar -xvf samba-3.4.4.tar.gz
    cd 
    samba-3.4.4/source3
    ./configure --prefix=/usr/local/samba
    make 
    make install

    2,确认是否安装成功

    ----若出现以下表示安装成功
    ==============================================================
    MO files for pam_winbind are installed.
    ==============================================================
    ==============================================================
    All MO files for 
    Samba are installed. You can use "make uninstall"
    or "make uninstallmo" to remove them.
    ==============================================================

    make installbin----若出现以下表示安装成功
    ======================================================================
    The binaries are installed. You may restore the old binaries (if there
    were any) using the command "make revert". You may uninstall the binaries
    using the command "make uninstallbin" or "make uninstall" to uninstall
    binaries, man pages and shell scripts.
    ================================================================

    3,复制文件

    cp samba-3.3.4/packaging/RHEL/setup/smb.conf /usr/local/samba/lib/smb.conf


    4,启动关闭

    启动和关闭samba
    (1)、 启动(其中&表示在后台运行)
    /usr/local/
    samba/sbin/smbd  start  &   
    /usr/local/
    samba/sbin/nmbd  start  &

    (2)、关闭
    ps -auxf |grep 
    samba  查找samba 的进程
    效果如下:
    [root@localhost ~]# ps -auxf |grep 
    samba 
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
    root     32355  0.0  0.3   4636   644 pts/2    R+   17:44   0:00          \_ grep 
    samba
    root     32233  0.0  1.2  13420  2536 ?        Ss   17:27   0:00 /usr/local/
    samba/sbin/smbd start   //这条是主进程
    root     32234  0.0  0.4  13420  1012 ?        S    17:27   0:00  \_ /usr/local/
    samba/sbin/smbd start
    root     32335  0.0  0.6  11268  1300 ?        Ss   17:41   0:00 /usr/local/
    samba/sbin/winbindd
    root     32336  0.0  0.4  11268  1052 ?        S    17:41   0:00  \_ /usr/local/
    samba/sbin/winbindd
    杀掉: kill -9  32233  就可以杀掉了。这个比较麻烦,当然还有其他方法

    5,报错

    /usr/local/samba/sbin/smbd: error while loading shared libraries: libtalloc.so.1: cannot open shared object file: No such file or directory
    解决办法:
    ln -s /usr/local/
    samba/lib/libtalloc.so.1  /usr/lib/libtalloc.so.1
    ln -s /usr/local/
    samba/lib/libtdb.so.1  /usr/lib/libtdb.so.1
    ln -s /usr/local/
    samba/lib/libwbclient.so.0  /usr/lib/libwbclient.so.0

    6,配置

    详细说明:vi  /usr/local/samba/lib/smb.conf
    [global] 全局配置
        workgroup = MYHOME     ---- 指定工作组
        server string = File Server ---- 服务器的说明 
        security = share   ----安全级别: 共分3种 
                        1.share (任何用户都不需要密码,直接可以访问)
                        2.user   要提供用户名和密码才能访问
                        3.server 将用户和密码提交到另一服务器验证,如果递交失败,就 退到user安全级。 要求网络上存在一台Windows的主域控制器,
    samba把用户名和密码递交给它去验证。
    ****************匿名用户
    匿名用户,只要把security = share 修改成这样。就可以访问了。


    ----------------
    window ===打开网上邻居=====\\ip地址(比如我的: 
    \\192.168.1.131) 如果可以访问,说明配置成功。
    -------------------

    ********************增加用户,验证用户。
    [
    常用参数:
        comment :         目录说明 
        path :             目录路径
        public             开放共享 默认为no , 如果=yes 表示无需身份验证
        browseable:        显示共享名称。
        valid users:       允许列表中的用户访问
        read only:         默认为yes,共享目录只读 。
        write able:        write able =no 与read only = yes 一样的效果
        wire list:        如果前面只读,只有在此里面的用户才有写的权利
        creat mask:       指定在共享目录里面建立文件的权限, 权限最高只能为 766
        directory mask:   指定建立目录的权限
        force user:       指定存取的用户张号
        force group:     指定用户存取组
    ]
    (1)、   增加用户:  useradd  sambashare(用户名)
    (2)、    smbpasswd  -a  sambashare(用户名)  键入回车,提示你输入密码 [必须进入: cd /usr/local/
    samba/bin/中]

    (3)、----------配置如下:(放在配置文件最下面)
    [sambashare]  
     comment = sambashare directory
     path = /home/sambashare
     public = no
     write list = sambashare
     valid users = @sambashare
    注释:
    (1)、如果其他用户想查看sambashare用户下的文件,只需要把valid users = @sambashare,@用户名就可以了。
    (2)、建立一个文件共享目录, 要求全部人可查看, 但每个人只能删除自己的文件, 不能删除别人。
    [public]
                comment = Public Stuff
                path = /home/forevergao/
                public = yes
                browseable = yes
                writeable = yes


    (4)、 设定public的权限, 因为
    samba不能做到每个人只能删除自己的文件, 不能删除别人的功能,linux设置目录Sticky bit权限. 目录设定了Sticky的权限,在这个目录下的文件只有root与文件的所有者才能删除, 别的用户可能通过设置,才能查看此用户目录下所有文件,但不能删除,只有本用户才能删除。

    *最后别忘了分配权限和新建目录

    mkdir /home/share/chenjian

    chmod  777  /home/sambashare



  • LoadRunner9.5破解【成功破解】

    2010-07-12 11:16:01


    1、用LR8.0中的mlr5lprg.dll、lm70.dll覆盖LR9.1(9.5)安装目录下“bin”文件夹中的对应文件; 



    2、手动修改注册表,删除下面内容 

    [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2] 



    3、添加下面的licence,即可使用。 
    golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI 
    web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB 


    如果注册时出现  License security violation. Operation is not allowed 

    在注册表中删除下面的就可以了 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{87B3ADD4-21EB-11d5-93EF-00105AA0FD2D}] 
  • 测试用例模板与规范

    2010-07-08 11:49:39

        写了一份测试用例模板与使用规范

  • ORACLE 物化视图 之验证

    2010-07-01 16:59:19


        针对开发同事引入的物化视图的概念做了一个简单的了解和实验:

    引文出自:http://icbbs.supcon.com/viewthread.php?tid=1181

    物化视图中上面的引文中已做了简介,下面说一下它的优缺点和验证的结果:

    优点:

     1,物化视图的最大的优势是可以提高性能:Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。

     2, 物化视图有很多方面和索引很相似

     3通过预先计算好答案存储起来,可以大大地减少机器的负载

       A,更少的物理读--扫描更少的数据

       B,更少的写--不用经常排序和聚集

       C。减少CPU的消耗--不用对数据进行聚集计算和函数调用

       D,显著地加快响应时间--在使用物化视图查询数据时(与主表相反),将会很快的返回查询结果

    缺点:

      1物化视图用于只读或者“精读”环境下工作最好 ,不用于联机事务处理系统(OLTP)环境, 在事实表等更新时会导致物化视图行锁,从而影响系统并发性。

       2物化视图有出现无法快速刷新,导致查询数据不准确的现象 

      3,Rowid物化视图(创建的物化视图通常情况下主键,rowid,和子查询视图只有一个单一的主表,不能包括下面任何一项:

        A,Distinct 或者聚合函数.

        B,Group by,子查询,连接和SET操作

      4,物化视图会增加对磁盘资源的需求,即需要永久分配的硬盘空间给物化视图来存储数据

      5,物化视图的工作原理受一些可能的约束,比如主键,外键等等

    实验:(一)

    1,创建物化视图:

      /* Formatted on 2010-7-1 10:46:08 (QP5 v5.115.810.9015) */

    CREATE MATERIALIZED VIEW Contract REFRESH FORCE ON DEMAND AS SELECT "Contract_ID","Contract_ProjectID","Contract_TableID","Contract_NO" FROM "Comm_Contract" WHERE "Contract_TableID"

    IN(SELECT "AppTab_ID" FROM "Base_AppTableInfo" WHERE "AppTab_TableCode"='SaleContractP_Base' )

    2,查询

     从基表中查询:

    SELECT    "Contract_ID"

                        FROM   "Comm_Contract"

                       WHERE   "Contract_NO" LIKE '%2009011%'

      A,单用户查询响应时间:206ms  

      B,50并发查询响应时间:1670ms               

       从物化视图查询:                

     select "Contract_ID" 

                        from "Contract"  

                       where "Contract_NO" like '%2009011%'  

      A,单用户查询响应时间:23ms  

      B,50并发查询响应时间:48ms  

    实验:(二)

    生产任务单参照生产订单按合同编号查询系统响应时间---是否用物化视图的区别

    操作步骤:

    1,修改资源文件:
    [Unit]

          Name = Sale.Contract1

          [Master]

             [Table]

                Name = Contract

                [Field]

                   ID = Contract_ID,Integer

                   ProjectID = Contract_ProjectID,Integer

                   TableID = Contract_TableID,Integer

                   NO = Contract_NO,Text               

                [/Field]

             [/Table]

          [/Master]

       [/Unit]

    2,修改.ets  .xsl 文件

    .xsl:QuickCondition += ' AND _field_(Order_ContractID) in _subquery_(Sale.Contract1【Sale.Contract】,ID,_FIELD_(NO) LIKE  _Value_($^QuickContract_NO,@NO))';

    .ets:<et:class Var="ContractList" Class="Sale.Contract1Sale.Contract" Condition="_FIELD_(ID)=_VALUE_($.Order_ContractID,@ID)" OutputPageInfo="no" OutputField="ID,NO,Customer_ShortName"/>

    3,分别用步骤2的两种情况查询

      生产任务单参照生产订单:按销售合同条件查询:查询输入“2009011” ,结果页面响应时间: 

     A,不用物化视图<!--Execute the main script casted 2ms-->

     B,用物化视图<!--Execute the main script casted 1ms-->

  • 处理并发---索引的优点(实验贴)

    2010-06-30 14:52:59


    1,测试验证用到的简单的sql语句:
    /* Formatted on 2010-6-29 11:56:58 (QP5 v5.115.810.9015) */
    SELECT   *
      FROM   (SELECT   row_.*, ROWNUM rownum_
                FROM   (SELECT   "order_date"
                          FROM   "test"
                         WHERE   "order_no" =
                                    TRUNC (DBMS_RANDOM.VALUE (24, 50024))) row_
               WHERE   ROWNUM <= 20)
    WHERE   rownum_ > 0

    2,数据准备说明
    a,本次对一个有5个字段的表test进行基本测试,验证两种情况:一,字段order_no有索引;二,字段order_no无所有,有无索引时做相同的测试验证
       b,相应时间单位:ms
       c,测试验证分同时并发和分钟并发两种情况验证
       d,表中有50000条数据
    3,测试得到的数据

    同时并发
    10并发 50并发 80并发 100并发
    无索引 756 2109 3053 3723
    有索引 357 385 413 430


    分钟并发
    200并发 500并发 1000并发 1500并发
    无索引 255 260 10702 33163
    有索引 4 3 1 4


    4,结论总结
    1,500以下的并发,有无索引,用户不会有太明显的感觉,因为他们的执行时间都不会大于0.3s
    2,以“较高(500~3000)”并发频率对50000数据的表进行简单的查询,此时有无索引就会有明显的差别,可以达到5s以上
    3,以“极高(>3000)”并发频率对50000数据的表进行简单的查询,此时相应时间就会很慢,很慢

        结合实际应用考虑,一些简单的表(字段不太多,结果不复杂),在单个用户反复执行sql语句时,有无索引对用户来说可能体验不到响应时间上的差异,而对于多用户并发对这个表做操作时,有无索引的差异就会很明显:在“较低”频率并发情况下,由于表比较简单,响应时间很小,看不出大的差异,当并发频率“较高”,如大于500时,这种差异就会很明显,如上面1500的并发,响应时间相差3s,依此类推,如果表字段很多,嵌套结构复杂,有无索引并发执行的差异将会很大。


  • oracle索引插入数据性能 + 数据量大小查询效率

    2010-06-24 09:29:26

    1,建表

    CREATE TABLE "test"

    (

      "id"             INTEGER                   NOT NULL,

      "order_no"       NUMBER(10),

      "order_date"     DATE,

      "ordership"      VARCHAR2(500 BYTE),

      "order_comment"  VARCHAR2(100 BYTE)

    )

    2,插入数据脚本

    declare

     BEGIN

       for i in 1 .. X

        loop

        --syexecute immediate

    insert into "test" values(i,24+i,sysdate(),'ship' || i,'coment' || i);

       end loop;

       commit;

    END; 

    3,有无索引对比

    50000

    500000

    100000

    无索引

    2s

    20s

    40s

    主键索引

    2s

    25s

    50s

    全部索引

    5s

    96s

    215s

    4,查询数据:

    001sql

    002sql

    003sql

    004sql

    005sql

    006sql

    007sql

    10000

    16ms

    16ms

    16ms

    16ms

    16ms

    16ms

    待补充

    1000000

    18ms

    204ms

    266ms

    31ms

    141ms

    109ms

    待补充

    说明:

    1),10000 ---表中10000条数据 ;1000000----表中1000000条数据;

    2),001sql--select "order_date" from "test"

    3),002sql--select "order_date" from "test" group by "order_date";

    4),003sql--select "order_date" from "test"  order by DESC;

    5),004sql--select max("id") from "test";

    6),004sql--select sum("order_no") from "test";

    7),004sql--select "order_date" from "test" where {加区间}group by "order_date" 

    5,结论:

    1),表中索引越多,插入数据效率越差

    2),表查询默认是顺序排序的,查询倒序排序比顺序效率差

    3),...

963/5<12345>
Open Toolbar