Tom大师的调优脚本-- Runstats 的使用方法

Oracle 9i&10g编程艺术 性能测试 <br /><br />      汗,写上篇笔记已经是去年的事情了。时间过得真快啊,在这里已经工作了一年多了,感觉自己什么都没学到似的,或者说没有钻研过。从一开始用C,后来体验了 下Linux,学了点内核和Shell的皮毛,正打算将以后的方向定在unix平台/c语言开发的时候,猛然发现,在目前的岗位上,根本得不到什么应用。 遂弃之。如今选择了PL/SQL,就要精通业务逻辑,刚开始的这段时间尤其痛苦,这存储过程里的业务逻辑并不是那么容易看出的。加油吧。<br />      人生啊,虚度年华,荒废光阴 阅读详情

TOM大师的Runstats包是一个很好的基准测试工具包。根据自己的理解,讲讲它的使用方法。

一 授权
由于Runstats包调用了几个系统视图,需要对这些视图进行授权,这些视图包括v_$timer、v_$mystat、v_$statname和v_$latch。以用户terry为例。

    grant select on sys.v_$timer to terry;
    grant select on v_$mystat to terry;
    grant select on sys.v_$statname to terry;
    grant select on sys.v_$latch to terry;

二 安装Runstats包
1 创建stats视图
    create or replace view stats
    as
    select 'STAT..' || a.name name, b.value
      from v$statname a, v$mystat b
     where a.statistic# = b.statistic#
     union all
    select 'LATCH.' || name, gets
      from v$latch;

2 创建run_stats临时表
    create global temporary table run_stats
    ( runid   varchar2(15),
      name    varchar2(80),
      value   int
    )on commit preserve rows;

3 创建Runstats包头
    create or replace package runstats
    as
        procedure rs_start;
        procedure rs_middle;
        procedure rs_stop( p_difference_threshold in number default 0);
    end;

4 创建Runstats包体
create or replace package body runstats
as
g_start number;
g_run1 number;
g_run2 number;

procedure rs_start
is
begin
    delete from run_stats;

    insert into run_stats
    select 'before', stats.* from stats;

    g_start := dbms_utility.get_time;
end;

procedure rs_middle
is
begin
    g_run1 := (dbms_utility.get_time-g_start);

    insert into run_stats
    select 'after 1', stats.* from stats;
    g_start := dbms_utility.get_time;

end;

procedure rs_stop(p_difference_threshold in number default 0)
is
begin
    g_run2 := (dbms_utility.get_time-g_start);
    --add a line here to avoid ora-20000
    dbms_output.enable(480000);
    dbms_output.put_line
    ( 'Run1 ran in ' || g_run1 || ' hsecs' );
    dbms_output.put_line
    ( 'Run2 ran in ' || g_run2 || ' hsecs' );
    dbms_output.put_line
    ( 'run 1 ran in ' || round(g_run1/g_run2*100,2) ||
      '% of the time' );
    dbms_output.put_line( chr(9) );

    insert into run_stats
    select 'after 2', stats.* from stats;

    dbms_output.put_line
    ( rpad( 'Name', 30 ) || lpad( 'Run1', 12 ) ||
      lpad( 'Run2', 12 ) || lpad( 'Diff', 12 ) );

    for x in
    ( select rpad( a.name, 30 ) ||
             to_char( b.value-a.value, '999,999,999' ) ||
             to_char( c.value-b.value, '999,999,999' ) ||
             to_char( ( (c.value-b.value)-(b.value-a.value)), '999,999,999' ) data
        from run_stats a, run_stats b, run_stats c
       where a.name = b.name
         and b.name = c.name
         and a.runid = 'before'
         and b.runid = 'after 1'
         and c.runid = 'after 2'
         -- and (c.value-a.value) > 0
         and abs( (c.value-b.value) - (b.value-a.value) )
               > p_difference_threshold
       order by abs( (c.value-b.value)-(b.value-a.value))
    ) loop
        dbms_output.put_line( x.data );
    end loop;

    dbms_output.put_line( chr(9) );
    dbms_output.put_line
    ( 'Run1 latches total versus runs -- difference and pct' );
    dbms_output.put_line
    ( lpad( 'Run1', 12 ) || lpad( 'Run2', 12 ) ||
      lpad( 'Diff', 12 ) || lpad( 'Pct', 10 ) );

    for x in
    ( select to_char( run1, '999,999,999' ) ||
             to_char( run2, '999,999,999' ) ||
             to_char( diff, '999,999,999' ) ||
             to_char( round( run1/run2*100,2 ), '99,999.99' ) || '%' data
        from ( select sum(b.value-a.value) run1, sum(c.value-b.value) run2,
                      sum( (c.value-b.value)-(b.value-a.value)) diff
                 from run_stats a, run_stats b, run_stats c
                where a.name = b.name
                  and b.name = c.name
                  and a.runid = 'before'
                  and b.runid = 'after 1'
                  and c.runid = 'after 2'
                  and a.name like 'LATCH%'
                )
    ) loop
        dbms_output.put_line( x.data );
    end loop;
end;
end;

至此,Runstats包安装完毕。


三、使用Runstats包进行简单测试。
1 建立一个简单测试表
    SQL> create table t1(x int);
    表已创建。

2 编写测试代码

CREATE TABLE R1 AS SELECT * FROM SCOTT.LARGE_TABLE WHERE 1=2;
CREATE TABLE R2 AS SELECT * FROM SCOTT.LARGE_TABLE WHERE 1=2;


exec runstats_pkg.rs_start;

INSERT INTO R1 SELECT * FROM SCOTT.LARGE_TABLE;

COMMIT;

exec runstats_pkg.rs_middle;

SQL> begin
2     for i in (select * from scott.large_table) loop
3       insert into r2 values i;
4     end loop;
5     commit;
6   end;
7 /

PL/SQL procedure successfully completed

SQL> SET SERVEROUTPUT ON
SQL> exec runstats_pkg.rs_stop(100000000);

Run1 ran in 4076 hsecs
Run2 ran in 30109 hsecs
run 1 ran in 13.54% of the time

Name                                  Run1        Run2        Diff
STAT...redo size                49,960,116 286,817,232 236,857,116

Run1 latches total versus runs -- difference and pct
        Run1        Run2        Diff       Pct
     313,113   6,573,705   6,260,592      4.76%

PL/SQL procedure successfully completed

SQL> exec runstats_pkg.rs_stop(10000000);

Run1 ran in 4076 hsecs
Run2 ran in 30910 hsecs
run 1 ran in 13.19% of the time

Name                                  Run1        Run2        Diff
STAT...undo change vector size   2,762,836 68,013,056 65,250,220
STAT...undo change vector size   2,762,836 68,015,612 65,252,776
STAT...redo size                49,960,116 286,817,232 236,857,116
STAT...redo size                49,960,116 286,820,756 236,860,640

Run1 latches total versus runs -- difference and pct
        Run1        Run2        Diff       Pct
     626,226 13,149,218 12,522,992      4.76%

PL/SQL procedure successfully completed

TOM大师脚本 ASKtom大师最屌的oracle数据库脚本,值得下载学习,可以查看数据库的各个状态 立即下载

相关推荐

runstats.sql

tom的runstats脚本,在oracle 11g测试没有问题,可以正常实现。

DB2中的runstats

1.runstats的语法: runstats on table [模式名].[表名] with distribution and detailed indexes all 注意:你可以在所有列上,或者仅仅在某些列或列组(除了LONG和LOB列)上执行RUNSTATS。如果没有指定特定列的子句,系统则会使用默认的ON ALL COLUMNS子句。     使用RUNSTATS WITH DI...

水墨江南 3634

Tom大师著作(9i-10g-11g第二版)

NULL 博文链接:https://sunruing.iteye.com/blog/1941121

db2调用runstats及reorg的几种方法

1、直接在后台命令窗口中调用:(1)直接输入db2,调用DB2 CLP进入DB2模式中,输入 runstats on table tablename即可,reorg on table  tablename。(2)或者直接输入 db2 -v “runstats on table tablename”                            db2 -v “reorg on table ...

drbing的博客 1万+

本地AI代码助手:智能解析大型代码库,实现自动化重构与理解

在软件开发中,大型代码库的理解与维护是常见挑战。传统方法依赖人工阅读和有限上下文工具,效率低下。通过结合检索增强生成(RAG)和多智能体(Multi-Agent)架构,现代AI工具能够智能解析代码结构,理解模块关系,并精准定位相关代码片段。这种技术不仅能提升代码探索效率,还能自动化执行重构、文档生成等任务,在遗留系统维护、快速上手新项目等场景中发挥关键作用。本文以blackboxaicode/cli为例,展示了如何利用其代码感知和Workflow Automation能力,高效处理复杂代码库。

weixin_30240349的博客 365

ComfyUI中一个超好用的变量管理类节点-KJNodes

在AI绘图中,ComfyUI的热度开始慢慢起来一些,但是这个软件在使用的过程中,需要很多连线,仅仅一个最简单的动画生成,就需要连接这么多线条,而且有些线会飞的很远,看起来就很不美观,尤其是一些复杂工作流,连接到最后自己可能已经分不太清楚到底连接好了没有。今天在研究C站的大佬们的工作流的时候,发现一个有意思的工作流,看起来大概是这种感觉:干净整洁。他用到了KJNodes这么个节点来管理变量,git上星标也不算很多,所以我想很多朋友可能还不知道,所以这里简单介绍下用法。

聚梦小课堂 7520

DB2数据库中Runstats、Export、Import、Load、Reorg和Comment的用法

目录 前言 1、Runstats的用法 1.1 什么是Runstats? 1.2 用法 1.3 存在的问题 1.4 使用情况 1.5 运行策略 2、数据移动Export、Import和Load的用法 2.1 数据移动的手段 2.2 导入导出文件类型 2.3Export、Import和Load的用法 3、Reorg的用法 3.1 什么是Reorg? 3.2 语法 3.3 示例 4、Comment的用法 前言 在进行数据库投产的时候,会经常遇到这几个指令,对于他们的用法,在.

cug-jdc的博客 5168

android10 部分机型(华为)无法正常更新安装app

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file://storage/emulated/0/文件夹名/***.apk typ=application/vnd.android.package-archive }

森森先生的博客 3927

[DB2] 常用命令4(待续)

--=====Rrunstates工具:通过更新目录来确定最佳访问路径。通常在数据导入,删除,重建索引时运行。=====runstats on table [模式名.]表名                     --所有列 runstats on table [模式名.]表名 on columns(列名)     --某些列runstats on table [模式名.]表名 and index

小旭的技术博客 891

STM32鱼塘水质监测系统设计与实现

物联网技术在农业领域的应用正逐步深入,其中传感器网络作为关键基础设施,通过实时数据采集与传输实现环境监测。基于STM32微控制器的嵌入式系统因其高性能和低功耗特性,成为物联网终端设备的理想选择。该系统通过DS18B20水温传感器、PH传感器和浊度传感器组成的多参数检测网络,配合4G通信模块实现水质数据的远程监控。在农业物联网场景中,这种解决方案不仅大幅降低了传统人工检测的成本,更能通过实时预警有效预防养殖损失。本文介绍的鱼塘水质监测系统正是这一技术的典型应用,展示了如何通过STM32和常见传感器构建高性价比

weixin_42173218的博客 620

Linux安装MinIO(图文解说详细版)

最近开个新坑,就是在linux环境中操作开发环境,带大家玩转Linux,会整理出一篇Linux的专栏,欢迎大家订阅!! 富贵同学linux环境为CentOS7.8 版本。 上期跟大家说了一下OpenJDK的安装,这次说一下minio的安装 第一步,进入/opt 目录,创建minio文件夹 cd /opt mkdir minio 第二步,wget下载安装包: wget https://dl.minio.io/server/minio/release/linux-amd64/minio 第三步,进入m

编码人生 5万+

DB2的RUNSTATS脚本写法(用于服务器中的定时任务)

从DB2客户端导出的运行统计sql是:RUNSTATS ON TABLE DB2INST1.TABLENAME ON ALL COLUMNS ALLOW WRITE ACCESS; 在服务器中运行时报错。 后来改为: CONNECT TO TESTDB RUNSTATS ON TABLE DB2INST1.TABLENAME WITH DISTRIBUTION AND DETAILE...

rhino的持久战 807

【电源专题】Type-C母座外壳直接接主板GND还是接RC呢?别再纠结了!

Type-C屏蔽壳接地这件事,没有唯一标准答案。符合规范、贴合产品、能过认证,就是最优解。希望这篇文章能帮你理清思路。

一点硬件 600

tom的runstats性能比较工具 测试实验

tom的runstats性能比较工具 测试实验 runStats是Tom大师写的一个脚本,用于比较两个语句的时间,统计数据和栓锁使用情况。 下面使用绑定变量和不使用绑定变量查询做对...

cuimiwan3140的博客 323

铁路场景雷达点云目标识别与追踪系统

本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。

huanghm88的专栏 125

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 937

tom的runstats_pkg工具包关于批量插入和绑定变量分析-02

tom大师利用上述runstats_pkg工具包可以测试两种方法所使用的时间差 统计信息和latch等。例如批量插入和逐条插入数据到table中,我们更自然的想象的是批量插入性能优于逐条插入,利用runstats_pkg更可以从...

197

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mysql有runstat吗_(tom大师的)定制脚本runstat和mystat和show_space

Runstat需要访问的几个视图:stats视图create or replace view statsas select 'STAT...' || a.name name, b.valuefrom v$statname a, v$mystat bwhere a.statistic# = b.statistic#union allselect 'LATCH.' || name, getsfrom ...

weixin_33503373的博客 418

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

性能比较工具runStats_pkg

runStats_pkg是Tom大师写的一个脚本, 用于比较两个语句的时间,统计数据和栓锁使用情况。 脚本下载链接: https://asktom.oracle.com/pls/asktom/ASKTOM.download...

coolmsn8786的博客 230

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Oracle 9i&10g编程艺术 学习笔记02

Oracle 9i&10g编程艺术 学习笔记02 汗,写上篇笔记已经是去年的事情了。时间过得真快啊,在这里已经工作了一年多了,感觉自己什么都没学到似的,或者说没有钻研过。从一开始用C,后来体验了下Linux,学了点内核和Shell的皮毛,正打算将以后的方向定在unix平台/c语言开发的时候,猛然发现,在目前的岗位上,根本得不...

weixin_34097242的博客 127

让db2系统定时runstats、reorg

让db2系统定时runstats、reorgQ:定期runstats、reorgA:在db2 v8.2以上可以使用 CALL SYSPROC.ADMIN_CMD来实现,这里主要讲在v8.2以前的版本中利用shell或者批处理来实...

cuishuobi4947的博客 1056

runstats命令参数

1.runstats的语法: runstats on table [模式名].[表名] with distribution and detailed indexes all 注意:你可以在所有列上,或者仅仅在某些列或列组(除了LONG和LOB列)上执行RUNSTATS。如果没有指定特定列的子句,系统则会使用默认的ON ALL COLUMNS子句。 使用RUNSTATS WITH DISTRIBUTION 当您已确定表中包含不是统一分布的数据时,可以运行包含WITH DISTRIBUTION子句的RUNSTA

qq_41761053的博客 1959

DB2 使用REORG命令重组优化表和索引

DB2 使用REORG命令重组优化表和索引 小祥V52016-11-11 16:38:4313940收藏1 分类专栏:数据库 名词解释: reorgchk,检查table index 是否需要重组。 reorg 重组,重新放置数据位置。 runstats 统计信息,可以优化查询器 一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常、安全、高效运行,防止一些错误重复发生。 由于DB2使用CBO作为数据库的优化器...

qyq88888的专栏 3671

DB2运维:RUNSTATS工具

runstats工具可用来获取所处理表的统计信息,以及使用DISTRIBUTION参数来获取所处理表以及索引的数据分布(频率采样、百分比采样),使得系统在执行查询的时候,优化器根据runstats获取的信息,判定各访问途径(比如说三个表需要关联时,不同的先后关联顺序代表了不同的访问途径)需要消耗的资源,选择一个消耗资源最少的途径来进行查询。 runstats只能在单表上运行,其获取的统计信息包括: 表和索引的基本统计信息 Where 和 order by语句中常用列的统计信息 数据偏斜列的频率值统计信息

guanhuazhan的博客 3311

mysql reorg 命令_DB2 runstats、reorgchk、reorg 命令

runstats、reorgchk、reorg 1、runstats runsats可以搜集表的信息,也可以搜集索引信息。作为runstats本身没有优化的功能,但是它更新了统计信息以后,可以让DB2优化器使用最新的统计信息来进行优化,这样优化的效果更好。 runstats on table tbschema.tbnamrunstats、reorgchk、reorg1、runstatsrunsat...

weixin_39991935的博客 590

oracle经典书籍推荐

很多网友询问如何选择入门书籍,学Oracle有什么好书,这里给出一些常见书籍的介      绍。首先声明,本文只涉及国外作品,因为国内的作品好的极少,大多是拼凑之作。 提到入门学习,我又得搬Tom(Thomas Kyte)出来了。他在Ask Tom和他最新的书里都介绍 了他认为比较好的学习途径和阅读资料。他推荐的资料都是Oracle的官方文档,有个网友 在版上也提出是不是通

iphone开发收集盒子 1519
上一篇: oracle全文检索技术应用
下一篇: 高效程序员的45 个习惯
leminsky
博客等级 码龄22年 43粉丝 0原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值