sundog315
===========================================================
EXP直接导出压缩问津,IMP直接导入压缩文件的方法
===========================================================

在10G之前,甚至在10G的Oracle环境中,有很多数据量不大,重要性不太高的系统依然采用EXP/IMP逻辑导出备份方式,或者,作为辅助备份方式。
通常情况下,我们都是这样操作的:
1.exp导出
2.gzip压缩
3.gzip解压
4.imp导入

这样操作有如下两个不好的地方:
1.占用大量磁盘空间,磁盘剩余空间必须大于导出的,未压缩的文件大小加上压缩后的文件大小。如果设置计划任务,每日定时导出的话,很有可能因为磁盘空间不足导致备份失败。由于这种备份方式磁盘使用率的剧烈抖动,即使有监控工具,也不能很好的提供趋势分析
2.系统资源浪费,在导出时,大部分都在等待IO。而压缩时,又大部分等待CPU,整体利用率不高。

那么,有没有办法直接导出成压缩文件?并直接从压缩文件导入呢?

EXP导出:
$ mknod p p

$ gzip < p > test.dmp.gz & exp system/xxxx tables=TEST buffer=31457280 CONSISTENT=Y COMPRESS=N file=p
[3] 24532

Export: Release 10.2.0.5.0 - Production on 星期四 1月 19 10:27:45 2012

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


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, Data Mining and Real Application Testing options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即将导出指定的表通过常规路径...
当前的用户已更改为 SYSTEM
. . 正在导出表 TEST导出了 1875063 行
成功终止导出, 没有出现警告。
[1] Done gzip < p > test.dmp.gz
[2]- Done gzip < p > test.dmp.gz
[3]+ Done gzip < p > test.dmp.gz

$ rm -rf p

IMP导入:
$ mknod p p

$ gunzip < test.dmp.gz > p & imp system/xxx file=p full=y buffer=31457280
[2] 24572

Import: Release 10.2.0.5.0 - Production on 星期四 1月 19 10:29:16 2012

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


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, Data Mining and Real Application Testing options

经由常规路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 SYSTEM 的对象导入到 SYSTEM
. . 正在导入表 "TEST"导入了 1875063 行
成功终止导入, 没有出现警告。
[1] Done gzip < p > test.dmp.gz
[2]+ Done gunzip < test.dmp.gz > p

 查看全文
sundog315 发表于:2012.01.19 10:33 ::分类: ( Oracle ) ::阅读:(17次) :: Permanent link
===========================================================
一个简单的问题,查了半个小时,记录一下
===========================================================

Unable To Connect To ASM Due To SQL*Plus Shows “Connected To An Idle Instance. [ID 1179825.1]

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

修改时间 30-SEP-2010 类型 PROBLEM 状态 PUBLISHED

In this Document
Symptoms
Cause
Solution

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

Applies to:
Oracle Server - Enterprise Edition - Version: 10.2.0.1 to 11.2.0.2 - Release: 10.2 to 11.2
Information in this document applies to any platform.

Symptoms

1) On a new ASM installation/configuration (Standalone or RAC) you are not able to connect to the ASM instance due to the SQL*Plus shows “Connected to an idle instance.”


[grid@dbaasm ~]$ sqlplus "/as sysasm"

SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 18 09:20:55 2010

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

Connected to an idle instance.

2) You confirmed the ASM installation/configuration successfully completed.

3) Also, the ASM instance is up and running:


[grid@dbaasm ~]$ ps -fea | grep asm_
grid 9226 1 0 Aug11 ? 00:00:00 asm_asmb_+ASM
grid 27656 1 0 May14 ? 00:02:41 asm_pmon_+ASM
grid 27658 1 0 May14 ? 00:00:00 asm_vktm_+ASM
grid 27662 1 0 May14 ? 00:00:01 asm_gen0_+ASM
grid 27664 1 0 May14 ? 00:00:13 asm_diag_+ASM
grid 27666 1 0 May14 ? 00:00:02 asm_psp0_+ASM
grid 27668 1 0 May14 ? 00:45:27 asm_dia0_+ASM
grid 27670 1 0 May14 ? 00:00:03 asm_mman_+ASM
grid 27672 1 0 May14 ? 00:00:05 asm_dbw0_+ASM
grid 27674 1 0 May14 ? 00:00:05 asm_lgwr_+ASM
grid 27676 1 0 May14 ? 00:00:03 asm_ckpt_+ASM
grid 27678 1 0 May14 ? 00:00:06 asm_smon_+ASM
grid 27680 1 0 May14 ? 00:00:07 asm_rbal_+ASM
grid 27682 1 0 May14 ? 00:12:19 asm_gmon_+ASM
grid 27684 1 0 May14 ? 00:00:06 asm_mmon_+ASM
grid 27686 1 0 May14 ? 00:00:50 asm_mmnl_+ASM
grid 28051 1 0 May18 ? 00:00:00 asm_vbg0_+ASM
grid 28306 1 0 May18 ? 00:05:32 asm_vdbg_+ASM
grid 28308 1 0 May18 ? 00:00:00 asm_vmb0_+ASM
grid 28310 1 0 May18 ? 00:00:00 asm_vbg1_+ASM
grid 28312 1 0 May18 ? 00:00:00 asm_vbg2_+ASM

4) You started the ASM instance with the same OS user used to install the ASM Oracle Home (10gR2 or 11gR1) or Grid Infrastructure Home (11gR2), so this is OK.

Cause
1) The environment variables are set as follow:


[grid@dbaasm ~]$ env | grep ORA
ORACLE_SID=+ASM
ORACLE_BASE=/u01/app/grid
ORACLE_HOME=/u01/app/grid/product/11.2.0/grid/

2) The problem is due to the ORACLE_HOME variable has an extra ‘/’ at the end of the full path:


ORACLE_HOME=/u01/app/grid/product/11.2.0/grid/ <(====


Solution
Remove the extra ‘/’ at the end of the full path, then you will be able to connect to the ASM instance:

[grid@dbaasm ~]$ export ORACLE_HOME=/u01/app/grid/product/11.2.0/grid
[grid@dbaasm ~]$ echo $ORACLE_HOME
/u01/app/grid/product/11.2.0/grid
[grid@dbaasm ~]$ sqlplus "/as sysasm"

SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 18 09:27:20 2010

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Automatic Storage Management option


SQL> show parameter instance_name

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string +ASM


 查看全文
sundog315 发表于:2011.12.29 11:35 ::分类: ( Oracle ) ::阅读:(45次) :: Permanent link
===========================================================
vip/public ip断网,导致instance crash
===========================================================
Oracle 10.2.0.1 HP-UX 11.31 ia64

alert.log:

Mon Dec 26 14:11:16 2011
Shutting down instance (abort)
License high water mark = 486
Instance terminated by USER, pid = 1675
syslog:
Dec 26 14:10:14 wandadb1 cmnetd[29338]: lan0 is down at the data link layer.
Dec 26 14:10:14 wandadb1 cmnetd[29338]: lan0 failed.
Dec 26 14:10:14 wandadb1 cmnetd[29338]: Subnet 10.0.4.0 down
Dec 26 14:10:36 wandadb1 cmnetd[29338]: lan0 is up at the data link layer.
Dec 26 14:10:36 wandadb1 cmnetd[29338]: lan0 recovered.
Dec 26 14:10:36 wandadb1 cmnetd[29338]: Subnet 10.0.4.0 up
Dec 26 14:10:42 wandadb1 cmnetd[29338]: 10.0.4.161 failed.
Dec 26 14:10:42 wandadb1 cmnetd[29338]: lan0 is down at the IP layer.
Dec 26 14:10:42 wandadb1 cmnetd[29338]: lan0 failed.
Dec 26 14:10:42 wandadb1 cmnetd[29338]: Subnet 10.0.4.0 down
Dec 26 14:10:56 wandadb1 cmnetd[29338]: lan0 is down at the data link layer.
Dec 26 14:11:58 wandadb1 cmnetd[29338]: lan0 is up at the data link layer.
Dec 26 14:11:58 wandadb1 cmnetd[29338]: lan0 is still down at the IP layer.
Dec 26 14:12:04 wandadb1 cmnetd[29338]: 10.0.4.161 recovered.
Dec 26 14:12:04 wandadb1 cmnetd[29338]: Subnet 10.0.4.0 up
Dec 26 14:12:04 wandadb1 cmnetd[29338]: lan0 is up at the IP layer.
Dec 26 14:12:04 wandadb1 cmnetd[29338]: lan0 recovered.

crsd.log
2011-12-26 14:11:08.785: [ CRSAPP][4060] CheckResource error for ora.wandadb1.vip error code = 1
2011-12-26 14:11:08.792: [ CRSRES][4060] In stateChanged, ora.wandadb1.vip target is ONLINE
2011-12-26 14:11:08.793: [ CRSRES][4060] ora.wandadb1.vip on wandadb1 went OFFLINE unexpectedly
2011-12-26 14:11:08.793: [ CRSRES][4060] StopResource: setting CLI values
2011-12-26 14:11:08.817: [ CRSRES][4060] Attempting to stop `ora.wandadb1.vip` on member `wandadb1`
2011-12-26 14:11:09.348: [ CRSRES][4060] Stop of `ora.wandadb1.vip` on member `wandadb1` succeeded.
2011-12-26 14:11:09.349: [ CRSRES][4060] ora.wandadb1.vip RESTART_COUNT=0 RESTART_ATTEMPTS=0
2011-12-26 14:11:09.357: [ CRSRES][4060] ora.wandadb1.vip failed on wandadb1 relocating.
2011-12-26 14:11:09.455: [ CRSRES][4060] StopResource: setting CLI values
2011-12-26 14:11:09.458: [ CRSRES][4060] Attempting to stop `ora.wandadb1.LISTENER_WANDADB1.lsnr` on member `wandadb1`
2011-12-26 14:11:09.680: [ OCRSRV][29]th_select_handler: Failed to retrieve procctx from ht. constr = [44541328] retval lht [-27] Signal CV.
2011-12-26 14:11:10.040: [ CRSRES][4060] Stop of `ora.wandadb1.LISTENER_WANDADB1.lsnr` on member `wandadb1` succeeded.
2011-12-26 14:11:10.041: [ CRSRES][4060] StopResource: setting CLI values
2011-12-26 14:11:10.047: [ CRSRES][4060] Attempting to stop `ora.ufsa8.ufsa81.inst` on member `wandadb1`
2011-12-26 14:11:24.934: [ CRSRES][4060] Stop of `ora.ufsa8.ufsa81.inst` on member `wandadb1` succeeded.

Should the Database Instance Be Brought Down after VIP service crashes? [ID 391454.1]
 查看全文
sundog315 发表于:2011.12.27 07:53 ::分类: ( Oracle ) ::阅读:(48次) :: Permanent link
===========================================================
通过Database Link/IMPDP,同步10G、11G数据库失败
===========================================================

源库10.2.0.1,目标库11.2.0.3

impdp system/"xxxx" network_link=wdyx_prod schemas=wd_web,wanda parallel=4 TABLE_EXISTS_ACTION=REPLACE directory=dumpdir logfile=wdyx_trans.log VERSION=10.2

Import: Release 11.2.0.3.0 - Production on Tue Dec 20 23:13:02 2011

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning option
ORA-39006: internal error
ORA-39113: Unable to determine database version
ORA-04052: error occurred when looking up remote object SYS.DBMS_UTILITY@WDYX_PROD
ORA-00604: error occurred at recursive SQL level 3
ORA-06544: PL/SQL: internal error, arguments: [55916], [], [], [], [], [], [], []
ORA-06553: PLS-801: internal error [55916]
ORA-02063: preceding 2 lines from WDYX_PROD

ORA-39097: Data Pump job encountered unexpected error -4052

 查看全文
sundog315 发表于:2011.12.20 16:25 ::分类: ( Oracle ) ::阅读:(53次) :: Permanent link
===========================================================
接上条,问题可能是Oracle新出的BUG
===========================================================
11.2.0.3 VIP/SCAN VIP is Not Pingable After Failover Leads to Connection Issue (Doc ID 1379498.1) 查看全文
sundog315 发表于:2011.12.20 16:24 ::分类: ( Oracle ) ::阅读:(55次) :: Permanent link
===========================================================
诡异的事情,RAC,public ip通,vip不通
===========================================================

一台Linux 11GR2

public vip scan 均在10.199.88.0网段,服务器启动后,从服务器本身或者10.199.88.0网段的其他服务器看,均正常。

在10.199.88.0网段外看这个RAC坏境,public ip是通的,但是,vip scan都不通。

在这两台RAC服务器上使用

/sbin/arping -s vip gateway

后,所有的网段看到RAC的状态都正常了。

原因待查

 查看全文
sundog315 发表于:2011.12.15 06:21 ::分类: ( Oracle ) ::阅读:(63次) :: Permanent link
===========================================================
Linux 服务器设置网卡绑定
===========================================================

记录一下,以防忘记

1.创建/etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=10.199.88.13
GATEWAY=10.199.88.1
USERCTL=no
IPV6INIT=no

2.修改ifcfg-eth0 ifcfg-eth1

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
MASTER=bond0
USERCTL=no
IPV6INIT=no


DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
MASTER=bond0
USERCTL=no
IPV6INIT=no

3.修改/etc/modprobe.conf,添加

alias bond0 bonding
options bond0 miimon=100 mode=0

mode=0 负载均衡

mode=1 HA

4.修改/etc/rc.local,添加

ifenslave bond0 eth0 eth1


需重启服务器,最好禁用sendmail


sundog315 发表于:2011.12.14 18:09 ::分类: ( Linux ) ::阅读:(61次) :: Permanent link
===========================================================
session一直等待kksfbc child completion事件
===========================================================

HP-UX 11.31

Oracle 10.2.0.1 RAC

其中一个session的等待事件一直为kksfbc child completion,查询了一下,有可能是个BUG

Bug 6795880,相关的doc id为:6795880.8

A session may go into an infinite spin just after a wait for 'kksfbc child completion'. The spin occurs with a stack including kksSearchChildList -> kkshgnc where kksSearchChildList loops forever.
This problem can also lead to internal error such as any of
ORA-600 [kksSearchChildList1], ORA-600 [kksSearchChildList2]
ORA-600 [kksSearchChildList3], ORA-600 [kkshgnc-nextchild]
Note:
Fixes for this bug in 10g and 11gR1 are disabled by default.
To enable this fix you must explicitly set the following parameter for instance startup:
"_cursor_features_enabled" = 10

sundog315 发表于:2011.12.14 18:06 ::分类: ( Oracle ) ::阅读:(64次) :: Permanent link
===========================================================
遭遇Bug 4414666 OERI[KGHALO4] can occur on NUMA
===========================================================

一个多灾多难的系统:)

HP-UX 11.31 IA64 Oracle 10.2.0.1 两节点RAC

数据库集群自动重启,检查alert文件,报ORA-00600错误

Mon Nov 14 15:43:53 2011
Errors in file /u01/app/oracle/admin/ufsa8/udump/ufsa81_ora_4531.trc:
ORA-00600: internal error code, arguments: [KGHALO4], [0xC0000000BD0CD060], [], [], [], [], [], []
Mon Nov 14 15:43:58 2011
Trace dumping is performing id=[cdmp_20111114154358]
Mon Nov 14 15:43:58 2011
Errors in file /u01/app/oracle/admin/ufsa8/udump/ufsa81_ora_4531.trc:
ORA-00600: internal error code, arguments: [600], [], [], [], [], [], [], []

检查support.oracle.com,有不少BUG与此相关,无法马上定位具体的原因。

于是检查trace文件,在ufsa81_ora_4531.trc文件中发现:

 查看全文

sundog315 发表于:2011.11.14 16:29 ::分类: ( Oracle ) ::阅读:(115次) :: Permanent link
===========================================================
诡异的HP-UX Load averages
===========================================================

Load averages可以很好的表示系统的负载情况,它统计的是CPU运行及等待队列的长度,而与CPU使用率无关。当CPU队列长度长期超过CPU数量时,表明系统CPU已超载,需调整应用或增加硬件。

对于Load averages,wikipedia有一些描述

http://en.wikipedia.org/wiki/Load_averages

在文章里,Load averages/CPU_NUM,如果这个值超过1,则代表处理器已无法及时的处理所有的请求。

但是,在HP-UX 11.31 IA64下,观察的结果却不一致。在一个16核的小机,Load averages为1.5,按照标准的计算模式,1.5/16,此服务器负载不高,处理器绰绰有余。但是,查看CPU queue时发现,此时的队列长度居然达到了25,已经过载了,而25/16,基本就是1.5,似乎这个1.5的值已经除了CPU_NUM。

于是,打800电话给HP,HP工程师似乎也不太清楚Load averages的概念,需要查一下文档。不久,打电话过来,说法与wikipedia的说法一致,但与观测到的情况不符。

大部分人都喜欢用CPU使用率来评估CPU的负载,但CPU使用率有很大的局限性,一旦满载后,值便保持在100%,超载2倍与超载20倍是无法区分的。

还需继续探究啊


sundog315 发表于:2011.11.14 10:00 ::分类: ( 杂谈 ) ::阅读:(73次) :: Permanent link
===========================================================
AIX系统慎用reboot
===========================================================

上周在生产环境做AIX 6.1.1.4 Oracle 10.2.0.1的维护操作,完毕后,按照领导的要求,重新启动服务器,为年底服务器搬迁做准备。

此服务器自2011年3月重启后,再未进行过重启操作

使用reboot命令重启了AIX,等了很久,服务器都没有重启,机房检查发现服务器已停机,开机后,又出现文件丢失的情况,幸好是双机环境,将丢失的文件从另一台服务器拷贝过来,启动正常。

重启另一台服务器时,又是停机,并且出现一个LUN无法挂载,需进行fsck,修正文件系统后,得以重新挂载

在AIX上要慎用reboot命令,需要重启时,应使用安全的重启命令shutdown -Fr

特此记录


sundog315 发表于:2011.11.14 09:54 ::分类: ( 杂谈 ) ::阅读:(157次) :: Permanent link
===========================================================
如何将一个表的数据放入指定的数据文件
===========================================================

一直以为Oracle没有这个功能,但这个观点是错误的。Oracle提供了指定表所在表空间的功能

http://www.itpub.net/thread-1507571-1-7.html

 查看全文

sundog315 发表于:2011.11.08 16:36 ::分类: ( Oracle ) ::阅读:(107次) :: Permanent link
===========================================================
Oracle 10.2.0.1添加5块投票盘
===========================================================

在之前工作中,对于一台AIX Oracle 10.2.0.1做过一次投票盘迁移,并且,投票盘数量增加至5,但添加操作完成后,导致投票盘混乱

于是,在Linux上又做了一遍,却没有重现,是否是与操作系统版本相关?

具体步骤见详细内容

 查看全文
sundog315 发表于:2011.11.08 10:27 ::分类: ( Oracle ) ::阅读:(103次) :: Permanent link
===========================================================
遭遇Bug 5766310 Bad join cardinality is in the presence of histograms
===========================================================

还是上篇提到的SQL

http://sundog315.itpub.net/post/308/524769

修改完毕后,在某一特定服务器,性能仍然存在问题,看了一下执行计划,确实是有问题的

截取相关的执行计划

35 | HASH GROUP BY | | 1 | 150 | 398 (2)| 00:00:05 | | |
|* 36 | FILTER | | | | | | | |
|* 37 | TABLE ACCESS BY INDEX ROWID | SELLPAYGOODS | 1 | 34 | 3 (0)| 00:00:01 | | |
| 38 | NESTED LOOPS | | 1 | 150 | 397 (1)| 00:00:05 | | |
| 39 | NESTED LOOPS | | 1 | 116 | 394 (1)| 00:00:05 | | |
| 40 | NESTED LOOPS | | 6 | 546 | 382 (1)| 00:00:05 | | |
| 41 | MERGE JOIN CARTESIAN | | 1 | 45 | 336 (1)| 00:00:05 | | |
|* 42 | TABLE ACCESS FULL | GOODSMFRAME | 1 | 25 | 333 (1)| 00:00:04 | | || 43 | BUFFER SORT | | 1 | 20 | 3 (0)| 00:00:01 | | |
|* 44 | TABLE ACCESS FULL | PAYMODE | 1 | 20 | 3 (0)| 00:00:01 | | |
| 45 | REMOTE | SELLDETAIL | 17 | 782 | 46 (0)| 00:00:01 | POS_DB | R->S |
| 46 | REMOTE | SELLHEAD | 1 | 25 | 2 (0)| 00:00:01 | POS_DB | R->S |
|* 47 | INDEX RANGE SCAN | PK_SELLPAYGOODS | 1 | | 2 (0)| 00:00:01 | | |

黑色部分是重要的部分,10053看一下

Column (#3): GMFMARKET(VARCHAR2)
AvgLen: 5.00 NDV: 36 Nulls: 0 Density: 3.6593e-06 Histogram: Freq #Bkts: 36 UncompBkts: 136637 EndPtVals: 36
Table: GOODSMFRAME Alias: GOODSMFRAME
Card: Original: 136637 Rounded: 1 Computed: 0.50 Non Adjusted: 0.50

而实际上,这里的数据量是1万多条,差距太大了

应该是触发了Bug 5766310 - Bad join cardinality is in the presence of histograms [ID 5766310.8]

删除直方图后,恢复了正常的执行计划

Column (#3): GMFMARKET(VARCHAR2)
AvgLen: 5.00 NDV: 36 Nulls: 0 Density: 0.027778 Table: GOODSMFRAME Alias: GOODSMFRAME
Card: Original: 136661 Rounded: 3796 Computed: 3796.14 Non Adjusted: 3796.14

 查看全文
sundog315 发表于:2011.11.03 15:34 ::分类: ( Oracle ) ::阅读:(92次) :: Permanent link
===========================================================
绑定变量,组合查询方式,导致CBO错误一例
===========================================================

生产系统,出现一个SQL,执行计划不对,SQL如下:

SELECT SDMFID GMFMFID,
'[' || TO_CHAR(TO_NUMBER(PMCODE)) || ']' || PMNAME NAME,
SUM(SPGGDMONEY * FGETINVSIGN(SHDJLB)) JE
FROM SELLHEAD, SELLDETAIL, SELLPAYGOODS, PAYMODE, GOODSMFRAME
WHERE SHBILLNO = SPGBILLNO
AND SHBILLNO = SDBILLNO
AND SDROWNO = SPGGDROW
AND SPGPMCODE = PMCODE
AND SDMFID = GMFMFID
AND SDGDID = GMFGDID
AND GMFMARKET = :as_mkt
AND SPGPMCODE <> '0500'
AND PMTYPE = '5'
AND (GMFMFID = :as_mf OR NVL(:as_mf, '#') = '#')
AND SHDATE >= TRUNC(to_date(:adt_start,'YYYY-MM-DD'))
AND SHDATE < TRUNC(to_date(:adt_end,'YYYY-MM-DD')) + 1
GROUP BY SDMFID, PMCODE, PMNAME

这里要注意的是,:as_mf 变量传递进来的值是空''。可以看到,采用了绑定变量的方式。执行计划如下:

-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Inst |IN-OUT|
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 1265 (100)| | | |
| 1 | HASH GROUP BY | | 1 | 150 | 1265 (1)| 00:00:16 | | |
|* 2 | FILTER | | | | | | | |
|* 3 | TABLE ACCESS BY INDEX ROWID| SELLPAYGOODS | 1 | 34 | 3 (0)| 00:00:01 | | |
| 4 | NESTED LOOPS | | 1 | 150 | 1264 (1)| 00:00:16 | | |
|* 5 | HASH JOIN | | 1 | 116 | 1261 (1)| 00:00:16 | | |
| 6 | REMOTE | SELLHEAD | 1101 | 27525 | 29 (0)| 00:00:01 | POS_DB | R->S |
| 7 | NESTED LOOPS | | 2160 | 191K| 1238 (1)| 00:00:15 | | |
| 8 | MERGE JOIN CARTESIAN | | 122 | 5490 | 322 (1)| 00:00:04 | | |
|* 9 | TABLE ACCESS FULL | PAYMODE | 1 | 20 | 3 (0)| 00:00:01 | | |
| 10 | BUFFER SORT | | 166 | 4150 | 319 (1)| 00:00:04 | | |
|* 11 | TABLE ACCESS FULL | GOODSMFRAME | 166 | 4150 | 319 (1)| 00:00:04 | | |
| 12 | REMOTE | SELLDETAIL | 18 | 828 | 46 (0)| 00:00:01 | POS_DB | R->S |
|* 13 | INDEX RANGE SCAN | PK_SELLPAYGOODS | 1 | | 2 (0)| 00:00:01 | | |
-----------------------------------------------------------------------------------------------------------------

这个执行计划的主要问题是粗黑体显示的NEST LOOP,而导致这里选择nest loop的主要原因是MERGE JOIN CARTESIAN 完毕后,Card只有122

看看实际的值:

SQL> SELECT count(*)
2 FROM PAYMODE, GOODSMFRAME
3 WHERE GMFMARKET = '5101'
4 AND PMTYPE = 5
5 AND (GMFMFID = '' OR NVL('', '#') = '#');

COUNT(*)
----------
93058

由于使用了变量,导致(GMFMFID = '' OR NVL('', '#') = '#')的选择度判断不正确,并且,即使进行了变量窥视,也依然如此。

解决的方式是,这里不要进行变量绑定。

SELECT SDMFID GMFMFID,
'[' || TO_CHAR(TO_NUMBER(PMCODE)) || ']' || PMNAME NAME,
SUM(SPGGDMONEY * FGETINVSIGN(SHDJLB)) JE
FROM SELLHEAD, SELLDETAIL, SELLPAYGOODS, PAYMODE, GOODSMFRAME
WHERE SHBILLNO = SPGBILLNO
AND SHBILLNO = SDBILLNO
AND SDROWNO = SPGGDROW
AND SPGPMCODE = PMCODE
AND SDMFID = GMFMFID
AND SDGDID = GMFGDID
AND GMFMARKET = :as_mkt
AND SPGPMCODE <> '0500'
AND PMTYPE = 5
AND (GMFMFID = '' OR NVL('', '#') = '#')
AND SHDATE >= TRUNC(:adt_start)
AND SHDATE < TRUNC(:adt_end) + 1
GROUP BY SDMFID, PMCODE, PMNAME

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

| Id | Operation | Name | Rows | Bytes | Cost | Inst |IN-OUT|
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 150 | 3583 | | |
| 1 | HASH GROUP BY | | 1 | 150 | 3583 | | |
| 2 | FILTER | | | | | | |
| 3 | NESTED LOOPS | | 1 | 150 | 3582 | | |
| 4 | NESTED LOOPS | | 3 | 375 | 3576 | | |
| 5 | NESTED LOOPS | | 43 | 3397 | 3493 | | |
| 6 | HASH JOIN | | 4283 | 246K| 3492 | | |
| 7 | REMOTE | SELLHEAD | 4212 | 102K| 182 | POS_DB | R->S |
| 8 | TABLE ACCESS FULL | SELLPAYGOODS | 89123 | 2959K| 3309 | | |
| 9 | TABLE ACCESS BY INDEX ROWID| PAYMODE | 1 | 20 |1 | | |
| 10 | INDEX UNIQUE SCAN | PK_PAYMODE | 1 | |0 | | |
| 11 | REMOTE | SELLDETAIL | 1 | 46 |2 | POS_DB | R->S |
| 12 | TABLE ACCESS BY INDEX ROWID | GOODSMFRAME | 1 | 25 |2 | | |
| 13 | INDEX UNIQUE SCAN | PK_GOODSMFRAME | 1 | |1 | | |
---------------------------------------------------------------------------------------------------

数据库版本:10.2.0.1


sundog315 发表于:2011.11.01 11:30 ::分类: ( Oracle ) ::阅读:(120次) :: Permanent link
切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最多阅读文章...
博客统计...
网站链接...