sql 优化代码优化

[if !supportLists]1、[endif]查询慢(SQL慢)

1.1:查看sql执行计划,sql是否全表查询,plsql工具按F5可查看执行计划 举例:

此处的查询是全表查询。

1.2:索引的使用 基于非唯一性索引的检索  

[if !supportLists]A. [endif]首先创建索引的目的是为了优化sql确保执行效率。

B. 这个表的数据量达到了用索引比不用索引快,前提是索引字段会在条件中出现,如果这个表的数据量大但是索引字段不作为条件出现是不会走索引的,等于没有索引。

C. 这个表不会频繁的增删改,因为索引的创建会影响增删改的效率。

D. 索引字段不是重复的离谱的那种字段,比如性别,如果有少量的重复可以创建位图索引较为高效。

E. 索引是解决效率的问题,如果你觉得你的sql效率有问题,那么就可以创建相应的索引来提升效率。没有一个标准的情况。

F. 基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用;

什么情况下建好的索引失效?

1.有or需要全有索引;

如果条件中有or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因)

注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

2.复合索引未用左列字段;

对于复合索引,如果不使用前列,后续列也将无法使用(最左匹配原则)

3.like以%开头;

4.索引列需要类型转换,索引列使用函数;

日期函数(to_char(),to_date())

nvl函数  to_number函数

5.where中索引列有运算; 

6.如果数据库觉得全表扫描更快时(数据少);

[if !supportLists]2.[endif]锁表和锁单号导致单据保存慢。

2.1锁表:LDP系统保存单据时涉及库存改动会将库存汇总表整表锁定,例如:A入库单100条码单,B入库单10条码单。当A单先保存时,A单会锁定汇总库存表,此时B单保存无法修改库存汇总表,需等待A单完成释放锁。B单才能处理汇总库存,再到单据保存完成。

优化方案:

1、根据货主条件锁往来单位;影响:存在同一个货主入和出的情况会卡顿。

2.2锁单号:业务量大的单据保存频繁,此时如果某一个单保存慢,LDP系统内创建单号的方法createMaxBillNumber会卡在当前这个单号处,导致后面的单据无法获取到单号,进而影响单据保存。

优化方案:把创建单号的方法提交事物,从而达到不影响后面的单据获取单号的效果

影响:单号可能出现不连续的情况

单据保存慢

1、定位慢的根源;具体到某个查询,某个保存方法。

2、重点注意for循环内的查询,建议提取到循环外处理。

你可能感兴趣的:(sql 优化代码优化)