总结---与ORACLE数据库交互程序性能优化篇

SQL语句优化
    这个好办,抓到占用CPU高的SQL语句,根据索引、SQL技巧等改写一下,立竿见影。

 

SELECT时不使用函数
    在做频繁的查询操作时,尽量直接select字段名,然后使用C语言代码对查询结果做二次加工,避免让Oracle来做复杂的函数或者数学运算。因为Oracle出于通用性的考虑,其函数及数学运算的速度远不如用C语言直接编译成机器码后运算来的快。

 

绑定变量
    这个可以大幅度降低SQL的“hard parse”,我们大部分程序都已经实现了变量绑定。个别没有实现的,修改一下,也能很快看到效果。

 

批量FETCH
    如果一次select会返回多条(几百、上千)记录,使用批量Fetch,比如一次fetch 1000条记录,要比一条条的fetch数据快的多,也可以有效降低 oracle的压力。

 

批量提交
    一次修改多条(比如小于10000条左右)记录,然后一次性提交,要比每条提交一次快的多。当然前提是业务逻辑允许这样做。

 

批量增删改
    如果需要一次性修改或者删除多条记录,可以采用批量数组绑定的方式,这个和前面说得“绑定变量”类似,区别是前者绑定的是一个变量,这里绑定的是一个大数组的首指针,这种方式要比逐条绑定执行快的多。

 

SQL预解析
    前面的大部分是批量操作,还有一种常见的场景是小事务操作,但频率非常高。这种场景一般SQL也不复杂,几乎没有优化的余地了,但是由于操作频繁,同样会造成CPU居高不下。目前我们的程序大部分都是下面这个应用模式:
loop
    parse sql;
    bind var;
    execute sql;
end loop;
    虽然我们使用了绑定变量的方式,但是由于操作频繁,同样造成大量的“soft parse”以及网络通信。在内存数据库中,我们一般采用预解析的方式来提高效率,事实上,Oracle很早就给开发者提供这种模式,只是开发者嫌麻烦没有使用而已。将程序改成下列模式:
parse sql;
bind var;
loop
    execute sql;
end loop;
    这样就可以有效降低Oracle的压力,可以将执行效率至少提高一倍。但是这种模式涉及到程序结构的变更,必须在设计阶段就这样做。否则,后期再调整的话,风险和工作量都会很大。

 

SQL语句的一些优化方法

1、SQL语句用大写的;因为Oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。
2、避免在索引列上使用NOT通常,我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响。
3、当Oracle“碰到”NOT,他就会停止使用索引转而执行全表扫描。
4、避免在索引列上使用计算。WHERE子句中,假如索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
5、尽量少用DISTINCT操作,用EXISTS代替DISTINCT


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章