一个表中多个索引的取舍

[复制链接]
查看11 | 回复9 | 2013-1-11 22:03:44 | 显示全部楼层 |阅读模式
问题描述:
我有一张表PAYA,下面是其中的索引信息列表。
该表是一张按照org_no进行范围分区的表,分区数为41个;
分区中是按照CHARGE_YM进行的list子分区,数量共2173个。
多数分区的数据量是在1000万左右,3、4个小的分区是几万数据量。
从dba_ind_columns表中查到如下索引信息:
TABLE_NAME
回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
alter index .MONITORING USAGE;监视一段时间
回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
shane1103 发表于 2013-12-23 13:34
alter index .MONITORING USAGE;监视一段时间

我的意思是不仅要知道这些索引有没有用到,还想删除一些不必要的索引,这个从哪方面考虑?
比如IND_PAYA_CHARGYM_CHARGDT的前导列时CHARGE_YM,IND_PAYA_ORG_NO_AYM是对ORG_NO的索引,那么索引IND_PAYA_OM(对CHARGE_YM、ORG_NO的索引)是否有必要?
从使用上来看,用CHARGE_YM、ORG_NO作为谓词条件的查询肯定是使用IND_PAYA_OM更好,
但从索引维护的角度来说,增加索引了肯定在插入或更新数据时需要额外的成本,
从空间角度来说,这么大的表创建多个相似索引也是一种浪费。
不知道这个应该如何取舍,该索引是否应该添加?
回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
从题目来看,只能考虑带分区字段的索引,这类索引可以考虑去掉这两字段,另外,由于子分区的数据量太大,保留的索引,需要更高选择性的字段。
回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
ZALBB 发表于 2013-12-23 14:52
从题目来看,只能考虑带分区字段的索引,这类索引可以考虑去掉这两字段,另外,由于子分区的数据量太大,保 ...

这是一个实际问题,福哥对于建索引有没有其他的建议呢?
如果对一个表有
where column1=xxx;
where column2=xxx;
where column1=xxxand column2=xxx;
这些查询方式,列的可选择性都不是很好(部门、类型等字段),一般是分别建立多个单键值索引还是建立联合索引呢?
有没有什么规律可循?
我个人的想法是建立单键值索引后就不建立联合索引了,需要查询多个列时,几个索引再做join。
回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
to_be_dba 发表于 2013-12-24 13:27
这是一个实际问题,福哥对于建索引有没有其他的建议呢?
如果对一个表有

我和你一样的想法,因为确实没什么更好的办法,你只能从实际的业务应用需求,和索引个数多少中选择平衡。
回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
to_be_dba 发表于 2013-12-24 13:27
这是一个实际问题,福哥对于建索引有没有其他的建议呢?
如果对一个表有

请问这个“几个索引再做join”是什么意思,如何具体做的,我最近也碰到类似问题需要解决,麻烦回答一下,谢谢!
回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
sanshihaoji 发表于 2014-6-16 04:58
请问这个“几个索引再做join”是什么意思,如何具体做的,我最近也碰到类似问题需要解决,麻烦回答一下, ...

我的意思是:
比如a、b两列分别创建了索引,where条件中使用到了这两列时分别访问到两个索引。
SQL> select object_type,status from t where object_type='TABLE' and status='VALID';
1929 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 670786654
--------------------------------------------------------------------------------------
| Id| Operation
| Name
| Rows| Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT |
| 794 | 11910 |53 (2)| 00:00:01 |
|*1 |VIEW
| index$_join$_001 | 794 | 11910 |53 (2)| 00:00:01 |
|*2 | HASH JOIN|
| | |
||
|*3 |INDEX RANGE SCAN| IDX_OBJECT_TYPE| 794 | 11910 |21 (0)| 00:00:01 |
|*4 |INDEX RANGE SCAN| IDX_STATUS | 794 | 11910 |31 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
这样性能应该比在两列建立联合索引性能稍差一点,但通用性更强

回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
不了解业务的话, 顶二楼
回复

使用道具 举报

千问 | 2013-1-11 22:03:44 | 显示全部楼层
分区表都是全局索引,这是第一个潜在的改造点;
索引字段重复度较高,需要精简,这是第二个改造点;
索引有没有被使用,没有使用的要干掉,这是第三个改造点;
至于具体怎么弄,这个取决于业务怎么用,基本上,你得把用到这个表的SQL都给找出来,至少得把存在性能问题的找出来,参照这些SQL的查询条件与频率,就知道应该怎么整了。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行