Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104668414
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-16 13:36:05

    来源:赛迪网    作者:Alice

9.硬编码本地Varchar2变量尺寸:使系统难以使用;

-- PL/SQL函数/过程中声明本地Varchar2类型存储表的值,硬编码长度;

--视图以硬编码格式声明Varchar2长度;

使用%type引用基层表对象。

10.忽略异常:数据中断的威胁;

-- "Exception When others then NULL;"

可能会导致如空间错误之类的严重错误被忽略。

·如果不希望任何错误影响事务,则使用自治事务,并将错误log到错误表中;

·如果要处理某些具体的错误,则使用特定的exception;

11.不使用绑定变量更改参数:降低可用性;

经常使用相同的语句执行,不使用绑定变量,而使用文本值;

会导致每次都编译查询;

12.在触发器中依赖于条件列值,数据中断的威胁;

if updating('ColumnName') then;

在大多数GUI情况下,该方法不能正确的工作,因为GUI层保留所有字段,而不是单独的字段,如下:

create table tbl(col1 number, col2 varchar2(10));

CREATE OR REPLACE TRIGGER trig1

BEFORE UPDATE ON tbl

FOR EACH ROW

BEGIN

if not updating('col1') then

raise_application_error (-20001,'Col1 was not updated');

end if;

END;

/

insert into tbl values (1,'test');

update tbl set col1=1;

比较:new.column和:old.column,如果列为NULL,确保使用了DECODE。

13.依赖于在包变量中的上下文信息:数据中断的威胁;

依赖对象结构更改会导致全部变量的清空。

·使用sys_context存储简单的交叉调用上下文;

·使用临时表存储复杂的内部事务上下文;

·使用表存储复杂的内部调用上下文;

14.依赖于外部上下文初始化:数据中断的威胁;

视图和过程依赖于sys_context()得到上下文信息,上下文通常要求调用者调用存储过程设置。

数据库和应用程序之间的网络会断,大多数现代网络都会自动重新连接,但是初始化过程不会调用并且旧的上下文将会丢失。

·使用登陆触发器设置上下文;

15.分布式触发器的二次处理:数据中断的威胁;

传播数据更新远程系统;

在第二个子系统中使用LOG表,在触发器中使用When others LOG任何异常,使用dbms_utility.format_error_stack或sqlerrm捕获详细信息;

16.存储rowid在之后引用,数据中断的威胁;

ROWID值存储在表或客户端,以在之后引用;

ROWID会更改,使用主键引用;

17.存储空的LOBs,降低性能;

在CLOB字段存储Empty CLOB而不是NULL;

Oracle为EMPTY CLOBs分配空间;

18.太多层次的视图:降低性能;

优化器可能会放弃使用索引。

只要可能考虑使用连接代替子查询;

使用物化视图或者维护一个聚集表;

19.非自治事务中的事务控制,数据中断的威胁;

在无PRAGMA AUTONOMOUS TRANSACTION的事务中commit和rollback。

阅读(926) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~