查看: 19844|回复: 74

[性能调整] sql优化讲课中引出的各种问题!

[复制链接]
认证徽章
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
发表于 2007-10-22 00:08 | 显示全部楼层 |阅读模式
感觉还是不错的,简单的总结了一下
涉及的内容有cpu过度消耗,表与表之间的连接,index的使用等,希望对刚接触oracle的弟兄有所帮助也欢迎大家批评指正!
[php]
C:\>sqlplus xys/manager

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 10月 21 22:25:03 2007

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
--如图任务管理器中显示cpu利用率100%,但是在win下只能看到oracle.exe进程占用,不通过工具我们是
无法知道具体是哪个thread在占用,通过工具监视发现thread id是3392占用了大量cpu资源(这段描述
如图吧),于是下面开始诊断、调整和测试
首先通过os thread id来找到oracle对应的process address
SQL> select addr , pid , spid from v$process where spid=3392;

ADDR            PID SPID
-------- ---------- ------------
6D275BEC         16 3392
通过paddr来定位正在执行的sql
SQL> select sid , serial# , paddr , sql_id , sql_hash_value,sql_address from v$s
ession where paddr='6D275BEC';

       SID    SERIAL# PADDR    SQL_ID        SQL_HASH_VALUE SQL_ADDR
---------- ---------- -------- ------------- -------------- --------
       154         42 6D275BEC 5d24cknu04jx8      872564648 699FF918
--通过sql_id查找其执行计划,以下很多操作都类似,从执行计划中确确实实发现该sql耗用了大量的cpu 、io等资源
SQL> select operation,options,object_name ,cost,cardinality ,cpu_cost ,io_cost f
rom v$sql_plan where sql_id='5d24cknu04jx8';

OPERATION       OPTIONS    OBJ       COST CARDINALITY   CPU_COST    IO_COST
--------------- ---------- --- ---------- ----------- ---------- ----------
SELECT STATEMEN                  17621458
T

SORT            AGGREGATE                           1
NESTED LOOPS                     17621458      440182 1.5327E+12   17529070
TABLE ACCESS    FULL       T3        1543      440252  132760270       1535
TABLE ACCESS    FULL       T5          40           1    3481172         40

SQL>
--通过查询也确实发现t3,t5表上没有任何index
22:45:11 SQL> select table_name from user_indexes;

TABLE_NAME
------------------------------
T1
PLAN_TABLE
TT
T_SKIP

已用时间:  00: 00: 00.15
22:47:15 SQL>
t3,t5上的数据量:
23:34:31 SQL> select count(*) from t3;

  COUNT(*)
----------
    438703

已用时间:  00: 00: 02.01
23:35:33 SQL> select count(*) from t5;

  COUNT(*)
----------
     11592

已用时间:  00: 00: 00.00
23:35:39 SQL>
--==================================================================
cpu100%的原因是我正在跑这个操作,忘了set timing了,看看时间大约执行了13分钟
SQL> set time on
22:19:45 SQL> select /*+ use_nl(t3,t5) */ count(*) from t3,t5 where t3.object_id
=t5.object_id;

  COUNT(*)
----------
    428914

22:32:58 SQL>
--==================================================================
如果不加use_nl hint执行效果如下:
optimizer选择了hash join
22:34:55 SQL> select  count(*) from t3,t5 where t3.object_id=t5.object_id;

  COUNT(*)
----------
    428914

22:35:03 SQL>
22:35:54 SQL> select sql_id from v$sql where sql_text like 'select  count(*) fro
m t3,t5 where%';

SQL_ID
-------------
5am8wmjw6rpg4

22:37:10 SQL>
SQL> select operation,options,object_name ,cost,cardinality ,cpu_cost ,io_cost f
rom v$sql_plan where sql_id='5am8wmjw6rpg4';

OPERATION       OPTIONS    OBJ       COST CARDINALITY   CPU_COST    IO_COST
--------------- ---------- --- ---------- ----------- ---------- ----------
SELECT STATEMEN                      1588
T

SORT            AGGREGATE                           1
HASH JOIN                            1588      440182  190300505       1577
TABLE ACCESS    FULL       T5          42       11592    3481172         42
TABLE ACCESS    FULL       T3        1543      440252  132760270       1535

SQL>
--==================================================================
再来看看sort merge的效果,也是非常理想的
22:37:10 SQL> set timing on
22:38:04 SQL> select /*+ use_merge(t3,t5) */ count(*) from t3,t5 where t3.object
_id=t5.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 02.48
22:39:50 SQL> select sql_id from v$sql where sql_text like 'select /*+ use_merge
(t3,t5) */ count(*) from t3,t5 where%';

SQL_ID
-------------
1f181097jnv7n

已用时间:  00: 00: 00.03
22:40:19 SQL>
SQL> select operation,options,object_name ,cost,cardinality ,cpu_cost ,io_cost f
rom v$sql_plan where sql_id='1f181097jnv7n';

OPERATION       OPTIONS    OBJ       COST CARDINALITY   CPU_COST    IO_COST
--------------- ---------- --- ---------- ----------- ---------- ----------
SELECT STATEMEN                      2979
T

SORT            AGGREGATE                           1
MERGE JOIN                           2979      440182  570164240       2945
SORT            JOIN                   81       11592   27688814         79
TABLE ACCESS    FULL       T5          42       11592    3481172         42
SORT            JOIN                 2899      440252  542475427       2866
TABLE ACCESS    FULL       T3        1543      440252  132760270       1535

已选择7行。

--=========================================================================================
如果是采用rule看看optimizer会选择哪种join?试验发现也选择了sort merge join
22:40:19 SQL> select /*+ rule */ count(*) from t3,t5 where t3.object_id=t5.objec
t_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 02.53
22:44:37 SQL> select sql_id from v$sql where sql_text like 'select /*+ rule */ c
ount(*) from t3,t5 where%';

SQL_ID
-------------
d3szut6rrgggj

已用时间:  00: 00: 00.03
22:45:11 SQL>
SQL> select operation,options,object_name ,cost,cardinality ,cpu_cost ,io_cost f
rom v$sql_plan where sql_id='d3szut6rrgggj';

OPERATION       OPTIONS    OBJ       COST CARDINALITY   CPU_COST    IO_COST
--------------- ---------- --- ---------- ----------- ---------- ----------
SELECT STATEMEN
T

SORT            AGGREGATE
MERGE JOIN
SORT            JOIN
TABLE ACCESS    FULL       T5
SORT            JOIN
TABLE ACCESS    FULL       T3
--=====================================================================================
在t3的连接字段object_id上创建一个index来看看使用nl的效果
22:47:15 SQL> create index idx_t3_objid on t3(object_id);

索引已创建。

已用时间:  00: 00: 03.39
如果hint use_nl()只指定一个表的话,那么这个表是被驱动表,但事实上好像有些问题,并没有起作用
,这时候使用的是hash join,不是我们期望的nl
参考的doc:http://grassbell.itpub.net/post/26/12950
22:49:21 SQL> select /*+ use_nl(t3) */ count(*) from t3,t5 where t3.object_id=t5
.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 00.50
22:53:24 SQL> select sql_id from v$sql where sql_text like 'select /*+ use_nl(t3
) */ count(*) from t3,t5 where%';

SQL_ID
-------------
az09uh4v1khxh

已用时间:  00: 00: 00.03
SQL> select operation,options,object_name ,cost,cardinality ,cpu_cost ,io_cost f
rom v$sql_plan where sql_id='az09uh4v1khxh';

OPERATION       OPTIONS    OBJ       COST CARDINALITY   CPU_COST    IO_COST
--------------- ---------- --- ---------- ----------- ---------- ----------
SELECT STATEMEN                       304
T

SORT            AGGREGATE                           1
HASH JOIN                             304      440182  116827541        297
TABLE ACCESS    FULL       T5          42       11592    3481172         42
INDEX           FAST FULL  IDX        259      440252   59287306        255
                SCAN       _T3
                           _OB
                           JID
--=======================================================================================
如果加上ordered的话那么会以from后面table的顺序从左面开始作为驱动表,也就是说t5是驱动表,
这回确实起作用了,使用的是nl,而且我们创建在t3.object_id上的index起作用了,执行非常快
22:53:56 SQL> select /*+ ordered use_nl(t3) */ count(*) from t5,t3 where t3.obje
ct_id=t5.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 00.34
22:58:22 SQL> select sql_id from v$sql where sql_text like 'select /*+ ordered u
se_nl(t3) */ count(*) from t5,t3 where%';

SQL_ID
-------------
5pmukbk70qp2q

已用时间:  00: 00: 00.03
22:59:50 SQL>
SQL> select operation,options,object_name ,cost,cardinality ,cpu_cost ,io_cost f
rom v$sql_plan where sql_id='5pmukbk70qp2q';

OPERATION       OPTIONS    OBJ       COST CARDINALITY   CPU_COST    IO_COST
--------------- ---------- --- ---------- ----------- ---------- ----------
SELECT STATEMEN                     23246
T

SORT            AGGREGATE                           1
NESTED LOOPS                        23246      440182  329133837      23226
TABLE ACCESS    FULL       T5          42       11592    3481172         42
INDEX           RANGE SCAN IDX          2          38      28093          2
                           _T3
                           _OB
                           JID
--=====================================================================================
再一次执行
SQL> select /*+ use_nl(t3,t5) */ count(*) from t3,t5 where t3.object_id=t5.objec
t_id;
通过监视找到thread id 1964
SQL> select addr , pid , spid from v$process where spid=1964;

ADDR            PID SPID
-------- ---------- ------------
6D277F8C         22 1964

SQL> select sid , serial# from v$session where paddr='6D277F8C';

       SID    SERIAL#
---------- ----------
       154         46

SQL> alter system kill session '154,46';

系统已更改。

SQL> select distinct status from v$session;

STATUS
--------
ACTIVE
INACTIVE
--记得9i中kill之后session的状态为killed啊,这里怎么立即这个session就消失了啊?
稍微有点疑问
--======================================================================================
再一次执行
SQL> select /*+ use_nl(t3,t5) */ count(*) from t3,t5 where t3.object_id=t5.objec
t_id;
通过监视找到thread id 2156
SQL> select addr , pid , spid from v$process where spid=2156;

ADDR            PID SPID
-------- ---------- ------------
6D277F8C         22 2156

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl
可以结束session也可以直接kill os process都可以使cpu资源获得释放
SQL> host orakill orcl 2156
Kill of thread id 2156 in instance orcl successfully signalled.

SQL>
.
[/php]
cpu_100.jpg
oracle.jpg
thread.jpg
认证徽章
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
发表于 2007-10-22 09:00 | 显示全部楼层
1. 在取到SQL执行计划时,应该顺手取出sqltext

2。后面的演示为什么不用set autotrace on ?
执行计划,logical/phyiscal read , sorting 信息基本的有了,当然,加上set timing on , 基本就全了

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2007-10-22 09:33 | 显示全部楼层
[php]
OPERATION       OPTIONS    OBJ       COST CARDINALITY   CPU_COST    IO_COST
--------------- ---------- --- ---------- ----------- ---------- ----------
SELECT STATEMEN                       304
T

SORT            AGGREGATE                           1
HASH JOIN                             304      440182  116827541        297
TABLE ACCESS    FULL       T5          42       11592    3481172         42
INDEX           FAST FULL  IDX        259      440252   59287306        255
                SCAN       _T3
                           _OB
                           JID
----
[/php]
这个应该是最优的吧

使用道具 举报

回复
认证徽章
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
发表于 2007-10-22 09:47 | 显示全部楼层
最初由 rollingpig 发布
[B]1. 在取到SQL执行计划时,应该顺手取出sqltext

2。后面的演示为什么不用set autotrace on ?
执行计划,logical/phyiscal read , sorting 信息基本的有了,当然,加上set timing on , 基本就全了 [/B]


多谢指教!
1 取出执行计划时当时也想把sqltext显示出来,后来一想我上面跑的就是这条sql,紧接着通过这条sql text来找了sql_id,后来又通过sql_id来查看execute plan,显示sql_text似乎有些多余,还有一个原因是显示sql_text之后sqlplus中当时没有控制好格式有些乱后来拿掉了
2 开始是设置了set autotrace on 它的,因为跑那条大的sql,一直在执行,看不到结果和计划,所以我查了v$sql_plan;其实后来的演示直接都能很快的执行完,确实应该通过set autotrace on来演示,那样效果可能会更好,看的更直接,当时思维有些定式

使用道具 举报

回复
认证徽章
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
发表于 2007-10-22 09:54 | 显示全部楼层
呵呵……

使用道具 举报

回复
论坛徽章:
5
生肖徽章:羊
日期:2007-03-07 12:30:09会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-19 14:18:16授权会员
日期:2007-10-19 14:14:50ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2007-10-22 10:18 | 显示全部楼层
还行,
1 根据CPU占用资源找出spid
2 然后spid找出有问题的sql
3 然后优化sql,然后在测试对比

2楼说的好,最好使用sql trace,有执行计划、执行成本还有统计信息还是不错。

使用道具 举报

回复
论坛徽章:
5
生肖徽章:羊
日期:2007-03-07 12:30:09会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-19 14:18:16授权会员
日期:2007-10-19 14:14:50ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2007-10-22 10:19 | 显示全部楼层
lz还是善于实践呢

使用道具 举报

回复
认证徽章
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
发表于 2007-10-22 10:19 | 显示全部楼层
最初由 anlinew 发布
[B][php]
OPERATION       OPTIONS    OBJ       COST CARDINALITY   CPU_COST    IO_COST
--------------- ---------- --- ---------- ----------- ---------- ----------
SELECT STATEMEN                       304
T

SORT            AGGREGATE                           1
HASH JOIN                             304      440182  116827541        297
TABLE ACCESS    FULL       T5          42       11592    3481172         42
INDEX           FAST FULL  IDX        259      440252   59287306        255
                SCAN       _T3
                           _OB
                           JID
----
[/php]
这个应该是最优的吧 [/B]

我上面的一些演示确实它是最优的,但是我们看到t5上是full scan,t5的数据量不大:只有11592条记录,如果t5的数据量大的话,可以考虑在t5.object_id上也创建一个index,相信那样会更好,试验证明也是这样的
[php]
C:\>sqlplus xys/manager

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 10月 22 09:49:35 2007

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> create index idx_t3_objid on t3(object_id);

索引已创建。

SQL> set autotrace on
SQL> set time on
10:02:11 SQL> set timing on
10:02:14 SQL> select count(*) from t3,t5 where t3.object_id=t5.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 00.73

执行计划
----------------------------------------------------------
Plan hash value: 981120180

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

-------

| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Tim

e     |

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

-------

|   0 | SELECT STATEMENT       |              |     1 |    10 |   304   (3)| 00:

00:04 |

|   1 |  SORT AGGREGATE        |              |     1 |    10 |            |
      |

|*  2 |   HASH JOIN            |              |   440K|  4298K|   304   (3)| 00:

00:04 |

|   3 |    TABLE ACCESS FULL   | T5           | 11592 | 57960 |    42   (0)| 00:

00:01 |

|   4 |    INDEX FAST FULL SCAN| IDX_T3_OBJID |   440K|  2149K|   259   (2)| 00:

00:04 |

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

-------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T3"."OBJECT_ID"="T5"."OBJECT_ID"


统计信息
----------------------------------------------------------
        254  recursive calls
          0  db block gets
       1123  consistent gets
       1085  physical reads
          0  redo size
        410  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          4  sorts (memory)
          0  sorts (disk)
          1  rows processed

10:05:09 SQL> select count(*) from t3,t5 where t3.object_id=t5.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 00.45

执行计划
----------------------------------------------------------
Plan hash value: 981120180

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

-------

| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Tim

e     |

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

-------

|   0 | SELECT STATEMENT       |              |     1 |    10 |   304   (3)| 00:

00:04 |

|   1 |  SORT AGGREGATE        |              |     1 |    10 |            |
      |

|*  2 |   HASH JOIN            |              |   440K|  4298K|   304   (3)| 00:

00:04 |

|   3 |    TABLE ACCESS FULL   | T5           | 11592 | 57960 |    42   (0)| 00:

00:01 |

|   4 |    INDEX FAST FULL SCAN| IDX_T3_OBJID |   440K|  2149K|   259   (2)| 00:

00:04 |

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

-------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T3"."OBJECT_ID"="T5"."OBJECT_ID"


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       1094  consistent gets
          0  physical reads
          0  redo size
        410  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

10:05:24 SQL> create index idx_t5_objid on t5(object_id);

索引已创建。

已用时间:  00: 00: 00.07
10:07:00 SQL> select count(*) from t3,t5 where t3.object_id=t5.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 00.26

执行计划
----------------------------------------------------------
Plan hash value: 3678458877

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

-------

| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Tim

e     |

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

-------

|   0 | SELECT STATEMENT       |              |     1 |    10 |   271   (3)| 00:

00:04 |

|   1 |  SORT AGGREGATE        |              |     1 |    10 |            |
      |

|*  2 |   HASH JOIN            |              |   440K|  4298K|   271   (3)| 00:

00:04 |

|   3 |    INDEX FAST FULL SCAN| IDX_T5_OBJID | 11592 | 57960 |     9   (0)| 00:

00:01 |

|   4 |    INDEX FAST FULL SCAN| IDX_T3_OBJID |   440K|  2149K|   259   (2)| 00:

00:04 |

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

-------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T3"."OBJECT_ID"="T5"."OBJECT_ID"


统计信息
----------------------------------------------------------
         15  recursive calls
          0  db block gets
        977  consistent gets
         25  physical reads
          0  redo size
        410  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

10:07:05 SQL> select count(*) from t3,t5 where t3.object_id=t5.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 00.42

执行计划
----------------------------------------------------------
Plan hash value: 3678458877

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

-------

| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Tim

e     |

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

-------

|   0 | SELECT STATEMENT       |              |     1 |    10 |   271   (3)| 00:

00:04 |

|   1 |  SORT AGGREGATE        |              |     1 |    10 |            |
      |

|*  2 |   HASH JOIN            |              |   440K|  4298K|   271   (3)| 00:

00:04 |

|   3 |    INDEX FAST FULL SCAN| IDX_T5_OBJID | 11592 | 57960 |     9   (0)| 00:

00:01 |

|   4 |    INDEX FAST FULL SCAN| IDX_T3_OBJID |   440K|  2149K|   259   (2)| 00:

00:04 |

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

-------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T3"."OBJECT_ID"="T5"."OBJECT_ID"


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        974  consistent gets
          0  physical reads
          0  redo size
        410  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

10:10:59 SQL>
10:05:24 SQL> create index idx_t5_objid on t5(object_id);

索引已创建。

已用时间:  00: 00: 00.07
10:07:00 SQL> select count(*) from t3,t5 where t3.object_id=t5.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 00.26

执行计划
----------------------------------------------------------
Plan hash value: 3678458877

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

-------

| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Tim

e     |

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

-------

|   0 | SELECT STATEMENT       |              |     1 |    10 |   271   (3)| 00:

00:04 |

|   1 |  SORT AGGREGATE        |              |     1 |    10 |            |
      |

|*  2 |   HASH JOIN            |              |   440K|  4298K|   271   (3)| 00:

00:04 |

|   3 |    INDEX FAST FULL SCAN| IDX_T5_OBJID | 11592 | 57960 |     9   (0)| 00:

00:01 |

|   4 |    INDEX FAST FULL SCAN| IDX_T3_OBJID |   440K|  2149K|   259   (2)| 00:

00:04 |

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

-------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T3"."OBJECT_ID"="T5"."OBJECT_ID"


统计信息
----------------------------------------------------------
         15  recursive calls
          0  db block gets
        977  consistent gets
         25  physical reads
          0  redo size
        410  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

10:07:05 SQL> select count(*) from t3,t5 where t3.object_id=t5.object_id;

  COUNT(*)
----------
    428914

已用时间:  00: 00: 00.42

执行计划
----------------------------------------------------------
Plan hash value: 3678458877

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

-------

| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Tim

e     |

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

-------

|   0 | SELECT STATEMENT       |              |     1 |    10 |   271   (3)| 00:

00:04 |

|   1 |  SORT AGGREGATE        |              |     1 |    10 |            |
      |

|*  2 |   HASH JOIN            |              |   440K|  4298K|   271   (3)| 00:

00:04 |

|   3 |    INDEX FAST FULL SCAN| IDX_T5_OBJID | 11592 | 57960 |     9   (0)| 00:

00:01 |

|   4 |    INDEX FAST FULL SCAN| IDX_T3_OBJID |   440K|  2149K|   259   (2)| 00:

00:04 |

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

-------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T3"."OBJECT_ID"="T5"."OBJECT_ID"


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        974  consistent gets
          0  physical reads
          0  redo size
        410  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

.
[/php]

使用道具 举报

回复
论坛徽章:
5
生肖徽章:羊
日期:2007-03-07 12:30:09会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-19 14:18:16授权会员
日期:2007-10-19 14:14:50ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2007-10-22 10:22 | 显示全部楼层
不错

整的挺好

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2007-10-22 10:31 | 显示全部楼层
实验有余,理论不足
应该先有理论知识及通过理论知识得出的结果,然后再通过实验来验证
这样目的性及知识性更强一些
如果受众基础不是很好,单看实验,很可能被误导

个人看法

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

PostgreSQL中国大会,参会票抢购!

由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。
----------------------------------------
时间:2019年11月29~11月30日

点击报名>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表