常用的pl/sql开发原则
2014-05-09 23:26
441 查看
只转载,不代表本人同意这些原则,因为未经测试。
a) 广泛使用绑定变量,特别是批量绑定,因为这可以有效的避免sql的硬解析和PL/SQL引擎和SQL引擎的上下文切换!
b) 广泛使用UROWID来处理DML语句
c) 在你的存储过程中谨慎使用DDL语句,因为这可能会破坏你的transaction的连续性,更为严重的是可能会阻塞DML操作并可能会导致大量library cache latch争用并且有可能会导致某些sql执行计划的改变。
d) 不要在存储过程里不应该commit的地方commit,特别是当你的存储过程会被另外一个存储过程调用的时候,你考虑到了你这么做会破坏调用你的父存储过程的transaction的连续性了吗?
e) 注意你面对的数据量,小数据量的处理方法和海量数据的处理方法是不一样的!
f) 循环的时候要注意清空临时变量的值
g) 注意“select into 变量”的问题,使用子begin语句封装“select into 变量”以避免可能会出现的错误,这样就可以避免要在“select into 变量”之前先执行一下select count(*)
h) 不要让oracle执行你的PL/SQL代码时产生隐式转换
i) 在PL/SQL中定义varchar2变量的时候当你在不知道你所定义的变量的长度的时候可以将其定义为varchar2(4000),这一点都不浪费!
j) 如果你写的一组存储过程有逻辑上的关联,那我建议你要把这些存储过程封装到一个package里面
k) 改正你的PL/SQL代码里的所有编译时编译器提示出的warning
l) 循环的时候一定要注意exit,否则就太可怕了!
m) 处理显式cursor的时候一定要注意fetch和exit,否则就太可怕了!
n) bulk collect into的时候不要一次collect太多的数据,建议一次collect的数据量在10000条以内,你可以用批量绑定自带的limit子句来限制或者使用rownum来限制
o) 如果你使用了批量绑定,那为什么要把时间浪费在写诸如insert into tablename(column1,column2,……,column100)
values(value1(i),value2(i),……,value100(i))这样的sql语句上面?如果有可能,就写一个你自己的存储过程代码生成器吧,让它来帮你生成这样的语句。你应该把精力集中在更有用的方面!
p) 你希望你的代码被并发执行吗?如果你不希望或者你的代码根本就不能够被并发执行,那就想一个办法控制并发吧!在应用层面控制就好,比如在update之前先尝试对该记录加for update nowait的锁,或者利用DML语句当前读的特性来避免并发都是不错的主意
q) 不要写诸如insert into tablename1 select * from tablename2这样的语句,你考虑到扩展性了吗?假如以后tablename1或者tablename2增加或减少字段了呢?
r) 谨慎使用hint,除非你很清楚你在做什么。比如说这里你强制oracle使用了某个索引,假如以后这个索引的名字被改了,由此带来的执行计划的变更你怎么办?你考虑到这种情况了吗?
s) 注意关联更新丢失数据的问题,update语句如果没有指定where条件那就是对所有的数据做update操作,这个就太恐怖了!
t) 用好临时表,有时候临时表很有用!特别是在根据一堆复杂条件去更新海量数据的时候
u) 尽量避免在存储过程里使用递规!不是说不能用递规(递规在某些特定的情况下很有用),而是说在用递规的时候一定要避免无限递规的情况!
v) 写好你的PL/SQL代码里的注释,这个很重要!不写注释并不代表你很厉害!
a) 广泛使用绑定变量,特别是批量绑定,因为这可以有效的避免sql的硬解析和PL/SQL引擎和SQL引擎的上下文切换!
b) 广泛使用UROWID来处理DML语句
c) 在你的存储过程中谨慎使用DDL语句,因为这可能会破坏你的transaction的连续性,更为严重的是可能会阻塞DML操作并可能会导致大量library cache latch争用并且有可能会导致某些sql执行计划的改变。
d) 不要在存储过程里不应该commit的地方commit,特别是当你的存储过程会被另外一个存储过程调用的时候,你考虑到了你这么做会破坏调用你的父存储过程的transaction的连续性了吗?
e) 注意你面对的数据量,小数据量的处理方法和海量数据的处理方法是不一样的!
f) 循环的时候要注意清空临时变量的值
g) 注意“select into 变量”的问题,使用子begin语句封装“select into 变量”以避免可能会出现的错误,这样就可以避免要在“select into 变量”之前先执行一下select count(*)
h) 不要让oracle执行你的PL/SQL代码时产生隐式转换
i) 在PL/SQL中定义varchar2变量的时候当你在不知道你所定义的变量的长度的时候可以将其定义为varchar2(4000),这一点都不浪费!
j) 如果你写的一组存储过程有逻辑上的关联,那我建议你要把这些存储过程封装到一个package里面
k) 改正你的PL/SQL代码里的所有编译时编译器提示出的warning
l) 循环的时候一定要注意exit,否则就太可怕了!
m) 处理显式cursor的时候一定要注意fetch和exit,否则就太可怕了!
n) bulk collect into的时候不要一次collect太多的数据,建议一次collect的数据量在10000条以内,你可以用批量绑定自带的limit子句来限制或者使用rownum来限制
o) 如果你使用了批量绑定,那为什么要把时间浪费在写诸如insert into tablename(column1,column2,……,column100)
values(value1(i),value2(i),……,value100(i))这样的sql语句上面?如果有可能,就写一个你自己的存储过程代码生成器吧,让它来帮你生成这样的语句。你应该把精力集中在更有用的方面!
p) 你希望你的代码被并发执行吗?如果你不希望或者你的代码根本就不能够被并发执行,那就想一个办法控制并发吧!在应用层面控制就好,比如在update之前先尝试对该记录加for update nowait的锁,或者利用DML语句当前读的特性来避免并发都是不错的主意
q) 不要写诸如insert into tablename1 select * from tablename2这样的语句,你考虑到扩展性了吗?假如以后tablename1或者tablename2增加或减少字段了呢?
r) 谨慎使用hint,除非你很清楚你在做什么。比如说这里你强制oracle使用了某个索引,假如以后这个索引的名字被改了,由此带来的执行计划的变更你怎么办?你考虑到这种情况了吗?
s) 注意关联更新丢失数据的问题,update语句如果没有指定where条件那就是对所有的数据做update操作,这个就太恐怖了!
t) 用好临时表,有时候临时表很有用!特别是在根据一堆复杂条件去更新海量数据的时候
u) 尽量避免在存储过程里使用递规!不是说不能用递规(递规在某些特定的情况下很有用),而是说在用递规的时候一定要避免无限递规的情况!
v) 写好你的PL/SQL代码里的注释,这个很重要!不写注释并不代表你很厉害!
相关文章推荐
- 获取数据库连接的两种实现方式
- oracle exp/imp 导入导出数据
- Mysql安装配置,修改初试密码。
- 超详细mysql left join,right join,inner join用法分析
- MySQL两个数据库之间数据的拷贝
- mysql主从复制相关
- SQL优化大全心得
- oracle SQL引擎和PL/SQL引擎
- 时间转换为天小时分钟秒系统当前时间相差8小时截取小数点后两位SqlServer日期函数
- oracle学习
- LevelDB、TreeDB、SQLite3 性能对比
- sql语句中单引号嵌套问题
- sql语句中单引号嵌套问题
- sql语句中单引号嵌套问题
- MySQL基本使用命令中的5大命令
- Mac下启动和停止Mysql服务
- SQL Server MERGE
- SQL Server Transact-SQL 编程
- mysql-cluster集群
- MySQL随机取元素