应用程序这边,可以优化的方面包含service层和persistence层。
Service层,对于一些需要长时间执行的代码,分离他们可变与不可变的部分,不可变的部分做成单例或者将结果缓存起来,缓存策略可以采用EHCash等开源工具,它支持方法级别的缓存,同时支持当别的方法调用时刷新缓存方法结果。特别注意是For循环中对象的实例化。
Persistence层,网上方法比较多,大致有以下一些:
1:根据业务逻辑的需求,SQL&HQL查询条件尽量精确, 同时平衡好数据内存空间与查询次数的关系
2:缓存不常修改的VO
3:对于大批量的select, update和insert操作,我可以采用批处理fetch_size和batch_size
4:设置合适的抓取策略,避免出现N+1,通过setFetechModel和fetch=”select/join”
5:合理使用缓存,get() & load()以及 list() & integrator()
6:设置延迟加载等
数据库这边,本人对数据的理解也不是特别深,知识范围内能想到的有以下(Oracle):
1:根据表数据量的大小,决定是否使用索引。
对于数据量不是特变大的表,我们一般不使用索引,而使用全表扫描,因为全表扫描的一次IO会去抓取多个数据块内容;
而如果使用索引的话,索引会首先根据ROWID去抓取数据,每一次的IO都是发送一个ROWID去抓取,如果数据量超过5%- 10%的话,Oracle要花费大量的时间在IO上,查询效率的影响比较大。(估计Oracle这时会自动采用全表扫描吧)
2:索引创建过程中考虑的问题
索引应该创建在常用的where条件上,对于多个查询条件的SQL,可以创建组合索引,但是组合索引的引导列必须出现被包含在where条件中
3:检查优化SQL,尽量发挥现有索引的效能,比如(>, in,%)将阻止索引效能的发挥
4:利用SGA
不同区域出现的相同的SQL要保证查询字符完全相同,建议采用变量代替常量,以尽量使用重复SQL,以利用SGA共享池,避开Parse阶段。因此使用存储过程,可以有效利用SGA共享池,提高执行效率。
5:From 和 Where后面的语句顺序。
对于From,表应按结果集由大到小的顺序从左往右排列,因为表间连接时,最右边的表会被放到嵌套循环的最外层。最外层的循环次数越少,效率越高。
对于where,能使结果最少的条件放在最右边,SQL执行是按从右到左进行结果集的筛选的