读书频道 > 数据库 > Oracle > Oracle Database 11gR2性能调整与优化
2.4.2 使用IS NULL或IS NOT NULL
2014-01-07 16:07:37     我来说两句 
收藏    我要投稿   
在Oracle认证大师Richard Niemiec的帮助下,系统地识别和排除数据库的性能问题:《Oracle Database 11g R2性能调整与优化》一书详细介绍了最新的监控、故障排除和优化的方法,取自真实世界的案例研究和最佳实  立即去当当网订购

当在WHERE子句中使用IS NULL或IS NOT NULL的时候,因为NULL值并没有被定义[2],所以索引的使用会被抑制。数据库中没有值等于NULL;甚至NULL 也不等于NULL。

在SQL语句中使用NULL会提出一些挑战:如果被索引的列在某些行中存在NULL值,在索引中就不会有相应的条目(除非使用位图索引,这是位图索引对于NULL搜索通常很快的原因)。一般情况下,即使sal列上有索引,下面的语句也会引起全表扫描:

select empno, ename, deptno

from    emp

where   sal is null;

如果要在列中禁用NULL值,可以在创建或修改表时使用NOT NULL约束。需要注意的是,如果表中已经包含数据,那么只有在表中每一行的值都非NULL 或是使用ALTER TABLE 命令的DEFAULT子句时,才可以为列设置NOT NULL 属性。下面的例子显示了修改emp表的sal列以禁用NULL值:

alter table emp modify

(sal not null);

注意,如果试图向sal 列中插入NULL 值,就会返回错误信息。

要诀

在创建表时对列指定NOT NULL约束会禁用NULL 值,而且可以避免与查询NULL值相关的性能问题。

下面的创建表语句为deptno列提供了一个默认值。如果在INSERT 操作时该列没有指定的值,就会使用默认值。如果指定了默认值,并且确实需要NULL值,就需要在该列中插入NULL。

create table employee

(empl_id number(8) not null, first_name varchar2(20) not null,

last_name varchar2(20) not null, deptno number(4) default 10);

insert into employee(empl_id, first_name, last_name)

values (8100, 'REGINA', 'NIEMIEC');

1 row created.

select *

from employee;

EMPL_ID FIRST_NAME           LAST_NAME             DEPTNO

---------- -------------------- -------------------- ----------

8100 REGINA               NIEMIEC                   10

insert into employee

values (8200, 'RICH', 'NIEMIEC', NULL);

1 row created.

select *

from employee;

EMPL_ID FIRST_NAME          LAST_NAME             DEPTNO

---------- -------------------- -------------------- ----------

8100 REGINA              NIEMIEC                  10

8200 RICH               NIEMIEC

要诀

NULL 值通常会抑制索引。在创建表时对列指定NOT NULL 或DEFAULT属性,可以帮助避免可能出现的性能问题。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.4.1 使用不等于运算符(<>、!=)
下一篇:2.4.3 使用LIKE
相关文章
图文推荐
3.6 存储管理工具Ce
3.4.5 Interleaving
3.4 Exadata存储架构
3.3.3 SDP协议
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站