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

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值?

相关推荐

    SQL语句索引优化_sql索引降龙十八掌(Oracle)

    4. 避免NULL:NULL值会影响索引的效率,考虑是否允许NULL或使用默认值。 四、索引维护 1. 维护索引统计信息:定期执行ANALYZE命令更新表的统计信息,帮助优化器做出正确的选择。 2. 监控和调整:使用EXPLAIN PLAN...

    有关于oracle数据库的sql优化

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

    SQL优化-索引

    4. **避免使用NULL**:NULL值不能被索引,因此在WHERE子句中使用`IS NULL`或`IS NOT NULL`会导致索引失效。 5. **IN与EXISTS**:使用`EXISTS`通常比使用`IN`更高效,尤其是在大数据量的情况下。 6. **格式转换**:在...

    SQL应用:研究SqlServer中Bit字段索引性能问题.

    在数据库设计与优化领域,字段类型的选择及是否为特定字段创建索引是两个非常关键的问题。特别是对于像`Bit`这种用于存储布尔值的数据类型,是否应该为其创建索引,以及创建索引后对查询性能的影响等问题一直存在...

    mysql数据库sql优化

    - 不使用覆盖索引: ```sql EXPLAIN SELECT * FROM staffs WHERE NAME='July' AND age=22 AND pos='manager'; ``` - 使用覆盖索引: ```sql EXPLAIN SELECT name, age, pos FROM staffs WHERE NAME='July' ...

    sqlserver优化笔记

    #### 二、索引管理与优化 **2.1 合理设计索引** - **问题描述**:不当的索引设计可能导致性能低下。 - **解决方案**: - 对于频繁进行范围查询的列,考虑建立聚集索引。 - 对于多列查询,考虑建立复合索引。 - ...

    索引的SQL语句优化

    6. **去掉Where子句中的ISNULL和ISNOTNULL**:直接使用`NULL`值进行比较通常更高效。 7. **索引提高数据分布不均匀时查询效率**:在数据分布不均匀的列上创建索引,可以显著提高查询效率,尤其是对于那些具有大量...

    数据库SQL优化大总结之 百万级数据库优化方案.pdf

    二、数据库SQL优化之避免NULL值 2. 尽量避免在where子句中对字段进行NULL值判断,以免引擎放弃使用索引而进行全表扫描。 三、数据库SQL优化之避免!=和操作符 3. 尽量避免在where子句中使用!=或操作符,以免引擎...

    SQL优化-索引word19页

    2. 唯一索引:允许有NULL值,但除NULL外的所有值都必须唯一。 3. 非唯一索引:允许重复值,是最常见的索引类型。 4. 全文索引:适用于文本搜索,能查找文档中的关键词。 5. 复合索引:由多个列组成的索引,按列的...

    基于索引的SQL语句优化

    6. **去掉Where子句中的IS NULL和IS NOT NULL**:IS NULL和IS NOT NULL操作通常不能使用索引,如果可能,尝试通过其他方式实现相同功能。 7. **索引提高数据分布不均匀时查询效率**:对于数据分布极不均匀的列,...

    sql单表优化,公司项目常用

    5. 单值索引:单列索引,一个表可以多个单值索引。 6. 复合索引:多个列构成的索引。 索引创建 索引可以通过两种方式创建: 方式一:使用 create 语句创建索引,例如: ``` create index dept_index on tb(dept)...

    sql优化、索引的建立和运用以及多表连接建索引的拙劣见解

    综上所述,通过对SQL语句进行合理的优化,并恰当地使用索引,可以在很大程度上提升数据库的查询性能。此外,在多表连接的情况下,合理构建索引也是十分必要的。这些实践不仅能够帮助开发者写出更高效的SQL语句,还...

    尚硅谷mysql高级:索引、优化

    3. 唯一索引:与主键索引类似,但允许NULL值。它可以用于确保列中的数据唯一性,但不强制作为主键。 4. 聚集索引与非聚集索引:聚集索引的叶子节点直接包含行数据,而非聚集索引的叶子节点包含指向实际数据行的指针...

    SQL实验六:索引和数据完整性的使用[定义].pdf

    例如,我们使用以下语句重建了Employees表中的所有索引: ``` USE YGGL GO ALTER INDEX ALL ON Employees REBUILD ``` 这将重建Employees表中的所有索引。 三、删除索引 删除索引是指删除已有的索引。在本实验中,...

    1从案例中推导SQL优化的总体思路与误区

    ### SQL优化的总体思路与误区 #### 一、SQL优化的重要性 SQL(Structured Query Language)是一种用于管理和操作关系型数据库的标准语言。随着大数据时代的到来,企业和组织对数据处理的需求日益增加,而SQL作为...

    oracle数据库索引与sql的优化

    ### Oracle数据库索引与SQL优化 在Oracle数据库的日常管理和维护过程中,索引与SQL语句的优化是非常重要的环节。合理的索引设计和高效的SQL编写能够显著提高数据查询的速度、减少系统资源消耗,并最终提升整个...

    SQL优化实践.pdf

    1. 善用索引:避免在索引列上进行计算,选择过滤性好的列作为索引,为表连接字段创建索引,尽量实现索引覆盖。 2. 替代子查询:使用表连接代替子查询,以减少查询的复杂度和提高性能。 3. 注意数据类型转换:确保SQL...

    高性能:有哪些常见的 SQL 优化手段?

    4. 避免在 WHERE 子句中对字段进行 NULL 检查:NULL值不会被索引覆盖,可以考虑使用COALESCE或IFNULL函数。 三、合理使用JOIN操作 1. 减少JOIN数量:过多的JOIN会增加计算复杂性,尽量简化查询逻辑。 2. 优化JOIN...

    SQL优化.pdf

    别名使用规则是SQL优化中非常基础但又非常重要的一个方面。首先,建议使用AS关键字来显示声明列或表的别名。在SQL语句中,使用AS关键字可以使别名的定义更加明确,减少歧义,使得SQL语句的阅读者更容易理解其含义。...

Global site tag (gtag.js) - Google Analytics