免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5575 | 回复: 9

求助:SQL执行计划不同,为什么? [复制链接]

论坛徽章:
0
发表于 2010-03-08 09:28 |显示全部楼层
本帖最后由 taoyoyo 于 2010-03-11 08:56 编辑

我们单位原来用的是8i,现在准备升级到10g。
我装好了正在测试。

现在发现一个问题,就是在新数据库(10g)中,在PL/SQL中执行一条SQL时,初始化时间特别长……
就是点击执行后,下面的状态会显示:“Intializing……”,这个过程就很长。在原有的DB(oracle8i)就很快!
不知道为什么。(是在执行的)

后来对比原来的数据库,发现执行计划时optimizer goal不同。
8i : optimizer goal= choose
10gptimizer goal=all rows
(就是在PL/SQL中选中一条SQL,然后按F5,在解释窗口上方的组合框)

以为找到了问题,于是用以下语句修改:
ALTER system SET OPTIMIZER_MODE = CHOOSE

这次,10g中也显示optimizer goal= choose了。
但初始化时间依然很长。

进一步对比发现,新旧DB中使用的索引也不一样,如下图:
10中还是用了全表扫描……
(这只是举个例子,查询其他的表也一样,但两个DB中的表和索引是完全一样的,数据也差不太多)

Oracle8i和10g中的执行计划不同?

Oracle8i和10g中的执行计划不同?


另外,还有一个发现,就是旧DB中查询出的结果都是按索引排好序的, 但新DB(10g)中未按索引排序……

请大家帮忙分析一下,这个是什么原因,应该怎么调整……

附件是10gDB的参数表,请参考! 10g_parameter.rar (21.08 KB, 下载次数: 31)
20100308092729015.jpg

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
发表于 2010-03-08 09:52 |显示全部楼层
重新收集下统计信息再看看吧

论坛徽章:
0
发表于 2010-03-08 10:25 |显示全部楼层
收集什么信息呢,怎么收集?

请再指点一下啊!

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
发表于 2010-03-08 10:52 |显示全部楼层
就是分析下表啦

analyze table xxx compute statistics;

如果表很大的话,就抽样分析吧,30%还嫌大的话也可以改小点,当然如果数据分布不均匀的话,抽样分析就不是很好了:

analyze table xxx estimate statistics sample 30 percent;

也可以用系统自带的dbms_stats包来收集

论坛徽章:
0
发表于 2010-03-08 11:32 |显示全部楼层
这个好象和表关系不大……
查询任何表都不一样……

论坛徽章:
0
发表于 2010-03-08 12:04 |显示全部楼层
看看那个uniq index的状态是否ok,或者enable

不行,就加hint试试看喽

论坛徽章:
0
发表于 2010-03-09 10:34 |显示全部楼层
索引是有效的:

SQL> select table_name,index_name,status  from DBA_indexes  where  INDEX_name ='
PK_POORDR';

TABLE_NAME           INDEX_NAME           STATUS
-------------------- -------------------- --------
POORDR               PK_POORDR            VALID

论坛徽章:
0
发表于 2010-03-09 16:28 |显示全部楼层
楼主先进行表的分析,然后查看执行计划

论坛徽章:
0
发表于 2010-03-11 08:56 |显示全部楼层
大家帮帮忙啊~

论坛徽章:
0
发表于 2010-03-12 09:03 |显示全部楼层
最近做了如下测试:
1,将10g中的optimizer_mode修改为All_rows(原为choose)
2,然后比较10g和8i中同一SQL语句的执行计划

1,将10g中的optimizer_mode修改为All_rows(原为choose)

  1. SQL> alter system set optimizer_mode=all_rows;

  2. 系统已更改。

  3. SQL> show parameter optimizer

  4. NAME                                 TYPE    VALUE
  5. ------------------------------------ ------- ------------------------------
  6. optimizer_dynamic_sampling           integer 2
  7. optimizer_features_enable            string  10.2.0.1
  8. optimizer_index_caching              integer 0
  9. optimizer_index_cost_adj             integer 100
  10. optimizer_mode                       string  ALL_ROWS
  11. optimizer_secure_view_merging        boolean TRUE

  12. SQL>
复制代码
2,比较10g和8i中同一SQL语句的执行计划
10g中的执行计划:
  1. SQL> set autotrace on
  2. SQL> set autotrace traceonly
  3. SQL> set timing on

  4. SQL> select * from cmdba.cmcdms;

  5. 已选择3327行。

  6. 已用时间:  00: 00: 09.04

  7. Execution Plan
  8. ----------------------------------------------------------
  9.    0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=9 Card=3327 Bytes=
  10.           236217)

  11.    1    0   TABLE ACCESS (FULL) OF 'CMCDMS' (TABLE) (Cost=9 Card=3327
  12.           Bytes=236217)

  13. Statistics
  14. ----------------------------------------------------------
  15.           0  recursive calls
  16.           0  db block gets
  17.         256  consistent gets
  18.           0  physical reads
  19.           0  redo size
  20.      351787  bytes sent via SQL*Net to client
  21.       24956  bytes received via SQL*Net from client
  22.         446  SQL*Net roundtrips to/from client
  23.           0  sorts (memory)
  24.           0  sorts (disk)
  25.        3327  rows processed

  26. SQL>
复制代码
8i中的执行计划:
  1. SQL> set autotrace on
  2. SQL> set autotrace traceonly
  3. SQL> set timing on
  4. SQL> select * from cmdba.cmcdms;

  5. 已选择3330行。

  6. 已用时间:  00: 00: 01.56

  7. Execution Plan
  8. ----------------------------------------------------------
  9.    0      SELECT STATEMENT Optimizer=CHOOSE
  10.    1    0   TABLE ACCESS (FULL) OF 'CMCDMS'

  11. Statistics
  12. ----------------------------------------------------------
  13.           0  recursive calls
  14.           4  db block gets
  15.         367  consistent gets
  16.           0  physical reads
  17.           0  redo size
  18.      349893  bytes sent via SQL*Net to client
  19.       24956  bytes received via SQL*Net from client
  20.         223  SQL*Net roundtrips to/from client
  21.           0  sorts (memory)
  22.           0  sorts (disk)
  23.        3330  rows processed

  24. SQL>
复制代码
对于执行计划,不是很懂,各位高手,是否能给看一下,是否能看出点问题!

还要说明一点:8i的DB是当前使用的,有负载,10g的还没有使用,只是测试,没有负载!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP