背景:
表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上。
弊端:之前代码已经写完了,这个方案需要大量的表/代码修改。大家有什么比较好的解决方法,欢迎讨论。
表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. 在created_dt字段创建索引
弊端:创建索引可以提高P2的性能,可是又会影响P1的性能,因为INSERT/DELETE操作也需要修改索引表,所以在频繁修改的字段创建索引并不可取。怎么不可取了?数据量才几百万啊,oracle处理起来没有问题啊还有你的频繁select肯定有问题,频繁插入比较正常
频繁select是为了查询进程P1新插入的数据,业务需求,什么需求,查询的力度如何?看看是否有替代方法
这个没有什么定量的东西可找,因为环境不一样,内存,CPU,数据库版本,操作系统等等,一般可以根据数据是否存在锁和栓来确定数据库的插入是否繁忙