用到decode的查询是不是不能用索引?

[复制链接]
查看11 | 回复6 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
有一个表MX有100多万条记录,我基本这个表建了一个视图v_MX:
create or replace view v_MX as
select a.费用id,
sum(decode(a.组成序号,1,a.组成金额)) as f1,
sum(decode(a.组成序号,2,a.组成金额)) as f2,
sum(decode(a.组成序号,3,a.组成金额)) as f3,
sum(decode(a.组成序号,4,a.组成金额)) as f4,
sum(decode(a.组成序号,5,a.组成金额)) as f5
from MX a
group by a.费用id;
执行select * from v_MX;时,速度很慢,要是跟别的表再关联的话,就更不用说了.
我对费用id和组成序号都分别建了索引,但是我对
select * from v_MX;做explain plan 时都是全表扫描,索引一点用也没有


请哪位高手帮忙看看,这个要怎么优化?!
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
对费用id和组成序号都分别建了索引
---------------
就上面的信息,肯定走全表,
费用id组成序号 组成金额 建立联合索引好了。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 ifelse 发布
[B]有一个表MX有100多万条记录,我基本这个表建了一个视图v_MX:
create or replace view v_MX as
select a.费用id,
sum(decode(a.组成序号,1,a.组成金额)) as f1,
sum(decode(a.组成序号,2,a.组成金额)) as f2,
sum(decode(a.组成序号,3,a.组成金额)) as f3,
sum(decode(a.组成序号,4,a.组成金额)) as f4,
sum(decode(a.组成序号,5,a.组成金额)) as f5
from MX a
group by
执行select * from v_MX;时,速度很慢,要是跟别的表再关联的话,就更不用说了.
我对费用id和组成序号都分别建了索引,但是我对
select * from v_MX;做explain plan 时都是全表扫描,索引一点用也没有


请哪位高手帮忙看看,这个要怎么优化?! [/B]

a.费用id;

以上是两个字段还是一个字段?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
兄弟还是不要在建视图时用中文吧,用拼音表示也要好一些.
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
首先分析num等于1,2,3,4,5返回的数据量占总数据的多少?
如果不多的话.我建议你这样:
ora92>select a.id,
2sum(decode(a.num,'1',a.money)) as f1,
3sum(decode(a.num,'2',a.money)) as f2
4from test a
5where a.num in ('1','2')
6group by a.id;
ID
F1 F2
-------------------- ---------- ----------
1
1000 100000
2
70100098000
3
100000
已用时间:00: 00: 00.01
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE
10 SORT (GROUP BY)
21 CONCATENATION
32 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
43 INDEX (RANGE SCAN) OF 'L' (NON-UNIQUE)
52 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
65 INDEX (RANGE SCAN) OF 'L' (NON-UNIQUE)


Statistics
----------------------------------------------------------

0recursive calls

0db block gets

9consistent gets

0physical reads

0redo size
528bytes sent via SQL*Net to client
503bytes received via SQL*Net from client

2SQL*Net roundtrips to/from client

1sorts (memory)

0sorts (disk)

3rows processed
ora92>
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
不过这种情况下还如FTS来得快.
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
走索引也未必快,加上/*+INDEX(TABLE INDEX_NAME)*/ 看看是否有提高。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行