对pl/sql 语句的优化(上集)

本文介绍了一种通过修改SQL查询语句提高查询效率的方法。通过对日期字段使用更有效的筛选方式,并调整表连接顺序,显著减少了查询时间和资源消耗。

对这个进行优化

select n5001 门店,n5002 部门,n5004 小分类,n5019 商品编码,c01d21 商品名称,
nvl(xse,0)-nvl(dzxs,0) 销售,
mle 毛利,
nvl(xl,0)-nvl(dzsl,0) 销量
from
(select n5001,n5002,n5004,n5019,sum(n5011) xse,sum(n5016) mle,sum(n5023) xl
from n50
where to_char(n5010,'yyyymmdd')>='20100401'
and to_char(n5010,'yyyymmdd')<='20100431'
group by n5001,n5002,n5004,n5019),
(select g08,g09,g02,sum(g03*g07) dzxs,sum(G03) dzsl from batchgoods
where to_char(g04,'yyyymmdd')>='20100401'
and to_char(g04,'yyyymmdd')<='20100431'
group by g08,g09,g02),c01d
where n5001=g08(+)
and n5019=g02(+)
and n5001=c01d00(+)
and n5019=c01d01(+)

执行计划

SELECT STATEMENT, GOAL = CHOOSE Cost=10060 Cardinality=3931 Bytes=475651
MERGE JOIN OUTER Cost=10060 Cardinality=3931 Bytes=475651
SORT JOIN Cost=8063 Cardinality=3931 Bytes=338066
NESTED LOOPS OUTER Cost=7952 Cardinality=3931 Bytes=338066
VIEW Object owner=FZDC Cost=4015 Cardinality=3931 Bytes=239791
SORT GROUP BY Cost=4015 Cardinality=3931 Bytes=149378
TABLE ACCESS FULL Object owner=FZDC Object name=N50 Cost=3955 Cardinality=3931 Bytes=149378
TABLE ACCESS BY INDEX ROWID Object owner=FZDC Object name=C01D Cost=2 Cardinality=1 Bytes=25
INDEX RANGE SCAN Object owner=FZDC Object name=SYS_C003420 Cost=1 Cardinality=1
SORT JOIN Cost=1997 Cardinality=1308 Bytes=45780
VIEW Object owner=FZDC Cost=1972 Cardinality=1308 Bytes=45780
SORT GROUP BY Cost=1972 Cardinality=1308 Bytes=62784
TABLE ACCESS FULL Object owner=FZDC Object name=BATCHGOODS Cost=1952 Cardinality=1308 Bytes=62784

查看了一个

select n5001,n5002,n5004,n5019,sum(n5011) xse,sum(n5016) mle,sum(n5023) xl
from n50
where to_char(n5010,'yyyymmdd')>='20100401'
and to_char(n5010,'yyyymmdd')<='20100431'
group by n5001,n5002,n5004,n5019

其中n5010 是日期已经走全表扫描了。

select n5001,n5002,n5004,n5019,sum(n5011) xse,sum(n5016) mle,sum(n5023) xl
from n50
where to_char(n5010,'yyyymmdd')>='20100401'
and to_char(n5010,'yyyymmdd')<='20100431'
group by n5001,n5002,n5004,n5019

SELECT STATEMENT, GOAL = CHOOSE Cost=4015 Cardinality=3931 Bytes=149378
SORT GROUP BY Cost=4015 Cardinality=3931 Bytes=149378
TABLE ACCESS FULL Object owner=FZDC Object name=N50 Cost=3955 Cardinality=3931 Bytes=149378

/////////////////////////////////////////////////////////////

改为

select n5001,n5002,n5004,n5019,sum(n5011) xse,sum(n5016) mle,sum(n5023) xl
from n50
where n5010 between to_date('20100401','yyyymmdd') and to_date('20100431','yyyymmdd')
group by n5001,n5002,n5004,n5019

SELECT STATEMENT, GOAL = CHOOSE Cost=1727 Cardinality=1542 Bytes=58596
SORT GROUP BY Cost=1727 Cardinality=1542 Bytes=58596
FILTER
TABLE ACCESS BY INDEX ROWID Object owner=FZDC Object name=N50 Cost=1698 Cardinality=1542 Bytes=58596
INDEX RANGE SCAN Object owner=FZDC Object name=IND_N500312_N5010 Cost=214 Cardinality=78623
//////////////////////////////////////////////////////////////////

同理

select g08,g09,g02,sum(g03*g07) dzxs,sum(G03) dzsl from batchgoods
where
g04 between to_date('20100401','yyyymmdd') and to_date('20100431','yyyymmdd')
group by g08,g09,g02

改后

SELECT STATEMENT, GOAL = CHOOSE
SORT GROUP BY
TABLE ACCESS BY INDEX ROWID Object owner=FZDC Object name=BATCHGOODS
INDEX RANGE SCAN Object owner=FZDC Object name=IND_BATGD2
///////////////////////////////////////////////////////////////

修改完以后:

SELECT STATEMENT, GOAL = CHOOSE Cost=3372 Cardinality=1542 Bytes=186582
MERGE JOIN OUTER Cost=3372 Cardinality=1542 Bytes=186582
SORT JOIN Cost=3321 Cardinality=1542 Bytes=132612
NESTED LOOPS OUTER Cost=3272 Cardinality=1542 Bytes=132612
VIEW Object owner=FZDC Cost=1727 Cardinality=1542 Bytes=94062
SORT GROUP BY Cost=1727 Cardinality=1542 Bytes=58596
FILTER
TABLE ACCESS BY INDEX ROWID Object owner=FZDC Object name=N50 Cost=1698 Cardinality=1542 Bytes=58596
INDEX RANGE SCAN Object owner=FZDC Object name=IND_N500312_N5010 Cost=214 Cardinality=78623
TABLE ACCESS BY INDEX ROWID Object owner=FZDC Object name=C01D Cost=2 Cardinality=1 Bytes=25
INDEX RANGE SCAN Object owner=FZDC Object name=SYS_C003420 Cost=1 Cardinality=1
SORT JOIN Cost=51 Cardinality=1308 Bytes=45780
VIEW Object owner=FZDC Cost=26 Cardinality=1308 Bytes=45780
SORT GROUP BY Cost=26 Cardinality=1308 Bytes=62784
FILTER
TABLE ACCESS BY INDEX ROWID Object owner=FZDC Object name=BATCHGOODS Cost=6 Cardinality=1308 Bytes=62784
INDEX RANGE SCAN Object owner=FZDC Object name=IND_BATGD2 Cost=2 Cardinality=2355
//////////////////////////////////////////////////////////

时间上的改变:

之前是:

1 41.454

2 30.75

之后:

1 22.406

2 17.297

//////////////////////////////////////

SQL> select count(*) from n50;

COUNT(*)
----------
1903776

SQL> select count(*) from c01d;

COUNT(*)
----------
697547

SQL> select count(*) from batchgoods;

COUNT(*)
----------
603340

SQL>

把主从表的顺序排一下。

select n5001 门店,n5002 部门,n5004 小分类,n5019 商品编码,c01d21 商品名称,
nvl(xse,0)-nvl(dzxs,0) 销售,
mle 毛利,
nvl(xl,0)-nvl(dzsl,0) 销量
from
(select g08,g09,g02,sum(g03*g07) dzxs,sum(G03) dzsl from batchgoods
where g04 between to_date('20100401','yyyymmdd') and to_date('20100431','yyyymmdd')
group by g08,g09,g02),
c01d,(select n5001,n5002,n5004,n5019,sum(n5011) xse,sum(n5016) mle,sum(n5023) xl
from n50
where n5010 between to_date('20100401','yyyymmdd') and to_date('20100431','yyyymmdd')
group by n5001,n5002,n5004,n5019)
where n5001=g08(+)
and n5019=g02(+)
and n5001=c01d00(+)
and n5019=c01d01(+)

时间上:

//////////////////////////////////////////////////////////

1。 23。406

2。 15。844

3。 14。875

下集接着优化。。。哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值