`
shawn427
  • 浏览: 3919 次
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

SQL优化:NULL值与索引的使用

阅读更多
  NULL是数据库中特有的数据类型,当一条记录的某个列为NULL,则表示这个列的值是未知的、是不确定的。简单的说,由于NULL存在着无数的可能,因此两个NULL不是相等的关系,同样也不能说两个NULL就不相等,或者比较两个NULL的大小,这些操作都没有意义,得不到一个确切的答案。
那么,一个字段有可能存在空值是否适合创建索引呢?
  大多数人都听说过这样一句话,索引不存储NULL值。这句话其实比不严谨。如果采用比较严谨的方式来说:B树索引不存储索引列全为空的记录。如果把这句话用在单列索引上,就是前面提到的B树索引不存储NULL。
首先索引分为BTREE和BITMAP两种,对于BTREE索引,是不存储NULL值的,而BITMAP索引,则存储NULL值。其次,从索引列的个数来划分,索引分为单列索引和复合索引,对于单列索引来说很简单,如果一条记录中这个索引字段为空,那么索引不会保存这条记录的信息。但是对于复合索引,由于存在着多个列,如果某一个索引列不为空,那么索引就会包括这条记录,即使其他所有的所有列都是NULL值。
  究竟日常应用中对可能为空的列如何创建索引,ORACLE又如何使用这些索引呢?经过测试,简单总结为以下两点:
I:对于经常单列访问字段中非空值的情况,直接创建单列索引。
II:对于经常查询字段IS NULL又希望使用索引的情况,则需要结合查询条件选择合适的非空字段创建组合索引。
同时,在日常应用中请注意:
I: 如果要查询一个表的记录数,可以通过全表扫描的方法,也可以通过COUNT非空列记录数的方法,如果此时非空列上存在索引,就可以直接访问索引获得数据。
II: 要查询一个可能为空字段的非空记录数,如果该列上建立了单列索引,直接访问索引可以获得数据,但若想通过索引获得该列所有的记录数(即全表数据量),即使你固定执行了计划,强制走该列的索引,Oracle也会自动选择全表扫描。这应该也是我们倡导不可能为空的字段一定要添加非空约束的原因之一吧。
 
分享到:
评论
1 楼 wsgwz_2000 2009-10-16  
有个让我困扰的问题:
为什么BTREE索引不索引NULL值?而BITMAP索引却索引NULL值?

相关推荐

    有关于oracle数据库的sql优化

     任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。  2. 联接列  对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表...

    mysql数据库sql优化

    1. SQL优化 1 1.1. 优化实战 1 1.1.1. 策略1.尽量全值匹配 1 1.1.2. 策略2.最佳左前缀法则 2 1.1.3. 策略3.不在索引列上做任何操作 2 1.1.4. 策略4.范围条件放最后 3 1.1.5. 策略5.覆盖索引尽量用 3 1.1.6. 策略6.不...

    SQL 优化原则

    但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高...

    SQL性能优化

    5. 索引字段,尽量避免值为 null 6. 复合索引的建立需要仔细分析;尽量考虑用单字段索引代替:  正确选择复合索引中的第一个字段,一般是选择性较好的且在 where 子句中常的字段上。  复合索引的几个字段是否...

    SQL 语法 SQL 总结 SQL教程

    SQL 基础 SQL 首页 SQL 简介 SQL 语法 SQL select SQL distinct SQL where SQL AND & OR SQL Order By SQL insert SQL update SQL delete SQL 高级 SQL Top ...SQL 快速索引 SQL 总结

    Mysql面试过关!(详解:索引+常用引擎+常见问题+sql调优)

    3.9 查询条件使用is null时正常走索引,使用is not null时,不走索引 3.10 查询条件使用not in、not exists时,如果是主键则走索引,如果是普通索引,则索引失效 3.11 当查询条件涉及到order by、l

    导出创建用户下各个对象数据结构的sql语句的脚本,包括表、视图、索引、约束等等

    每个存储过程有多个参数,可以控制输出何种形式的内容,如可以只生成删除表的sql,可以在生成的创建表与索引的语句上加上storage子句等等。 <br/>运行 user_dll_sql.sql的准备工作: <br/>1. ...

    Sql Server 索引使用情况及优化的相关Sql语句分享

    代码如下: –Begin Index(索引) 分析优化的相关 Sql — 返回当前数据库所有碎片率大于25%的索引 — 运行本语句会扫描很多数据页面 — 避免在系统负载比较高时运行 — 避免在系统负载比较高时运行 declare @dbid int ...

    唯一非聚集索引变量传入时索引失效解决方案

    而且随着数据量的增大,每次重新编译索引, 本身就导致SQL语句变慢. 最终解决方案: 唯一非聚集索引留着, 再添加一个 非聚集索引,保留两个索引, 终于搞定了. CREATE UNIQUE NONCLUSTERED INDEX [IX_SF_CP_Detail_MAC...

    sql server 列索引

    NULL 博文链接:https://onlyor.iteye.com/blog/1481804

    Oracle DBA手记3-数据库性能优化与内部原理解析 中文版

    “sql 与sql 优化”,分别讲解了sql 的执行计划,sql profile 的使用,以及oracle 中的null 值解析;“内部原理与优化”,分别介绍了oracle 的索引分裂、tx 锁等待、闩锁原理、逻辑读写、隐含参数与latch 原理等的...

    Mysql优化策略(推荐)

    1、字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。 2、尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM...

    SQL Server 2008数据库设计与实现

    第三部分深入探讨了SQL Server若干方面的技术细节,如数据保护、索引、并发访问等。通过将理论融入数据库实践,清晰地讲解了关系型数据库的设计原则,完整地展示了如何进行良好的关系型数据库设计,深入揭示了SQL ...

    MySQL 创建索引(Create Index)的方法和语法结构及例子

    CREATE INDEX Syntax CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON ... HASH | RTREE} 代码如下: — 创建无索引的表格 create table testNoPK ( id int not null, name varchar(10) ); — 创建

    (第二卷)Microsoft SQL Server 2008技术内幕:T-SQL语言基础

    2.4 NULL值 2.5 同时操作(ALL-AT-ONCE OPERATION) 2.6 处理字符数据 2.7 处理日期和时间数据 2.8 查询元数据 2.9 总结 2.10 练习 2.11 解决方案 第3章 联接查询 3.1 交叉联接 3.2 内联接 ...

    优化数据库的方法.doc

    SQL语句优化的原则: 1、使用索引来更快地遍历表 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下, 数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测 上...

    数据库-性能优化篇-1(1).docx

    1.对sql语句优化:就是能分开写的语句就分开写,不要一次性就解决,这样对效率来说是很大的开销的。...4.避免使用is not null、in等一些无法让系统使用索引操作的词。 5.合理使用exists,not exists字句。

    30个mysql千万级大数据SQL查询优化技巧详解

    2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select...

    数据库_性能优化篇-2(1).docx

    1.对sql语句优化:就是能分开写的语句就分开写,不要一次性就解决,这样对效率来说是很大的开销的。...4.避免使用is not null、in等一些无法让系统使用索引操作的词。 5.合理使用exists,not exists字句。

Global site tag (gtag.js) - Google Analytics