需要先解决基本性能问题, 如果性能仍无法被接受, 才来考虑以下方法.
物化视图 materialized view, 结果缓存 result cache, 并行处理 parallel prcess, 直接路径插入 direct-path insert, 行预取, 数组接口
物化视图
视图是一个虚拟表, 基于它创建时指定的查询语句返回结果集, 每次访问它都会导致这个查询语句被执行一次, 为了避免每次访问都执行这个查询, 可以将这个查询的结果集存储到一个物化视图中, 也就是说, 物化视图只是对已经存储于别处的数据的转换和复制.
例如:
create materialized view sales_mv
as
select * from emp;
使用物化视图:
select * from sales_mv order by prod_category
查询重写的概念: 当查询优化器收到一条待优化的查询, 既可以选择直接使用它(也就是不使用查询重写), 也可以选择使用物化视图来对它进行重写, 只要这个物化视图包含执行这条查询需要的全部或部分数据. 当然, 决定使用或不使用物化视图是基于查询优化器对执行计划开销的计算. 提示rewrite或no_rewrite可用来影响查询优化器的这个决定.为了利用查询重写, 它必须在两个层次上被启用, 首先, 必须将动态参数 query_rewrite_enbaled设置为true, 其次, 必须对这个物化视图启用查询重写.
alter materialize view sales_mv enable query rewrite.
一旦启用了查询重写, 如果你提交原来查询语句, 优化器就会将物化视图作为查询重写的一个备用选项, 这时候, 你执行原来的SQL语句select * from emp; 也会走物化视图
另外, 当基础表发生修改时, 物化视图可能会包含失效数据(如果你删除了部分基表数据, 而物化视图并没有变化, 那么删除的部分数据就是失效数据)由于这个原因, 在基表发生了变更之后, 必须对物化视图执行一次刷新操作.
另外, 创建物化视图还可以指定一些参数. 物化视图内容很多, 用到时, 单独拿出来研究吧
结果缓存
顾名思义, 就是保存查询等的结果, 以方便下次查询时, 速度提升. (注意, 这里不是执行计划的缓存, 而是查询结果直接缓存)
select /*+ result_cache */
个人觉的, 不推荐吧
并行处理
默认情况下, 向数据库引擎提交一个SQL语句的时候, 它是由单独一个服务器进程串行执行的, 这样, 即使又多个CPU, 这个SQL语句也只会在一个CPU上执行, 并行处理的目的就是为了将一个SQL语句分布到多个CPU上执行.
用到时再说
直接路径插入
插入到高水位之上
行预取
在应用程序从数据库读取数据的时候, 可以一条一条的读取, 也可以更好一点, 一次读取多条记录, 一次读取多条记录被称为 行预取
每次应用程序请求驱动从数据库返回1条记录的时候, 会预取多条记录并将它们存储在客户端的内存中, 这样, 多个后续的请求就不需要执行数据库调用来读取数据.
用到时再说, 个人不推荐