背景:
表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上。
弊端:之前代码已经写完了,这个方案需要大量的表/代码修改。大家有什么比较好的解决方法,欢迎讨论。
解决方案 »
- 请教一个和oracle搭边的问题!!希望能得到答案,谢谢各位!
- 【急求】在使用oracle copy命令复制表中包含long数据类型的数据时报错
- 红旗系统 安装 oracle 10g 有经验的帮下忙
- 这个sql语句如何写(oracle数据库)
- Oracle 9i中,在客户端能否创建数据库和创建资料档案库?
- Oracle Job 调用的存储过程 Inser语句为啥不能执行!!
- Oracle中提高大数据量查询速度问题
- 求救 oracle9i Enterprise Manager Console 出现乱码
- 请教:oracle数据库关闭时,系统会自动切换日志吗?
- case when 判断添加一个字段和新建一个关系表外连接添加一个字段哪个效率高
- 真实面试题--Oracle存储过程
- oracle怎么实现自增长,mySql能自己增长,oracle不行
弊端:需要创建额外的表空间,项目不允许谁说的建立分区表要单独的表空间?
1. 在created_dt字段创建索引
弊端:创建索引可以提高P2的性能,可是又会影响P1的性能,因为INSERT/DELETE操作也需要修改索引表,所以在频繁修改的字段创建索引并不可取。怎么不可取了?数据量才几百万啊,oracle处理起来没有问题啊还有你的频繁select肯定有问题,频繁插入比较正常
频繁select是为了查询进程P1新插入的数据,业务需求,什么需求,查询的力度如何?看看是否有替代方法
这个没有什么定量的东西可找,因为环境不一样,内存,CPU,数据库版本,操作系统等等,一般可以根据数据是否存在锁和栓来确定数据库的插入是否繁忙