yangtingkun
===========================================================
ORA-7445(qkabxo)错误
===========================================================

10203 for Linux X86-64上又碰到一个ORA-7445错误。


错误日志中的信息为:

Errors in file /data/oracle/admin/shandong/udump/shandong_ora_3202.trc:
ORA-07445: exception encountered: core dump [qkabxo()+15] [SIGSEGV] [Address not mapped to object] [0x000000000] [] []

由于错误SQL比较复杂,将问题SQL尽量的简化,得到最终错误SQL如下:

SQL> EXPLAIN PLAN FOR
2 SELECT /*+ FIRST_ROWS */ *
3 FROM
4 (
5 SELECT ROWNUM ROW_NUM, A.*
6 FROM
7 (
8 SELECT
9 SALER.ORG_NAME SALER_NAME
10 FROM INF_SALER SALER ,
11 INF_ENTER_COMM_TEMP C,
12 INF_PRODUCT P,
13 INF_SALER FACTORY ,
14 INF_ENTER_COMM_PROPERTY COMMP
15 WHERE P.PRODUCT_ID=C.PRODUCT_ID
16 AND P.FACTORY_ID=FACTORY.ORG_ID
17 AND C.SALER_ORGID=SALER.ORG_ID
18 AND C.COMM_TEMP_ID=COMMP.COMM_ID
19 AND BID_SUBMIT='1'
20 AND C.PLAT_ID=15
21 AND C.ENABLE_FLAG = '1'
22 AND C.ZB_TYPE='Y'
23 AND SALER_ORGID='110090'
24 ORDER BY CHECK_STATE_BID
25 ) A
26 WHERE ROWNUM <= 10
27 )
28 WHERE ROW_NUM >= 1
29 ;
ERROR:
ORA-03114: not connected to ORACLE


EXPLAIN PLAN FOR
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel

随便对这个SQL进行任意的简化,都无法重现问题。不要说从SQL中去掉一张表,就是去掉排序语句,或者去掉任意一个条件限制语句都无法重现问题。

根据metalink文档的描述,这个问题应该是FIRST_ROWS优化模式下,执行计划中产生了BITMAP INDEX访问路径造成的。

首先这是一个分页SQL,包含了FIRST_ROWS提示,而且上面SQL语句中一个表包含多个限制条件,正好为产生BITMAP索引的执行计划构造了条件。因此从这一点上将还是和BUG中描述十分解决的,唯一需要补充的是这个问题和ORDER BY还有一定的关系,而且问题发生在分析阶段,而不是执行阶段。

关于这个bug的详细描述,可以参考Doc ID: Note:4917682.8

本测试发生在10203,似乎11g以前版本都可能发生这个问题。Oracle11.1.0.6中解决了这个bug

而最简单的临时解决问题的方法就是将FIRST_ROWS提示改为ALL_ROWS

SQL> EXPLAIN PLAN FOR
2 SELECT /*+ ALL_ROWS */ *
3 FROM
4 (
5 SELECT ROWNUM ROW_NUM, A.*
6 FROM
7 (
8 SELECT
9 SALER.ORG_NAME SALER_NAME
10 FROM INF_SALER SALER ,
11 INF_ENTER_COMM_TEMP C,
12 INF_PRODUCT P,
13 INF_SALER FACTORY ,
14 INF_ENTER_COMM_PROPERTY COMMP
15 WHERE P.PRODUCT_ID=C.PRODUCT_ID
16 AND P.FACTORY_ID=FACTORY.ORG_ID
17 AND C.SALER_ORGID=SALER.ORG_ID
18 AND C.COMM_TEMP_ID=COMMP.COMM_ID
19 AND BID_SUBMIT='1'
20 AND C.PLAT_ID=15
21 AND C.ENABLE_FLAG = '1'
22 AND C.ZB_TYPE='Y'
23 AND SALER_ORGID='110090'
24 ORDER BY CHECK_STATE_BID
25 ) A
26 WHERE ROWNUM <= 10
27 )
28 WHERE ROW_NUM >= 1
29 ;

Explained.

不过这样会带来一定的性能开销,毕竟ALL_ROWS不适合分页查询。

当然,这里也可以创建一个SALER_ORGIDPLAT_ID的组合索引,来避免执行计划中出现BITMAP索引访问路径:

SQL> CREATE INDEX IND_COMM_TEMP_SALER_PLAT ON INF_ENTER_COMM_TEMP (SALER_ORGID, PLAT_ID);

Index created.

SQL> EXPLAIN PLAN FOR
2 SELECT /*+ FIRST_ROWS */ *
3 FROM
4 (
5 SELECT ROWNUM ROW_NUM, A.*
6 FROM
7 (
8 SELECT
9 SALER.ORG_NAME SALER_NAME
10 FROM INF_SALER SALER ,
11 INF_ENTER_COMM_TEMP C,
12 INF_PRODUCT P,
13 INF_SALER FACTORY ,
14 INF_ENTER_COMM_PROPERTY COMMP
15 WHERE P.PRODUCT_ID=C.PRODUCT_ID
16 AND P.FACTORY_ID=FACTORY.ORG_ID
17 AND C.SALER_ORGID=SALER.ORG_ID
18 AND C.COMM_TEMP_ID=COMMP.COMM_ID
19 AND BID_SUBMIT='1'
20 AND C.PLAT_ID=15
21 AND C.ENABLE_FLAG = '1'
22 AND C.ZB_TYPE='Y'
23 AND SALER_ORGID='110090'
24 ORDER BY CHECK_STATE_BID
25 ) A
26 WHERE ROWNUM <= 10
27 )
28 WHERE ROW_NUM >= 1
29 ;

Explained.

这种方法的好处是不需要修改SQL,还能提供这个SQL的性能,缺点是可能会对数据库中运行的其他SQL造成影响,需要在测试环境中详细测试后,才能进行添加。

yangtingkun 发表于:2008.04.09 23:53 ::分类: ( ORACLE , Bug ) ::阅读:(469次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...