发表于: 2008.04.09 23:53
分类: ORACLE , Bug
出处: http://yangtingkun.itpub.net/post/468/459447
---------------------------------------------------------------
在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以前版本都可能发生这个问题。Oracle在11.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_ORGID和PLAT_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造成影响,需要在测试环境中详细测试后,才能进行添加。











