总结面试中关于优化话题

应用程序这边,可以优化的方面包含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执行是按从右到左进行结果集的筛选的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值