背景:如果表中有一列的数据分布很不均匀,大部分是1,少部分是0,而且我们经常查询的刚好是0,在这种情况下,走全表扫描的话,有些浪费资源,如果对该列建立索引的话,那些值为1的索引数据又有些浪费,因为我们很少去查询值为1的数据,所以我们只对值为0的数据建立索引。
create table t6(status char(1));
begin
for i in 1..100000 loop
insert into t6 values('1');
end loop;
for i in 1..10 loop
insert into t6 values('0');
end loop;
end;
对status列建立索引
create index idx_t6_status on t6(status);
查询索引占用的块
select index_name, i.leaf_blocks
from user_indexes i
where index_name = upper('idx_t6_status')
INDEX_NAME LEAF_BLOCKS
1 IDX_T6_STATUS 182
看到索引叶子块有182个,占用的比较多
下面我们只对status='0'建立索引来减少索引叶子块
drop index idx_t6_status;
create index idx_t6_status on t6(decode(status,'0','0'));
INDEX_NAME LEAF_BLOCKS
1 IDX_T6_STATUS 1
可以看到索引叶子块只有1个,数量减少了很多
通过索引查询status值为'0'的数据
select * from t6 where decode(status, '0', '0') = '0'
执行计划如下
SELECT STATEMENT, GOAL = ALL_ROWS 2 29 87
TABLE ACCESS BY INDEX ROWID CARMOT_DEVELOP T6 2 29 87
INDEX RANGE SCAN CARMOT_DEVELOP IDX_T6_STATUS 1 389
分享到:
相关推荐
如果直接删除并重新创建聚集索引,那么所有的非聚集索引都需要被删除并重新建立两次,因为它们依赖于聚集索引的键来定位数据行。但是,通过`DROP_EXISTING`,你可以避免这个昂贵的过程,因为它会更新现有索引,而...
### Oracle建立索引详解 #### 一、索引的基本概念 在Oracle数据库中,索引是一种重要的数据结构,用于加速数据检索的过程。索引通过在数据表的基础上构建一种特殊的结构来实现这一目标,使得数据库系统在查找数据...
- 数据本身就是索引的一部分,即聚集索引的叶子节点包含了实际的数据行。 - 每张表只能拥有一个聚集索引,因为表中数据只能按照一种方式排序。 - 聚集索引通常占用的空间较小,大约为表大小的5%左右。 - 类比于...
创建好`Document`后,将其添加到`IndexWriter`,这样Lucene就会为这些字段建立索引。 当索引构建完成后,我们就可以实现搜索功能了。首先,创建一个`DirectoryReader`来读取已经建立的索引,然后使用`IndexSearcher...
然而,不是所有列都适合建立索引,尤其是在数据量不大或筛选结果导致大量行被检索的情况下,建立索引可能会得不偿失。在实际操作中,应结合业务需求、数据量和查询模式来决定何时、何处建立索引,以达到最佳的性能...
3. **分批创建索引**:对于大型表,可以考虑先创建部分索引,然后逐步添加更多的索引以避免一次性创建所有索引带来的性能冲击。 4. **使用并行创建索引**:在支持并行处理的环境中,可以利用`parallel`参数来加速...
### MySQL高级部分详解 #### 一、索引(Index) **定义:** 索引是数据库中用于加速数据检索的一种特殊数据结构。它包含了表中某些列的值及其对应的记录位置,使得查找数据变得更快。 **优点:** 1. **提高查询...
使用索引时应遵循一定的原则,如避免在频繁更新的列上创建过多索引,对常用于查询的字段建立索引,数据量小的表通常无需索引,以及在区分度高的列上建立索引等。 3. **索引的分类**: - **单列索引**:包括普通...
1. 针对频繁查询的列创建索引:根据SQL语句的执行计划,找出最常用于查询的列来建立索引。 2. 平衡读写性能:在考虑索引数量时,需要平衡读取速度和写入速度,避免过度索引。 3. 复合索引:对于多条件查询,可以创建...
并非所有的字段都需要建立索引,合理选择索引字段和类型对于优化数据库性能至关重要。以下是一些选择和优化索引的建议: - 为经常出现在WHERE子句中的字段创建索引。 - 对于频繁进行范围查询的字段,考虑使用聚集...
- 索引维护:索引会增加写操作的开销,频繁更新的列不宜建立索引。 - 存储空间:索引需要额外的存储空间,应权衡性能提升与存储成本。 四、索引优化策略 1. 唯一性:索引的唯一性有助于提高查询效率,避免冲突。 2....
而通过建立索引,数据库系统可以在查找数据时迅速定位到目标数据所在的位置,从而极大地提高查询速度。 #### 聚集索引与非聚集索引 在SQL Server中,主要提供了两种类型的索引——聚集索引(clustered index)和非...
此外,对于经常用于连接操作的列,建立索引也有助于提高查询效率。 #### 七、AND 条件下的索引使用 - **AND 条件**:当查询条件包含多个 AND 连接的条件时,如果这些条件对应的列都有索引,则可以利用索引来快速...
- `R`类与`public.xml`的关系表面上并不直接关联,但在实际使用中,我们通过`R.id`来查找资源,这就间接建立了联系。`public.xml`中的值对应于`resources.arsc`,而资源值则生成`R`类,使得通过`R`类的索引值可以...
(4)where 子句和索引:Oracle 根据用户在 where 子句中的定义找出满足查询要求的索引项(如根据一条 SQL 语句中的 where 和 and 部分指明的表列),检查可用的索引,选择能提供最快结果的索引。 (5)使用索引...
MySQL中的索引是一种提高查询效率的关键技术,它利用特定的数据结构,如B-Tree,对数据库表中的某一列或多列进行排序,使得存储引擎能够快速定位到数据行。索引优化是数据库性能优化的核心策略之一。 单列索引是...
之后,需要分析这些语句中Where条件子句所涉及的字段及其组合方式,并基于此初步判断哪些表的哪些字段应该建立索引。 建立索引时,通常需要遵循一些规则,例如: - 表的主键(Primary Key)和外键(Foreign Key)...