[20180626]函数与标量子查询14.txt

--//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到:

通俗来将,当使用标量子查询的时候,ORACLE会将子查询结果缓存在哈希表中, 如果后续的记录出现同样的值,优化器通过缓存在哈希
表中的值,判断重复值不用重复调用函数,直接使用上次计算结果即可。从而减少调用函数次数,从而达到优化性能的效果。另外在
ORACLE 10和11中, 哈希表只包含了255个Buckets,也就是说它能存储255个不同值,如果超过这个范围,就会出现散列冲突,那些出现
散列冲突的值就会重复调用函数,即便如此,依然能达到大幅改善性能的效果。

--//前几天测试11.2.0.4 for linux下,哈希表不止255个Buckets.
--//另外也测试再10g下到底有512个Buckets.11.2.0.4是1024.
--//昨天看链接http://www.cnblogs.com/kerrycode/p/9223093.html =>ORACLE中Scalar subquery Caching的hash table大小测试浅析
--//里面建立一个函数,很容易确定调用函数的次数.重复测试,另外前面的测试有点慢,看看我现在的测试是否快一点.^_^ .

1.环境:
SCOTT@book> @ &r/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 or replace function f( x in varchar2 ) return number
as
begin
        dbms_application_info.set_client_info(userenv('client_info')+1 );
        return length(x);
end;
/

2.建立测试脚本:
create table t as select rownum id1,mod(rownum-1,10000)+1 id2 from dual connect by level<=20000;
--//分析表略.
create table t1 ( a number ,b number);
--//字段a 表示调用函数次数.

--//建立脚本cy.txt
exec dbms_application_info.set_client_info(0);
set term off
exec :x := &&1;
select count(distinct f_id2) from (select id2,(select f(id2) from dual) as f_id2 from t where id2 <= :x );
set term on
insert into t1 values (userenv('client_info') ,:x) ;
commit ;

--//建立shell脚本cy.sh:
#! /bin/bash
sqlplus -s -l scott/book <<EOF >> hz.txt
variable x number;
$(seq 10000 | xargs -I{} echo @cy.txt {})
quit
EOF

3.另外的测试脚本:
--//自己也写PL/SQL脚本.仅仅为了学习...
declare
x number;
  begin
   for i in 1..10000 loop
     dbms_application_info.set_client_info(0);
     select count(distinct f_id2) into x from (select id2,(select f(id2) from dual) as f_id2 from t where id2 <= i );  
     insert into t1 values (userenv('client_info') ,i) ;
     commit ;
   end loop;
end;
/

--//在家里的12c for windows测试看看:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

select max(id2) from (
SELECT id2, r, rp
  FROM (  SELECT b id2, a r, LAG (a) OVER (ORDER BY b) rp
            FROM t1
        ORDER BY b)
 WHERE r - rp = 1 order by id2);

MAX(ID2)
----------
      9234
--//说明:我前面的测试id2 记录的数量加倍,而这次记录的是变量:X,这样不要在除以2.

SELECT id2, r, rp
  FROM (  SELECT b  id2, a r, LAG (a) OVER (ORDER BY b) rp
            FROM t1
        ORDER BY b)
 WHERE r - rp >= 2 and id2<=9234 ;
...
8210 rows selected.

--// 9234-8210 = 1024 ,与前面测试一样.

4.验证测试是否正确:
--//执行以上脚本.cy.sh,等....

select max(id2) from (
SELECT id2, r, rp
  FROM (  SELECT b id2, a r, LAG (a) OVER (ORDER BY b) rp
            FROM t1
        ORDER BY b)
 WHERE r - rp = 1 order by id2);
    MAX(ID2)
------------
        9234
--//9234还会进入buckupset,后面的数字带入都是出现hash 冲突的情况.

SELECT id2, r, rp
  FROM (  SELECT b id2, a r, LAG (a) OVER (ORDER BY b) rp
            FROM t1
        ORDER BY b)
 WHERE r - rp >= 2 and id2<=9234 ;
...

8210 rows selected.
 
--//输出太长,一共8210个值,略,这个结果就是在1-9234之间,出现hash冲突的值.
select count(*) from
(SELECT id2, r, rp
  FROM (  SELECT b id2, a r, LAG (a) OVER (ORDER BY b) rp
            FROM t1
        ORDER BY b)
 WHERE r - rp >= 2 and id2<=9234 );

COUNT(*)
------------
        8210

--//9234-8210 = 1024 ,可以看出11.2.0.4标量子查询的哈希表大小是1024个buckets.
--//后面的测试不再做了.

转载于:https://www.cnblogs.com/lfree/p/9232171.html

[20180626]函数与标量子查询14.txt相关推荐

  1. 20180601]函数与标量子查询2.txt

    [20180601]函数与标量子查询2.txt --//昨天看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查询 ...

  2. [20180602]函数与标量子查询3.txt

    [20180602]函数与标量子查询3.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查询 ...

  3. 又是标量子查询引起的性能问题

    某系统巡检,发现TOPSQL里面第一条SQL语句的执行时间相当不合理~ select (select EC_CUST_NOfrom GYL.FAAAAASM cuswhere cus.refcode ...

  4. 标量子查询产生的SQL性能瓶颈,该怎么合理优化?

    来自:DBAplus社群 作者介绍 郝昊喆,新炬网络数据库专家.擅长数据库方面的开发.整体架构及复杂SQL的调优,参与了多个行业核心系统的优化工作,目前专注于对开源技术.自动化运维和性能调优技术的研究 ...

  5. order by 子查询_视图,子查询,标量子查询,关联子查询

    视图 子查询 标量子查询 关联子查询 如何用SQL解决业务问题 各种函数 1. 视图 视图内存放SQL查询语句,运行时运行该语句.查出的数据为临时数据 创建视图 create view as 视图名称 ...

  6. Oracle 语言分类 数据类型 数据类型转换 常用函数 集合操作 子查询

    SQL分类 SQL(Structure Query Language)语言是数据库的核心语言.SQL语言共分为四大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL.1 ...

  7. 12C 新特性 | 标量子查询自动转换

    有超过6年超大型数据库专业服务经验,擅长数据库解决方案设计与项目管理:在多年的技术实践中,先后为运营商(移动.电信).银行.保险.制造业等各行业客户的业务关键型系统提供了运维.升级.性能优化.项目实施 ...

  8. oracle标量子查询 外层,Oracle标量子查询

    Oracle标量子查询 ORACLE允许在select子句中包含单行子查询, 使用标量子查询可以有效的改善性能,当使用到外部连接,或者使用到了聚合函数,就可以考虑标量子查询的可能性. 下面来看几个例子 ...

  9. 优化案例2:select标量子查询且主查询排序

    优化案例2:select标量子查询且主查询排序 1. 场景描述 2. 分析过程 2.1 查看原始SQL执行计划 2.2 ET定位耗时操作符 2.3 注释大法 3. 解决方法 3.1 HINT功法 3. ...

最新文章

  1. Js 拦截全局ajax请求
  2. 空指针异常是什么原因_睡觉时,突然抖了一下,脚踏空,是什么原因?
  3. session或者error引起的iframe嵌套问题的解决
  4. virtual box虚拟机分区后下一步看不见解决
  5. ajax成功之后在执行,ajax传入成功后执行后台方法
  6. java决策_机Java解决决策表
  7. 记Outlook插件与Web页面交互的各种坑 (含c# HttpWebRequest 连接https 的完美解决方法)
  8. JumpList中Recent类别和自定义类型
  9. 制作U盘免疫病毒文件夹
  10. 数学知识:扩展欧几里得算法
  11. Gos —— 文件系统
  12. ReversingWithLena——01. Olly + assembler + patching a basic reverseme
  13. 【Python】 matplotlib 以pdf形式保存图片
  14. 抖音CEO张一鸣:大学四年收获及工作感悟
  15. 联想计算机g480开不开机,联想G480笔记本进入不了bios怎么办_联想笔记本G480无法进入BIOS如何解决...
  16. 微信小程序真机调试踩坑
  17. 财务投资者和战略投资者有什么分别
  18. eclipse与tomcat7配置
  19. 开放网络–服务提供商的未来
  20. 统计虚词使用不同聚类方法判别红楼梦作者

热门文章

  1. 机器学习笔记(6):多类逻辑回归-使用gluon
  2. [转] C#2010 在TreeView控件下显示路径下所有文件和文件夹
  3. linux系统自动执行任务(转)
  4. 电子邮件通知系统前十名的 ”磁盘贪婪用户“
  5. vnc远程桌面很慢_服务器远程桌面连接很慢
  6. 私藏的开发过程中的那些基类
  7. 源码阅读:SDWebImage(五)——SDWebImageFrame
  8. 工信部:2020年启动5G商用
  9. C# Winform 运行异常 CefSharp.core.dll 找不到指定的模块
  10. 安装saltstack遇到的问题锦集