关于Update语句的调整(2)

news/2024/7/17 11:35:53

(2)


         1.         通常的调整方法

-- 通常来说都先把update语句中的where子句提取出来进行调整。

A.调整前的执行过程:

SQL> select *from pa

  2  where exists (select 1

  3  from p,c

  4  where p.id=pa.id and p.cid=c.cid

  5  )

  6  and not exists (select 1

  7  from d

  8  where id=pa.id)

  9  /

已选择200000行。

已用时间:  00: 00: 36.06

Execution Plan

----------------------------------------------------------                     

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=15347 Card=2500 Byte         

          s=60000)                                                              

                                                                               

   1    0   FILTER                                                             

   2    1     TABLE ACCESS (FULL) OF 'PA' (Cost=347 Card=2500 Bytes=60          

          000)                                                                 

                                                                               

   3    1     NESTED LOOPS (Cost=4 Card=1 Bytes=36)                            

   4    3       TABLE ACCESS (BY INDEX ROWID) OF 'P' (Cost=3 Card=1 By         

          tes=24)                                                              

                                                                               

   5    4         INDEX (UNIQUE SCAN) OF 'PK_P' (UNIQUE) (Cost=2 Card=         

          1)                                                                   

                                                                               

   6    3       INDEX (UNIQUE SCAN) OF 'PK_C' (UNIQUE) (Cost=1 Card=1          

          Bytes=12)                                                            

                                                                               

   7    1     INDEX (UNIQUE SCAN) OF 'PK_D' (UNIQUE) (Cost=2 Card=1 By         

          tes=12)                                                               

                                                                               

Statistics

----------------------------------------------------------                     

        340  recursive calls                                                   

          0  db block gets                                                     

    6517005  consistent gets                                                    

          7  physical reads                                                    

          0  redo size                                                         

    6182538  bytes sent via SQL*Net to client                                   

     546928  bytes received via SQL*Net from client                            

      13335  SQL*Net roundtrips to/from client                                 

          0  sorts (memory)                                                    

          0  sorts (disk)                                                      

     200000  rows processed                                                    

B.对sql语句进行加提示调整

-- 鉴于用于连接的字段均存在NOT NULL约束,可以考虑使用hash_aj提示调整查询

-- 注意:如果d.id/pa.id没有not null约束,hash_aj将不起作用.可以加d.id is not null/pa.id is not null条件避免这种情况

SQL>

SQL> select *from pa

  2  where exists (select 1

  3  from p,c

  4  where p.id=pa.id and p.cid=c.cid

  5  )

  6  and id not in (select /*+hash_aj*/ id

  7  from d)

  8  /

已选择200000行。

已用时间:  00: 00: 32.00

Execution Plan

----------------------------------------------------------                     

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=963 Card=1 Bytes=36)         

   1    0   FILTER                                                              

   2    1     HASH JOIN (ANTI) (Cost=959 Card=1 Bytes=36)                      

   3    2       TABLE ACCESS (FULL) OF 'PA' (Cost=347 Card=50000 Bytes         

          =1200000)                                                            

                                                                               

   4    2       INDEX (FAST FULL SCAN) OF 'PK_D' (UNIQUE) (Cost=284 Ca         

          rd=1000000 Bytes=12000000)                                           

                                                                                

   5    1     NESTED LOOPS (Cost=4 Card=1 Bytes=36)                            

   6    5       TABLE ACCESS (BY INDEX ROWID) OF 'P' (Cost=3 Card=1 By         

          tes=24)                                                               

                                                                               

   7    6         INDEX (UNIQUE SCAN) OF 'PK_P' (UNIQUE) (Cost=2 Card=         

          1)                                                                    

                                                                               

   8    5       INDEX (UNIQUE SCAN) OF 'PK_C' (UNIQUE) (Cost=1 Card=1          

          Bytes=12)                                                             

                                                                               

Statistics

----------------------------------------------------------                     

          0  recursive calls                                                    

          0  db block gets                                                     

    2906545  consistent gets                                                   

          3  physical reads                                                     

          0  redo size                                                         

    6275882  bytes sent via SQL*Net to client                                  

     546928  bytes received via SQL*Net from client                            

      13335  SQL*Net roundtrips to/from client                                 

          0  sorts (memory)                                                    

          0  sorts (disk)                                                      

     200000  rows processed                                                    

SQL>

虽然从执行时间时间上来看,不加提示和加提示分别为00: 00: 36.0600: 00: 32.00,相差不大,但从统计信息上来看,由原来的6517005  consistent gets变为2906545  consistent gets,调整收到一定效果。

 

 

 

 

 

 

 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-21645/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/6906/viewspace-21645/


http://www.niftyadmin.cn/n/2953810.html

相关文章

罗伯特的现金流游戏

转自: http://hi.baidu.com/%BE%A8%D3%E3%D5%DC%D1%A7/blog/item/b0e3034b11cbac2a08f7ef58.html 《现金流游戏》中就重要的一点其实就是这张损益表。表中分成四个重要的部分——收入、支出、资产和负债。今天要想实现你的梦想,彻底掌握你的人生&#x…

吃枸杞上火4/11

昨天上午開始用枸杞泡水喝 每次用10顆,跑了3次,喝水時把枸杞也吃了 下午時開始感覺耳朵有陣痛 晚上嗓子開始有點痛 於是就喝了一罐王老吉,後來用一只雪梨煮水喝 今早又喝了一瓶金銀花露 感覺似乎好些了 盼望這火快點消下去 P.S:baidu一下枸杞是補藥,每天吃10-15顆為宜,看來我吃…

fedora16下安装mysql的问题

目前在fedora16下,yum安装mysql的最新版本是5.5.28,不幸的是在systemctl start mysqld.service阶段会报错。这是一个bug,不过还好有两个解决方法: 1. yum update systemd,然后重新安装即可。 2. 先修改/lib/systemd…

关于Update语句的调整(3)

关于Update语句的调整(3)我们来比较一下调整前后update语句的执行效率如何:调整前:SQL> update pa2 set pa.col13 (select pa.col1*c.col14 from p, c5 where p.idpa.id and p.cidc.cid6 )7 where exists (select 18 from p,c9 where p.idpa.…

fgets要注意的问题

假如我要按行读取一个文本文件,并且想动态分配缓冲区的大小,实例代码如下 #include "stdafx.h" #include "regex" using namespace std; int _tmain(int argc, _TCHAR* argv[]) {FILE* fp NULL;fopen_s(&fp,"test.txt&qu…

myeclipse快捷键大全【转】

编辑作用域功能快捷键文本编辑器查找上一个CtrlShiftK文本编辑器查找下一个CtrlK全局恢复上一个选择AltShift↓全局快速修正Ctrl11全局内容辅助Alt/全局上下文信息Alt?AltShift?CtrlShiftSpaceJava编辑器显示工具提示描述F2Java编辑器选择封装元素AltShift↑Java编…

java bigdecimal取值_Java中BigDecimal类的使用详解

不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。BigDecimal所创建的是对象,我们不能使用传统的、-、*、/等…

解决飞信在windows 7下运行失败的问题

今天用飞信2008,说有升级可用,于是升级,结果升级之后,运行总是失败。最后找到方法就是将操作系统目录下system32目录下的dwmapi.dll覆盖飞信目录下的同名文件就行了。转载于:https://www.cnblogs.com/Ricky81317/archive/2009/04/…