通过外连接提高SQL性能

数据库使用:通过外连接提高SQL性能

1、现象、问题描述
select CID from v_contents a where a.spid like '%' and a.type=98 and a.updateflg = '0' and a.curstatus='5'
and a.cid not in
(select distinct b.fieldvalue from v_contentdatavisual_zh b, v_contents c
where c.type=1 and c.updateflg!='2' and b.cid=c.cid and b.fieldid like 'download_onlineServiceID'
and b.fieldvalue is not null)
2、关键过程、根本原因分析
使用NOT IN 操作时执行计划如下:
SQL> @?/rdbms/admin/utlxpls
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes
| Cost |
| 0 | SELECT STATEMENT | | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| |
| 1 | FILTER | | |
| |
| 2 | TABLE ACCESS FULL | CONTENTS | |
| |
| 3 | TABLE ACCESS BY INDEX ROWID| CONTENTDATAVISUAL_ZH | |
| |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 4 | NESTED LOOPS | | |
| |
| 5 | TABLE ACCESS FULL | CONTENTS | |
| |
| 6 | INDEX RANGE SCAN | PK_CONTENTDATAVISUAL_ZH | |
| |
NOT IN的操作即使字段上有索引执行计划也会造成全表的扫描,因为NOT 的值并没有记录在索引中,所以上述SQL要执行7分多种。
修改SQL:
select a.CID from
v_contents a,
(select distinct b.fieldvalue from v_contentdatavisual_zh b, v_contents c
where c.type=1 and c.updateflg!='2' and b.cid=c.cid and b.fieldid like 'download_onlineServiceID'
and b.fieldvalue is not null) b
where a.cid=b.fieldvalue(+) and b.fieldvalue is null
and
a.spid like '%' and a.type=98 and a.updateflg = '0' and a.curstatus='5'
修改之后的执行计划如下:
SQL> @?/rdbms/admin/utlxpls
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | By
tes | Cost |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| |
| 1 | FILTER | | |
| |
| 2 | MERGE JOIN OUTER | | |
| |
| 3 | SORT JOIN | | |
| |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 4 | TABLE ACCESS FULL | CONTENTS | |
| |
| 5 | SORT JOIN | | |
| |
| 6 | VIEW | | |
| |
| 7 | SORT UNIQUE | | |
| |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 8 | TABLE ACCESS BY INDEX ROWID| CONTENTDATAVISUAL_ZH | |
| |
| 9 | NESTED LOOPS | | |
| |
| 10 | TABLE ACCESS FULL | CONTENTS | |
| |
| 11 | INDEX RANGE SCAN | PK_CONTENTDATAVISUAL_ZH | |
采用外连接之后SQL速度由原来的7分钟下降为7秒钟。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值