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

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

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

--//我自己也重复测试验证看看.

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

grant execute on sys.dbms_lock to scott;

CREATE OR REPLACE FUNCTION sleep (seconds IN NUMBER)
RETURN NUMBER
is
d_date date;
BEGIN
  select sysdate into d_date from dual;
--//sys.dbms_lock.sleep(0.1);
  RETURN seconds;
END;
/

create table t as select rownum id1,mod(rownum-1,255)+1 id2 from dual connect by level<=255;
ALTER TABLE t MINIMIZE RECORDS_PER_BLOCK ;
insert into t select * from t;
commit ;

--//分析表略.

2.测试:
--//建立测试脚本:
set autot traceonly
select rowid,t.*,(select sleep(id2) from dual) s from t ;
--//select rowid,t.*,(select sleep(id1) from dual) s from t ;

SCOTT@book> select rowid,t.*,(select sleep(id2) from dual) s from t ;
510 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1032660217
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   510 |  4080 |     4   (0)| 00:00:01 |
|   1 |  FAST DUAL        |      |     1 |       |     2   (0)| 00:00:01 |
|   2 |  TABLE ACCESS FULL| T    |   510 |  4080 |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
        282  recursive calls
          0  db block gets
          9  consistent gets
          0  physical reads
          0  redo size
      16624  bytes sent via SQL*Net to client
        542  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
        510  rows processed

--//从递归看调用函数282次.注意为了测试准确,多执行几次,才能比较准确测出函数调用次数.
--//按照前面的介绍,难道存在hash冲突.

--//如果查询where id2 in ( 48 , 75) ,可以发现递归调用3次,返回4行.
--//为什么不是4次呢?
SCOTT@book> select rowid,t.*,(select sleep(id2) from dual) s from t where id2 in ( 48 , 75) ;
Execution Plan
----------------------------------------------------------
Plan hash value: 1032660217
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     4 |    32 |     4   (0)| 00:00:01 |
|   1 |  FAST DUAL        |      |     1 |       |     2   (0)| 00:00:01 |
|*  2 |  TABLE ACCESS FULL| T    |     4 |    32 |     4   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("ID2"=48 OR "ID2"=75)
Statistics
----------------------------------------------------------
          3  recursive calls
          0  db block gets
          7  consistent gets
          0  physical reads
          0  redo size
        878  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed

--//修改函数定义
CREATE OR REPLACE FUNCTION sleep1 (seconds IN NUMBER)
RETURN NUMBER
is
d_date date;
BEGIN
  select sysdate into d_date from dual;
  sys.dbms_lock.sleep(seconds/10);
  RETURN seconds;
END;
/

SCOTT@book> select rowid,t.*,(select sleep1(id2) from dual) s from t where id2 in ( 48 , 75) ;
ROWID                     ID1        ID2          S
------------------ ---------- ---------- ----------
AAAWP4AAEAAAAJbAAv         48         48         48
AAAWP4AAEAAAAJbABK         75         75         75
AAAWP4AAEAAAAJdAAv         48         48         48
AAAWP4AAEAAAAJdABK         75         75         75
Elapsed: 00:00:19.81

SCOTT@book> select rowid,t.*,(select sleep1(id2) from dual) s from t where id2 in ( 49 , 75) ;
ROWID                     ID1        ID2          S
------------------ ---------- ---------- ----------
AAAWP4AAEAAAAJbAAw         49         49         49
AAAWP4AAEAAAAJbABK         75         75         75
AAAWP4AAEAAAAJdAAw         49         49         49
AAAWP4AAEAAAAJdABK         75         75         75
Elapsed: 00:00:12.41

--// 48+75+75 = 198, 49+75 = 124
--// 可以发现从时间看,查询 id2 in ( 48 , 75) 时,调用sleep1(48)1次,sleep1(75)2次.
--// 而查询 id2 in ( 49 , 75) 时,调用sleep1(49)1次,sleep1(75)1次.
--// 换一句话讲我的理解,调用48,75存在冲突,都进入bucket中,而出现冲突时会重复调用函数.

--//如果我建立索引:
SCOTT@book> create index i_t_id2 on t(id2);
Index created.

SCOTT@book> set timing on
SCOTT@book> select /*+ index(t i_t_id2 ) */ rowid,t.*,(select sleep1(id2) from dual) s from t where id2 in ( 49 , 75) ;
ROWID                     ID1        ID2          S
------------------ ---------- ---------- ----------
AAAWP4AAEAAAAJbAAw         49         49         49
AAAWP4AAEAAAAJdAAw         49         49         49
AAAWP4AAEAAAAJbABK         75         75         75
AAAWP4AAEAAAAJdABK         75         75         75
Elapsed: 00:00:12.41
--//这样执行时间变成12.4秒,还是不好理解.
--//似乎进入buckets时放在前面.这样slee1(75)仅仅调用1次.好烦,那位能解析清楚....

SCOTT@book> drop index i_t_id2;
Index dropped.

--//我前面查询id2=1,255,递归282次,估计不存在1个bucket 3个值的情况.
--//这样有282-255 = 27值存在冲突(假设哈希表只包含了255个Buckets)

3.如何确定hash冲突值呢?
--//建立脚本:
variable x number;
exec :x := 1;
select rowid,t.*,(select sleep(id2) from dual) s from t where id2<=:x;

set autot traceonly
exec :x := 1;
/
exec :x := 2;
/
....
exec :x := 252;
/
exec :x := 253;
/
exec :x := 254;
/
exec :x := 255;
/
set autot off

--//多执行几次,避免其它递归影响.
spool az.txt
@ ay.txt
spool off

$ egrep 'recursive calls|rows processed' az.txt | paste - -
          1  recursive calls              2  rows processed
          2  recursive calls              4  rows processed
          3  recursive calls              6  rows processed
          4  recursive calls              8  rows processed
          5  recursive calls             10  rows processed
          6  recursive calls             12  rows processed
          7  recursive calls             14  rows processed
          8  recursive calls             16  rows processed
          9  recursive calls             18  rows processed
         10  recursive calls             20  rows processed
         11  recursive calls             22  rows processed
         12  recursive calls             24  rows processed
         13  recursive calls             26  rows processed
         14  recursive calls             28  rows processed
         15  recursive calls             30  rows processed
         16  recursive calls             32  rows processed
         17  recursive calls             34  rows processed
         18  recursive calls             36  rows processed
         19  recursive calls             38  rows processed
         20  recursive calls             40  rows processed
         21  recursive calls             42  rows processed
         22  recursive calls             44  rows processed
         23  recursive calls             46  rows processed
         24  recursive calls             48  rows processed
         25  recursive calls             50  rows processed
         26  recursive calls             52  rows processed
         27  recursive calls             54  rows processed
         28  recursive calls             56  rows processed
         29  recursive calls             58  rows processed
         30  recursive calls             60  rows processed
         31  recursive calls             62  rows processed
         32  recursive calls             64  rows processed
         33  recursive calls             66  rows processed
         34  recursive calls             68  rows processed
         35  recursive calls             70  rows processed
         36  recursive calls             72  rows processed
         37  recursive calls             74  rows processed
         38  recursive calls             76  rows processed
         39  recursive calls             78  rows processed
         40  recursive calls             80  rows processed
         41  recursive calls             82  rows processed
         42  recursive calls             84  rows processed
         43  recursive calls             86  rows processed
         44  recursive calls             88  rows processed
         45  recursive calls             90  rows processed
         46  recursive calls             92  rows processed
         47  recursive calls             94  rows processed
         48  recursive calls             96  rows processed
         49  recursive calls             98  rows processed
         50  recursive calls            100  rows processed
         51  recursive calls            102  rows processed
         52  recursive calls            104  rows processed
         53  recursive calls            106  rows processed
         54  recursive calls            108  rows processed
         55  recursive calls            110  rows processed
         56  recursive calls            112  rows processed
         57  recursive calls            114  rows processed
         58  recursive calls            116  rows processed
         59  recursive calls            118  rows processed
         60  recursive calls            120  rows processed
         61  recursive calls            122  rows processed
         62  recursive calls            124  rows processed
         63  recursive calls            126  rows processed
         64  recursive calls            128  rows processed
         65  recursive calls            130  rows processed
         66  recursive calls            132  rows processed
         67  recursive calls            134  rows processed
         68  recursive calls            136  rows processed
         69  recursive calls            138  rows processed
         70  recursive calls            140  rows processed
         71  recursive calls            142  rows processed
         72  recursive calls            144  rows processed
         73  recursive calls            146  rows processed
         74  recursive calls            148  rows processed
         76  recursive calls            150  rows processed
         77  recursive calls            152  rows processed
         78  recursive calls            154  rows processed
         79  recursive calls            156  rows processed
         80  recursive calls            158  rows processed
         81  recursive calls            160  rows processed
         82  recursive calls            162  rows processed
         83  recursive calls            164  rows processed
         84  recursive calls            166  rows processed
         86  recursive calls            168  rows processed
         87  recursive calls            170  rows processed
         88  recursive calls            172  rows processed
         90  recursive calls            174  rows processed
         91  recursive calls            176  rows processed
         93  recursive calls            178  rows processed
         94  recursive calls            180  rows processed
         95  recursive calls            182  rows processed
         96  recursive calls            184  rows processed
         98  recursive calls            186  rows processed
         99  recursive calls            188  rows processed
        100  recursive calls            190  rows processed
        102  recursive calls            192  rows processed
        103  recursive calls            194  rows processed
        104  recursive calls            196  rows processed
        105  recursive calls            198  rows processed
        106  recursive calls            200  rows processed
        107  recursive calls            202  rows processed
        108  recursive calls            204  rows processed
        110  recursive calls            206  rows processed
        112  recursive calls            208  rows processed
        113  recursive calls            210  rows processed
        114  recursive calls            212  rows processed
        115  recursive calls            214  rows processed
        116  recursive calls            216  rows processed
        118  recursive calls            218  rows processed
        119  recursive calls            220  rows processed
        120  recursive calls            222  rows processed
        121  recursive calls            224  rows processed
        122  recursive calls            226  rows processed
        123  recursive calls            228  rows processed
        124  recursive calls            230  rows processed
        125  recursive calls            232  rows processed
        126  recursive calls            234  rows processed
        127  recursive calls            236  rows processed
        128  recursive calls            238  rows processed
        129  recursive calls            240  rows processed
        130  recursive calls            242  rows processed
        132  recursive calls            244  rows processed
        133  recursive calls            246  rows processed
        134  recursive calls            248  rows processed
        135  recursive calls            250  rows processed
        136  recursive calls            252  rows processed
        137  recursive calls            254  rows processed
        138  recursive calls            256  rows processed
        139  recursive calls            258  rows processed
        140  recursive calls            260  rows processed
        141  recursive calls            262  rows processed
        142  recursive calls            264  rows processed
        143  recursive calls            266  rows processed
        144  recursive calls            268  rows processed
        145  recursive calls            270  rows processed
        146  recursive calls            272  rows processed
        147  recursive calls            274  rows processed
        148  recursive calls            276  rows processed
        150  recursive calls            278  rows processed
        151  recursive calls            280  rows processed
        152  recursive calls            282  rows processed
        153  recursive calls            284  rows processed
        154  recursive calls            286  rows processed
        155  recursive calls            288  rows processed
        156  recursive calls            290  rows processed
        157  recursive calls            292  rows processed
        158  recursive calls            294  rows processed
        159  recursive calls            296  rows processed
        160  recursive calls            298  rows processed
        161  recursive calls            300  rows processed
        162  recursive calls            302  rows processed
        164  recursive calls            304  rows processed
        165  recursive calls            306  rows processed
        166  recursive calls            308  rows processed
        167  recursive calls            310  rows processed
        168  recursive calls            312  rows processed
        169  recursive calls            314  rows processed
        170  recursive calls            316  rows processed
        171  recursive calls            318  rows processed
        172  recursive calls            320  rows processed
        173  recursive calls            322  rows processed
        174  recursive calls            324  rows processed
        176  recursive calls            326  rows processed
        177  recursive calls            328  rows processed
        178  recursive calls            330  rows processed
        179  recursive calls            332  rows processed
        180  recursive calls            334  rows processed
        181  recursive calls            336  rows processed
        183  recursive calls            338  rows processed
        184  recursive calls            340  rows processed
        186  recursive calls            342  rows processed
        187  recursive calls            344  rows processed
        188  recursive calls            346  rows processed
        189  recursive calls            348  rows processed
        190  recursive calls            350  rows processed
        192  recursive calls            352  rows processed
        193  recursive calls            354  rows processed
        194  recursive calls            356  rows processed
        195  recursive calls            358  rows processed
        196  recursive calls            360  rows processed
        197  recursive calls            362  rows processed
        198  recursive calls            364  rows processed
        199  recursive calls            366  rows processed
        200  recursive calls            368  rows processed
        201  recursive calls            370  rows processed
        202  recursive calls            372  rows processed
        203  recursive calls            374  rows processed
        204  recursive calls            376  rows processed
        205  recursive calls            378  rows processed
        206  recursive calls            380  rows processed
        207  recursive calls            382  rows processed
        208  recursive calls            384  rows processed
        210  recursive calls            386  rows processed
        211  recursive calls            388  rows processed
        213  recursive calls            390  rows processed
        215  recursive calls            392  rows processed
        216  recursive calls            394  rows processed
        217  recursive calls            396  rows processed
        218  recursive calls            398  rows processed
        219  recursive calls            400  rows processed
        220  recursive calls            402  rows processed
        221  recursive calls            404  rows processed
        222  recursive calls            406  rows processed
        223  recursive calls            408  rows processed
        224  recursive calls            410  rows processed
        226  recursive calls            412  rows processed
        227  recursive calls            414  rows processed
        228  recursive calls            416  rows processed
        229  recursive calls            418  rows processed
        230  recursive calls            420  rows processed
        231  recursive calls            422  rows processed
        232  recursive calls            424  rows processed
        233  recursive calls            426  rows processed
        234  recursive calls            428  rows processed
        235  recursive calls            430  rows processed
        237  recursive calls            432  rows processed
        238  recursive calls            434  rows processed
        239  recursive calls            436  rows processed
        240  recursive calls            438  rows processed
        241  recursive calls            440  rows processed
        242  recursive calls            442  rows processed
        243  recursive calls            444  rows processed
        244  recursive calls            446  rows processed
        245  recursive calls            448  rows processed
        246  recursive calls            450  rows processed
        247  recursive calls            452  rows processed
        248  recursive calls            454  rows processed
        250  recursive calls            456  rows processed
        251  recursive calls            458  rows processed
        252  recursive calls            460  rows processed
        254  recursive calls            462  rows processed
        255  recursive calls            464  rows processed
        256  recursive calls            466  rows processed
        258  recursive calls            468  rows processed
        259  recursive calls            470  rows processed
        260  recursive calls            472  rows processed
        261  recursive calls            474  rows processed
        262  recursive calls            476  rows processed
        263  recursive calls            478  rows processed
        264  recursive calls            480  rows processed
        265  recursive calls            482  rows processed
        266  recursive calls            484  rows processed
        267  recursive calls            486  rows processed
        269  recursive calls            488  rows processed
        270  recursive calls            490  rows processed
        272  recursive calls            492  rows processed
        273  recursive calls            494  rows processed
        274  recursive calls            496  rows processed
        275  recursive calls            498  rows processed
        276  recursive calls            500  rows processed
        277  recursive calls            502  rows processed
        278  recursive calls            504  rows processed
        279  recursive calls            506  rows processed
        281  recursive calls            508  rows processed
        282  recursive calls            510  rows processed

--//取出数字
$ egrep 'recursive calls|rows processed' az.txt | paste - - | cut -c9-11,37-40

SCOTT@book> create table t1 ( a number ,b number);
Table created.

--//改写成inert插入表t1.
SELECT id2, r, rp
  FROM (  SELECT b / 2 id2, a r, LAG (a) OVER (ORDER BY b) rp
            FROM t1
        ORDER BY a)
WHERE r - rp >= 2;
ID2|R|RP
75|76|74
84|86|84
87|90|88
89|93|91
93|98|96
96|102|100
103|110|108
104|112|110
109|118|116
122|132|130
139|150|148
152|164|162
163|176|174
169|183|181
171|186|184
176|192|190
193|210|208
195|213|211
196|215|213
206|226|224
216|237|235
228|250|248
231|254|252
234|258|256
244|269|267
246|272|270
254|281|279

4.总结:
乱,好多概念不好理解.

20180601]函数与标量子查询2.txt相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. MySQL where后面的标量子查询使用

    #一.where或having后面 1.标量子查询(单行子查询) 2.列子查询(多行子查询) 3.行子查询(多列多行) 特点: ①子查询放在小括号内 ②子查询一般放在条件的右侧 ③标量子查询,一般搭配 ...

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

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

最新文章

  1. 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度...
  2. 自由自在意式手工冰淇淋,健康时尚的美味零食
  3. 【渝粤题库】广东开放大学 商务交际听说 形成性考核
  4. DTC 2019 数据技术嘉年华·金融峰会(深圳站)来袭
  5. STM32H7---高速缓存Cache(二)
  6. IIS 返回 405 - 不允许用于访问此页的 HTTP 谓词。终极解决办法!!!!
  7. shell快速迁移海量文件
  8. C++11中智能指针的原理、使用、实现
  9. linux下部署selenium爬虫程序
  10. 大一python题库及答案_Python经典题库及答案-python经典编程题
  11. Python基础 Zero to Hero面向对象编程(一)
  12. 语音识别之wave文件(*.wav)格式、PCM数据格式介绍
  13. anaconda3配置python2.7环境_Anaconda3+python3环境下如何创建python2环境(win+Linux下适用,同一个anaconda下py2/3共存)...
  14. EEG-fMRI同步记录的伪影去除法
  15. WSL 解决code .报‘code‘ not fount无法打开Vscode问题
  16. pip联网问题 SSLError(SSLError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748
  17. C++ Primer Plus(第六版)--学习杂记(第六章)
  18. notepad++消除生成bak文件
  19. 苹果IWatch真香,包邮送一个!
  20. Keil软件添加新源文件

热门文章

  1. 《数据结构上机实验(C语言实现)》笔记(1 / 12):绪论
  2. Java设计模式(1 / 23):策略模式
  3. 使用国密浏览器和使用Wireshark进行国密抓包
  4. STL源码剖析 入门开始 STL概论与版本简介
  5. 中科大 计算机网络2 什么是互联网
  6. 云计算技术背后的那些天才程序员:KVM之父Avi Kivity
  7. 到底什么才是人生最大的投资
  8. 程序员的恶性循环 !
  9. JM8.5中的7种宏块模式问题 - zhoujunming的专栏 - CSDN博客
  10. Apache RocketMQ:简单消息示例