背景:
表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上。
弊端:之前代码已经写完了,这个方案需要大量的表/代码修改。大家有什么比较好的解决方法,欢迎讨论。

解决方案 »

  1.   

    加索引,注意每隔一定时间rebuild索引,对索引进行维护。
      

  2.   

    2. 创建分区表
    弊端:需要创建额外的表空间,项目不允许谁说的建立分区表要单独的表空间?
    1. 在created_dt字段创建索引
    弊端:创建索引可以提高P2的性能,可是又会影响P1的性能,因为INSERT/DELETE操作也需要修改索引表,所以在频繁修改的字段创建索引并不可取。怎么不可取了?数据量才几百万啊,oracle处理起来没有问题啊还有你的频繁select肯定有问题,频繁插入比较正常
      

  3.   

    频繁select是为了查询进程P1新插入的数据,业务需求
      

  4.   


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

  5.   


    这个没有什么定量的东西可找,因为环境不一样,内存,CPU,数据库版本,操作系统等等,一般可以根据数据是否存在锁和栓来确定数据库的插入是否繁忙
      

  6.   

    那假如有几千万条记录,创建索引不影响频繁的插入?我的理解是会影响,因为每插入一条记录都会导致索引表的修改调整你说的是道理,可以可以改进插入的效率,如采用批量插入,及时提交等,oracle再大数据处理的能力是很强的
      

  7.   

    有一种东西叫做测试,用SQL Performance Analyzer作个场景测试就清楚了。