[20190401]那个更快的疑问.txt

--//前一阵子,做了11g于10g下,单表单条记录唯一索引扫描的测试,摘要如下:
--//参考链接:
http://blog.itpub.net/267265/viewspace-2636321/
http://blog.itpub.net/267265/viewspace-2636342/

1.环境:
--//当时的测试,在11g下测试结果如下:
[email protected]> 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

--//在10g下测试结果如下:
[email protected]> 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

--//我的测试环境服务器硬件相同,os版本一样,对比可以发现id=1_unique_index的情况下,10g比11g快了1倍(指id=1_unique_index的情况).
--//而其他方式下11g都明显快于10g,而10g下除了id=1_unique_index下其他执行方式都可以看到大量cbc latch等待事件.
--//而11g仅仅在id=1_index,notnull下看到大量cbc latch等待时间,null方式下(全表扫描)的情况下反而看不到cbc
--//latch等待事件.
--//我一直再想,我是不是测试方法存在什么问题,或者11g做了什么改进?重复测试唯一索引的情况看看:

1.环境:
[email protected]> @ 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 ;
create unique index pk_t on t(id);
create table job_times (sid number, time_ela number,method varchar2(20));
--//分析表略.

$ cat m1.txt
set verify off
host sleep $(echo &&3/50 | bc -l )
insert into job_times values ( sys_context (‘userenv‘, ‘sid‘) ,dbms_utility.get_time ,‘&&2‘) ;
commit ;
declare
v_id number;
v_d date;
begin
    for i in 1 .. &&1 loop
        select /*+ &&3 */ count (*) into v_id from t where id=1;
        --//select /*+ &&3 */ count (*) into v_id from t ;
        --//select /*+ &&3 */ 1 into v_id from dual ;
        --//select /*+ &&3 */ sysdate into v_d from dual ;
    end loop;
end ;
/
update job_times set time_ela = dbms_utility.get_time - time_ela where sid=sys_context (‘userenv‘, ‘sid‘) and method=‘&&2‘;
commit;
quit

$ sqlplus -s -l scott/book @m1.txt 1e6 id=1_unique_index 0 >/dev/null
[email protected]> 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             1                   2615          2615

--//在10g环境下重复上面的步骤略.环境:
[email protected]> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

$ sqlplus -s -l scott/btbtms @m1.txt 1e6 id=1_unique_index 0 >/dev/null

[email protected]> 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             1                   1535          1535

--//可以看出即使我单个用户执行相似的sql语句情况下,唯一索引查询10g下明显快于11g.

2.使用strace跟踪看看:
--//执行1e6次有点慢,改成1e5看看.

--//11g的测试:
$ strace -f -c sqlplus -s -l scott/book @m1.txt 1e5 id=1_unique_index 0 >/dev/null
...
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 72.78    0.043919           0    700708           getrusage
 19.80    0.011947           0    200179           times
  6.67    0.004024         671         6         3 wait4
  0.24    0.000147          29         5           clone
  0.18    0.000106           0       375         2 read
  0.16    0.000096           0       264       106 open
...
------ ----------- ----------- --------- --------- ----------------
100.00    0.060341                902967       206 total

--//10g的测试:
$ strace -f -c sqlplus -s -l scott/btbtms @m1.txt 1e5 id=1_unique_index 0 >/dev/null
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 72.00    0.056425           0    700486           getrusage
 24.98    0.019573        2796         7         2 wait4
  0.91    0.000714           3       236           read
  0.74    0.000582          97         6           clone
  0.73    0.000572         286         2           shmdt
  0.23    0.000177           1       302       189 open
  0.16    0.000122           1       145       108 stat
  0.05    0.000042           1        65           write
..
  0.03    0.000025           0       116           times
------ ----------- ----------- --------- --------- ----------------
100.00    0.097352                702291       347 total

--//差异在于10g很少做times的系统调用上.10g下仅仅116次.而11g高达200179.

--//如果再次执行跟踪如下,11g:
$ strace -f  -p 57003
times({tms_utime=1948, tms_stime=328, tms_cutime=0, tms_cstime=0}) = 10865304314
times({tms_utime=1948, tms_stime=328, tms_cutime=0, tms_cstime=0}) = 10865304314
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
times({tms_utime=1948, tms_stime=328, tms_cutime=0, tms_cstime=0}) = 10865304314
times({tms_utime=1948, tms_stime=328, tms_cutime=0, tms_cstime=0}) = 10865304314
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={19, 483038}, ru_stime={3, 285500}, ...}) = 0
times({tms_utime=1948, tms_stime=328, tms_cutime=0, tms_cstime=0}) = 10865304314
times({tms_utime=1948, tms_stime=328, tms_cutime=0, tms_cstime=0}) = 10865304314
--//调用7次getrusage,调用2次times.
--//对比前面的调用比例也可以看出getrusage调用700708,times调用times200179.非常接近7:2

--//而10g下仅仅看到:
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={13, 203992}, ru_stime={1, 700741}, ...}) = 0

--//正是这样的差异导致10g下明显快于11g.
--//顺便看看times输出表示什么?
$ man 2 times
NAME
       times - get process times

SYNOPSIS
       #include <sys/times.h>

clock_t times(struct tms *buf);

DESCRIPTION
       times() stores the current process times in the struct tms that buf points to.  The struct tms is as defined in <sys/times.h>:

struct tms {
              clock_t tms_utime;  /* user time */
              clock_t tms_stime;  /* system time */
              clock_t tms_cutime; /* user time of children */
              clock_t tms_cstime; /* system time of children */
       };

The  tms_utime field contains the CPU time spent executing instructions of the calling process.  The tms_stime
       field contains the CPU time spent in the system while executing tasks on behalf of the calling process.  The
       tms_cutime field contains the sum of the tms_utime and tms_cutime values for all waited-for terminated children.
       The tms_cstime field contains the sum of the tms_stime and tms_cstime values for all waited-for terminated
       children.

Times for terminated children (and their descendants) is added in at the moment wait(2) or waitpid(2) returns
       their process ID. In particular, times of grandchildren that the children did not wait for are never seen.

All times reported are in clock ticks.

RETURN VALUE
       times() returns the number of clock ticks that have elapsed since an arbitrary point in the past.  For Linux 2.4
       and earlier this point is the moment the system was booted.  Since Linux 2.6, this point is (2^32/HZ) -  300
       (i.e.,  about  429 million) seconds before system boot time.  The return value may overflow the possible range of
       type clock_t.  On error, (clock_t) -1 is returned, and errno is set appropriately.

$ cat   /proc/uptime ;uptime
104375436.65 104342102.07
10:12:33 up 1208 days,  1:10,  2 users,  load average: 0.01, 0.01, 0.07

--//我的计算:
2^32 = 4294967296
4294967296-300 = 4294966996 ,文档提到 429 million seconds,不对明显相差10被.难道Hz的单位1/10秒吗?不懂.
4294967296/60-300 = 429496429.6
10437543665+429496429.6 = 10867040094.6
--//这样与上面的结果比较接近了,再次验证看看.

$ strace -f -p 57447 ; cat /proc/uptime
...
getrusage(RUSAGE_SELF, {ru_utime={22, 765539}, ru_stime={3, 829417}, ...}) = 0
times({tms_utime=2276, tms_stime=382, tms_cutime=0, tms_cstime=0}) = 10865578855
times({tms_utime=2276, tms_stime=382, tms_cutime=0, tms_cstime=0}) = 10865578855
getrusage(RUSAGE_SELF, {ru_utime={22, 765539}, ru_stime={3, 829417}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={22, 765539}, ru_stime={3, 829417}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={22, 765539}, ru_stime={3, 829417}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={22, 765539}, ru_stime={3, 829417}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={22, 765539}, ru_stime={3, 829417}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={22, 765539}, ru_stime={3, 829417}, ...}) = 0
getrusage(RUSAGE_SELF, {ru_utime={22, 765539}, ru_stime={3, 829417}, ...}) = 0
^CProcess 57447 detached
104377639.45 2484149083.69

4294967296/2593.795/1^6 -300  = 1655562.27747374021462760164

104377639.45+1655562.27747374021462760164
10437763945+(4294967296/10-300) = 10867260374.6

--//存在很大的误差放弃!!

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

时间: 2024-10-25 19:14:16

[20190401]那个更快的疑问.txt的相关文章

[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

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

字典生成慢,查找快.列表生成快,查找慢.如果是数据多,经常需要查询,务必使用字典. 请看?? 思路: 生成一个很大的文本文件 分别用列表和字典来存储数据,然后读取并搜索数据 考察列表和字典做为数据结构的时候,存储的时间,搜索和访问的时间 计算两种方案的消耗时间 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解析记录.保证上网更加安全.去掉网

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

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