日期:2014-05-17  浏览次数:20769 次

如何提高大表操作性能
背景:
表T:<username, log, created_dt>,表记录有几百万行
进程P1:频繁INSERT/DELETE表T
进程P2:频繁SELECT 表T WHERE username = <input> and created_dt > <input>

问题:
因为在created_dt上没有创建索引,进程P2对表的SELECT操作是一个全表扫描,非常慢。

解决方案:
1. 在created_dt字段创建索引
弊端:创建索引可以提高P2的性能,可是又会影响P1的性能,因为INSERT/DELETE操作也需要修改索引表,所以在频繁修改的字段创建索引并不可取。

2. 创建分区表
弊端:需要创建额外的表空间,项目不允许。

3. 分散表记录到不同表上
创建T1, T2, T3 ... TN, 然后创建一个映射表记录<username, table_idx>。比如<'user1', 3>表示user1所有相关的记录放在T3上。
弊端:之前代码已经写完了,这个方案需要大量的表/代码修改。

大家有什么比较好的解决方法,欢迎讨论。

------解决方案--------------------
加索引,注意每隔一定时间rebuild索引,对索引进行维护。
------解决方案--------------------
2. 创建分区表
弊端:需要创建额外的表空间,项目不允许

谁说的建立分区表要单独的表空间?


1. 在created_dt字段创建索引
弊端:创建索引可以提高P2的性能,可是又会影响P1的性能,因为INSERT/DELETE操作也需要修改索引表,所以在频繁修改的字段创建索引并不可取。

怎么不可取了?数据量才几百万啊,oracle处理起来没有问题啊

还有你的频繁select肯定有问题,频繁插入比较正常
------解决方案--------------------
2. 那你觉得数据量多少时创建索引?哪里有说服力的实验数据?

多少都可以创建索引,我的意思是创建索引不会影响你的百万级别的数据插入性能

表现在索引情况如何,会影响你的数据插入?有现象?
------解决方案--------------------
引用:
频繁select是为了查询进程P1新插入的数据,业务需求
引用:还有你的频繁select肯定有问题,频繁插入比较正常
……


频繁select是为了查询进程P1新插入的数据,业务需求,什么需求,查询的力度如何?

看看是否有替代方法
------解决方案--------------------
有一种东西叫做测试,用SQL Performance Analyzer作个场景测试就清楚了。