`
Fred_Han
  • 浏览: 148169 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

对部分行建立索引

 
阅读更多

背景:如果表中有一列的数据分布很不均匀,大部分是1,少部分是0,而且我们经常查询的刚好是0,在这种情况下,走全表扫描的话,有些浪费资源,如 果对该列建立索引的话,那些值为1的索引数据又有些浪费,因为我们很少去查询值为1的数据,所以我们只对值为0的数据建立索引。

 

 

Sql代码  收藏代码
  1. create table t6(status char(1));  
  2.   
  3. begin      
  4.   for i in 1..100000 loop  
  5.     insert into t6 values('1');  
  6.   end loop;  
  7.   for i in 1..10 loop  
  8.     insert into t6 values('0');  
  9.   end loop;  
  10. end;  

 对status列建立索引

 

Sql代码  收藏代码
  1. create index idx_t6_status on t6(status);  

 查询索引占用的块

 

Sql代码  收藏代码
  1. select index_name, i.leaf_blocks  
  2.   from user_indexes i  
  3.  where index_name = upper('idx_t6_status')  
Sql代码  收藏代码
  1. INDEX_NAME  LEAF_BLOCKS  
  2. X_T6_STATUS 182  
看到索引叶子块有182个,占用的比较多
 
下面我们只对status='0'建立索引来减少索引叶子块
Sql代码  收藏代码
  1. drop index idx_t6_status;  
  2.   
  3. create index idx_t6_status on t6(decode(status,'0','0'));  
  INDEX_NAME LEAF_BLOCKS
Sql代码  收藏代码
  1. 1   IDX_T6_STATUS   1  

 可以看到索引叶子块只有1个,数量减少了很多

 
通过索引查询status值为'0'的数据
Sql代码  收藏代码
  1. select * from t6 where decode(status, '0''0') = '0'  
 执行计划如下
Sql代码  收藏代码
  1. SELECT STATEMENT, GOAL = ALL_ROWS           2   29  87  
  2.  TABLE ACCESS BY INDEX ROWID    CARMOT_DEVELOP  T6  2   29  87  
  3.   INDEX RANGE SCAN  CARMOT_DEVELOP  IDX_T6_STATUS   1   389   
  转自:http://yufeng0471.iteye.com/blog/1059903
分享到:
评论

相关推荐

    数据库查询速度优化 建立索引

    为了提高数据库查询的效率,一种常用的方法是建立索引,它能够显著加速数据检索过程,是数据库查询速度优化不可或缺的一部分。 索引可以比喻为一本书的目录,它不是数据本身,而是一个指向数据位置的指针结构,使得...

    SQL Server 2000数据库中如何重建索引

    如果直接删除并重新创建聚集索引,那么所有的非聚集索引都需要被删除并重新建立两次,因为它们依赖于聚集索引的键来定位数据行。但是,通过`DROP_EXISTING`,你可以避免这个昂贵的过程,因为它会更新现有索引,而...

    oracle建立索引

    ### Oracle建立索引详解 #### 一、索引的基本概念 在Oracle数据库中,索引是一种重要的数据结构,用于加速数据检索的过程。索引通过在数据表的基础上构建一种特殊的结构来实现这一目标,使得数据库系统在查找数据...

    索引介绍聚集索引和非聚集索引

    - 数据本身就是索引的一部分,即聚集索引的叶子节点包含了实际的数据行。 - 每张表只能拥有一个聚集索引,因为表中数据只能按照一种方式排序。 - 聚集索引通常占用的空间较小,大约为表大小的5%左右。 - 类比于...

    用LUCENE连击MYSQL建立索引并搜索的JAVA代码。

    创建好`Document`后,将其添加到`IndexWriter`,这样Lucene就会为这些字段建立索引。 当索引构建完成后,我们就可以实现搜索功能了。首先,创建一个`DirectoryReader`来读取已经建立的索引,然后使用`IndexSearcher...

    asp.net 索引学习

    主键是表中唯一标识每行的列,确保数据的唯一性和完整性,通常建立在主键上的索引称为聚簇索引,它的叶子节点直接包含数据行。非聚簇索引则不按照数据的物理顺序存储,而是包含指向数据行的指针。 索引的性能影响...

    索引思考1

    然而,不是所有列都适合建立索引,尤其是在数据量不大或筛选结果导致大量行被检索的情况下,建立索引可能会得不偿失。在实际操作中,应结合业务需求、数据量和查询模式来决定何时、何处建立索引,以达到最佳的性能...

    [Oracle]如何在亿级记录表中创建索引

    3. **分批创建索引**:对于大型表,可以考虑先创建部分索引,然后逐步添加更多的索引以避免一次性创建所有索引带来的性能冲击。 4. **使用并行创建索引**:在支持并行处理的环境中,可以利用`parallel`参数来加速...

    mysql高级部分--包含索引建立优化_函数_存储过程_触发器_及游标

    ### MySQL高级部分详解 #### 一、索引(Index) **定义:** 索引是数据库中用于加速数据检索的一种特殊数据结构。它包含了表中某些列的值及其对应的记录位置,使得查找数据变得更快。 **优点:** 1. **提高查询...

    MYSQL索引知识

    使用索引时应遵循一定的原则,如避免在频繁更新的列上创建过多索引,对常用于查询的字段建立索引,数据量小的表通常无需索引,以及在区分度高的列上建立索引等。 3. **索引的分类**: - **单列索引**:包括普通...

    数据库索引设计与优化

    1. 针对频繁查询的列创建索引:根据SQL语句的执行计划,找出最常用于查询的列来建立索引。 2. 平衡读写性能:在考虑索引数量时,需要平衡读取速度和写入速度,避免过度索引。 3. 复合索引:对于多条件查询,可以创建...

    详解SQL数据库索引原理

    并非所有的字段都需要建立索引,合理选择索引字段和类型对于优化数据库性能至关重要。以下是一些选择和优化索引的建议: - 为经常出现在WHERE子句中的字段创建索引。 - 对于频繁进行范围查询的字段,考虑使用聚集...

    SQL Server 2000完结篇系列之七:SQL Server 2000索引优化详解

    - 索引维护:索引会增加写操作的开销,频繁更新的列不宜建立索引。 - 存储空间:索引需要额外的存储空间,应权衡性能提升与存储成本。 四、索引优化策略 1. 唯一性:索引的唯一性有助于提高查询效率,避免冲突。 2....

    深入浅出理解索引结构

    而通过建立索引,数据库系统可以在查找数据时迅速定位到目标数据所在的位置,从而极大地提高查询速度。 #### 聚集索引与非聚集索引 在SQL Server中,主要提供了两种类型的索引——聚集索引(clustered index)和非...

    索引扫描测试数据

    当执行计划选择不理想时,例如选择全索引扫描而非利用索引进行范围扫描或部分行扫描,查询性能会受到影响。 优化索引的使用可以通过调整查询语句来实现。例如,在"orderbyid"查询的情况下,由于id是主键,数据页...

    安卓方案类-游戏发行切包资源索引冲突解决方案.docx

    - `R`类与`public.xml`的关系表面上并不直接关联,但在实际使用中,我们通过`R.id`来查找资源,这就间接建立了联系。`public.xml`中的值对应于`resources.arsc`,而资源值则生成`R`类,使得通过`R`类的索引值可以...

    Oracle数据库中的索引管理技术.pdf

    (4)where 子句和索引:Oracle 根据用户在 where 子句中的定义找出满足查询要求的索引项(如根据一条 SQL 语句中的 where 和 and 部分指明的表列),检查可用的索引,选择能提供最快结果的索引。 (5)使用索引...

    SQL中索引的原理.doc

    另一个常见的误区是,开发者往往没有考虑到索引对数据库性能的双刃剑效应。在不适当的场合建立索引不仅不能提高效率,反而会增加数据库维护的负担,占用存储空间,并降低写入操作的速度。因此,正确的做法是在充分...

Global site tag (gtag.js) - Google Analytics