[20190219]那个更快(11g).txt

--//前几天测试11g Query Result Cache RC Latches时,链接http://blog.itpub.net/267265/viewspace-2632907/
--//有网友指出测试有问题,建立索引唯一,并不会导致select count(*) from t,选择索引执行.实际上执行计划还是全表扫描.
--//也就有了如下测试,不过结果有点让我吃惊,设置not null反而更慢.通过测试说明:
--//另外我也做了10g下的测试,链接如下:http://blog.itpub.net/267265/viewspace-2636321/ => [20190215]那个更快(10g).txt

1.环境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create table t as select rownum id from dual ;
--//分析表略.
--//另外说明一下,先建立表主要避免编译过程时报错.

2.建立测试环境:
create table job_times (sid number, time_ela number,method varchar2(20));

CREATE OR REPLACE PROCEDURE do_work
(
   p_iterations   IN NUMBER
  ,p_method       IN VARCHAR2
)
IS
   l_rowid   ROWID;
   v_t       NUMBER;
BEGIN
   INSERT INTO job_times VALUES ( SYS_CONTEXT (‘userenv‘, ‘sid‘) ,DBMS_UTILITY.get_time ,p_method) RETURNING ROWID INTO l_rowid;

FOR i IN 1 .. p_iterations
   LOOP
      SELECT COUNT (*) INTO v_t FROM t;
   END LOOP;

UPDATE job_times SET time_ela = DBMS_UTILITY.get_time - time_ela WHERE ROWID = l_rowid;

COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE do_work1
(
   p_iterations   IN NUMBER
  ,p_method       IN VARCHAR2
)
IS
   l_rowid   ROWID;
   v_t       NUMBER;
BEGIN
   INSERT INTO job_times VALUES ( SYS_CONTEXT (‘userenv‘, ‘sid‘) ,DBMS_UTILITY.get_time ,p_method) RETURNING ROWID INTO l_rowid;

FOR i IN 1 .. p_iterations
   LOOP
      SELECT COUNT (*) INTO v_t FROM t where id=1;
   END LOOP;

UPDATE job_times SET time_ela = DBMS_UTILITY.get_time - time_ela WHERE ROWID = l_rowid;

COMMIT;
END;
/

3.测试:
--//执行脚本如下:注一定要等N个会话执行完成在回车,进行下一项测试.
--//可以打开另外的会话执行select method,count(*),avg(TIME_ELA),sum(TIME_ELA) from job_times group by method order by 3 ;
--//确定测试是否完成.

$ cat bb.txt
delete from job_times;
commit ;
drop table t purge;
create table t as select rownum id from dual ;
execute sys.dbms_stats.gather_table_stats ( OwnName => user,TabName => ‘t‘,Estimate_Percent => NULL,Method_Opt => ‘FOR ALL COLUMNS SIZE 1 ‘,Cascade => True ,No_Invalidate => false);
alter procedure do_work compile ;
alter procedure do_work1 compile ;
host sleep 5

host seq &&1 | xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,‘null‘)\" & "  | bash > /dev/null
host read -p ‘wait finish...‘

create unique index pk_t on t(id);
alter table t modify (id  not null);
host seq &&1 | xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,‘notnull‘)\" & "  | bash > /dev/null
host read -p ‘wait finish...‘

host seq &&1 | xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work1(&&3,‘id=1_unique_index‘)\" & "  | bash > /dev/null
host read -p ‘wait finish...‘

drop index pk_t ;
create index pk_t on t(id);
host seq &&1 | xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work1(&&3,‘id=1_index‘)\" & "  | bash > /dev/null
host read -p ‘wait finish...‘

alter table t result_cache (mode force);
host seq &&1| xargs -I{} echo "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,‘result_cache‘)\" & "  | bash > /dev/null
host read -p ‘wait finish...‘

--//简单说明:执行需要3个参数,参数1:启动连接数,参数2:scott口令,参数3,循环次数.
--//执行如下:  @ bb.txt 50 book 1e6
--//第1种方式:执行计划是全表扫描,逻辑读2(10g下这里是3),看到的等待事件是cursor: pin S.很奇怪11g下看不到latch: cache buffers chains相关等待事件.
--//第2种方式:建立唯一索引,加入约束id not null,这样执行计划INDEX FULL SCAN,逻辑读1.看到的等待事件是latch: cache buffers chains,偶尔能看到cursor: pin S.
--//第3种方式:执行语句加入谓词id=1,这样执行计划INDEX UNIQUE SCAN,逻辑读1.看到的等待事件是cursor: pin S,在11g下latch: cache buffers chains看不到.
              注:在这种情况cbc latch减少一半比其它方式.
--//第4种方式:索引修改非唯一,执行语句加入谓词id=1,这样执行计划是INDEX RANGE SCAN,逻辑读1.看到的等待事件是latch: cache buffers chains.偶尔能看到cursor: pin S.
--//第5种方式:设置result_cache=force;逻辑读0,看到的等待事件是cursor: pin S.

--//测试结果如下:
SCOTT@book> select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
result_cache                 50                   8611        430536
id=1_unique_index            50                   9494        474714
null                         50                  10664        533197
id=1_index                   50                  28160       1407987
notnull                      50                  29279       1463928

--//你可以发现结果按照快慢排序 result_cache => id=1_unique_index => null => id=1_index,notnull,实际上最后2个结果很接近.

--//使用result_cache 最快很好理解,为什么设置列NULL比not null快许多呢?

--//而且设置字段id NULL是全表扫描,至少2个逻辑读(对于ctas建立的表),而设置字段id NOT NULL 走的是快速全索引扫描(1个逻辑读).
--//看测试结果 not null的情况下几乎慢了3倍.

--//实际上字段设置 not null更慢.因为这时出现cursor: pin S 外,还出现外还大量出现 latch: cache buffers chains,而全表扫描
--//反而不出现latch: cache buffers chains等待事件.这样设置not null反而更慢.

--//11g在处理latch: cache buffers chains上做了一些优化,读读情况下有时候看不到cbc latch.
--//不过id=1_unique_index这样的情况下反而比10g执行要慢.
--//在10g下测试如下:
SCOTT@test> select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
id=1_unique_index            50                   4864        243192
notnull                      50                  34134       1706713
id=1_index                   50                  34703       1735173
null                         50                  37234       1861717

--//实际上10g,11g是硬件配置一样,os安装也一样.
--//附上监测wait脚本:
 $ cat wait.sql
select p1raw,p2raw,p3raw,p1,p2,p3,sid,serial#,seq#,event,status,state,wait_time_micro,seconds_in_wait,wait_class
from v$session where ( wait_class<>‘Idle‘ or (status=‘ACTIVE‘ and STATE=‘WAITED KNOWN TIME‘))
and sid not in (select sid from v$mystat where rownum=1)
order by event ;

原文地址:https://www.cnblogs.com/lfree/p/10399988.html

时间: 2024-10-20 02:05:50

[20190219]那个更快(11g).txt的相关文章

***列表和字典在底层中 谁更快***

字典生成慢,查找快.列表生成快,查找慢.如果是数据多,经常需要查询,务必使用字典. 请看?? 思路: 生成一个很大的文本文件 分别用列表和字典来存储数据,然后读取并搜索数据 考察列表和字典做为数据结构的时候,存储的时间,搜索和访问的时间 计算两种方案的消耗时间 1.创建百万字符文件 我们需要一个较大的文件,来证明我们的猜想!干脆直接生成一个有百万行的字符串乱码文件. 1).产生一串随机字符: 取一些随机的字符,包括数字,字符,标点和符号等等,一共95个随机字符 2).把字符序列,进行随机化分布

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

Oracle里count(1)、count(*)和count(主键)哪个更快

这两天听了将近20场演讲,感觉收获很多,最深的感觉就是自己还有很长的路要走.有几个点记录一下: 昨天听老猫讲,提到一个普遍的问题就是Oracle里count(*).count(1)和count(主键)到底哪个快的问题.这个问题看起来很简单,每个人都会有自己的答案,去百度上搜会出来一大堆帖子来讲哪个更快.但是老猫说了它们三个其实是一样的,我听到之后也觉得挺诧异的,因为我记得别人跟我说过count(主键)会快,然后自己简单想了一下,觉得好像是那么回事的就没有深入去追究.接着老猫说官方有这样的说法这三

探寻C/C++中更快的大数(自然数集)模板

本文系fcbruce个人原创整理,转载请注明出处http://blog.csdn.net/u012965890/article/details/40432511,谢谢! 我们知道在C/C++中int型可处理-2^31~2^31-1(32位及以上编译器),long long型可处理-2^63~2^63-1的数据,这实际上是非常有限的,在很多情况下,我们往往会处理范围更大的数据.Java中有BigInteger类,python中想要多大就有多大(取决于内存),但是C/C++就显得有些乏力,这时候我们

你的以太网速度足够快吗?四种更快的速度正在路上&amp;#183;&amp;#183;&amp;#183;&amp;#183;&amp;#183;&amp;#183;

以太网的未来将远远超越下一个最快速度:为无处不在的网络协议绘制路径的网络project师们正在寻找新版本号来服务于各种应用程序. 在上周六的以太网联盟(一个行业组织,用于促进IEEE以太网标准)会议上,三大新项目被提出来讨论.为了x满足数据云中心的迫切需求,确立了25Gbps(字节/秒)的以太网速率标准.但鉴于未来几年内数据云的迅猛发展,专家已经在商讨50Gbps的速率标准了.对于那些新的.高速Wi-Fi接入的企业来说.立即就要实现2.5Gbps的以太网速率.除此之外,未来的最高时速主要将被应用

更快学习 JS 的 6 个简单思维技巧

当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战: 有些概念容易混淆,特别是当你学习过其他语言的时候. 很难找到学习的时间(有时候是动力). 一旦当你理解了一些东西的时候,却很容易再一次忘记. 可以使用的工具甚多且经常变化,所以不知道从哪里开始入手. 幸运的是,这些挑战最终都可以被战胜.在这篇文章里,我将介绍 6 个思维技巧来帮你更快的学习 JavaScript ,让你成为一个更快乐更多产的程序员. 1.不要让将来的决定阻止你进步 对于很多学习 JavaSc

Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析

默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常被解析,莫名其妙地打不开,或者时好时坏. 如果碰上不稳定的本地DNS,还可能经常出现无法解析的情况.除了要避免"坏"的DNS的影响,我们还可以利用DNS做些"好"事,例如管理局域网的DNS.给手机App Store加速.纠正错误的DNS解析记录.保证上网更加安全.去掉网

秒开缓存加速系统 不需多花钱就能更快

网络技术的发展不是这一两年的事情,但是伴随着网络技术的应用越来越多的人开始了自己的网络学习办公.娱乐生活,而且,不难发现,随着互联网的不断发展,现在网络上的高清视频.影片下载.音乐下载.移动软件应用也越来越丰富,特别是最近火爆的网络视频的成为潮流,但是负面影响就是网络流量增长导致对出口形成很大压力. 对于技术控来讲,面对这种情况一般不会觉得很有压力,因为他们的传统的做法一般有两种:其中一是增加宽带,第二就是通过路由限速.但其实这两种方法都不是最理想解决办法.为什么呢?因为如果增加带宽就增加了自己

PHP 更快的方式实现数组去重

概述 使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组.这个函数大多数情况下都能工作得很好.但是,如果你尝试在一个大的数组里使用array_unique()函数,它会运行地慢一些. 有一个比较好而且更快的函数array_flip()来替代使用array_unique()函数来创建唯一的数组.这个魔法般的函数会交换数组里面每一个元素的键和值,因为键值必须唯一,因此,你会得到跟array_unique()函数一样的结果. 更快的方式实现PHP