大家好,在此谈一些在ORACLE9I和PL/SQL Developer作为开发工具的环境下,对于如何编写性能好的存储过程,提一些自己的看法:
1、代码的清晰性是第一步的,代码应该整齐、缩进一致、注释充分。
PL/SQL DEV这个工具里面提供了代码格式化的工具:点击Edit菜单,点击“PL/SQL Beautifier”,工具会自动为我们排版布局。建议每次编写完成后都执行一下这个工具。
2、尽量不要拼装SQL。
·PL/SQL语言不善于处理字符串,在存储过程中拼装SQL会使代码看起来很乱,维护起来很费力;
·拼装的SQL只能动态执行,没有绑定变量,性能也不高;
·拼装的过程中出错,调试起来很麻烦;错误只能在运行期发现,而不能在编译期发现;
·拼装的SQL在优化阶段很麻烦,一条已经优化好的语句要拆开放到代码里面去才行。
3、具体问题具体处理,不要偷懒。
例如WEB中的分页一般要进行两次查询,一次获得记录的总数,一次取得当前页的数据。
很多时候,取得记录数和取得数据是不同的,把他们分别进行处理,能大大提高性能。
4、一个存储过程只干一件事情,不要尝试去写一个功能完备的存储过程。
5、养成“编写好语句后,先按F5看看执行计划”的好习惯。
一条SQL执行的快慢的最本质的区别还是在于执行计划的好坏。学会看执行计划,分析语句是否能更好地利用到索引。
在数据量大的情况下,最好把参数代进去,实际执行一下,验证语句是否与所想的一样快。
6、数据量很大,语句优化了还是执行很慢的时候,“大表变小表,小表再连接”的方法非常管用。
例如:语句需要连接三个表,执行得非常慢。如果采用了临时表,先把其中两个表的数据汇总后存储到临时表,再和大的表连接,性能会高出很多。虽然一条语句写成了三条,但是性能反而会提高。
7、一定一定不要使用游标。
与上面的原则相反,大多数时候,尽量用一条SQL完成。SQL是批量的,而且可以在CPU的层面并行执行,在RAID的层面可以并行读取,如果使用游标,就只能一条一条的执行,性能绝对高不了。