1)索引唯一扫描 如果查询时是通过unique或primary key约束来保证只返回一条数据,那么优化器就会选择索引唯一扫描,这是访问一条数据的最快方式。
2)索引范围扫描
索引键非唯一,当遇到如下条件时会使用索引范围扫描:
1.col=:b1
2.col<:b1
3.col>:b1
3)索引降序范围扫描
与2)中的情况相同,只不过2)默认是按照升序进行查找的,而这里是按降序进行查找,如:
select line_item_id,order_id from order_items where order_id<:b1 order by order_id desc;
4)跳跃式索引(Skip Scan Index)。当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用到SS,另外通过使用提示index_ss(CBO下)来强制使用SS。跳跃式索引使复合索引从逻辑上分为几个小的子索引,分的条件就是复合索引列的第一个字段,可以这样理解,Oracle将索引从逻辑上划分为a.num_distinct个子索引,每次对一个子索引进行扫描。因此SS的索引扫描成本为a.num_distinct.而且使用SS的条件需要第一列的distinct num要足够小
5)index full scan和Index Fast Full Scan(全索引扫描和快速全索引扫描)
index full scan和index fast full scan是指同样的东西吗?答案是no。两者虽然从字面上看起来差不多,但是实现的机制完全不同。我们一起来看看两者的区别在哪里?
首先来看一下IFS,FFS能用在哪里:在一句sql中,如果我们想搜索的列都包含在索引里面的话,那么index full scan 和 index fast full scan 都可以被采用代替full table scan。比如以下语句:
SQL> CREATE TABLE TEST AS SELECT * FROM dba_objects WHERE 0=1;
SQL> CREATE INDEX ind_test_id ON TEST(object_id);
SQL> INSERT INTO TEST
SELECT *
FROM dba_objects
WHERE object_id IS NOT NULL AND object_id > 10000
ORDER BY object_id DESC;
17837 rows created.
SQL> analyze table test compute statistics for table for all columns for all indexes;
Table analyzed.
SQL> set autotrace trace;
SQL> select object_id from test;
17837 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=68 Card=17837 Bytes=71348)
1 0 TABLE ACCESS (FULL) OF 'TEST' (Cost=68 Card=17837 Bytes=71348)
这时候Oracle会选择全表扫描,因为 object_id 列默认是可以为null的,来修改成 not null:
SQL>alter table test modify(object_id not null);
SQL> select object_id from test;
17837 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=11 Card=17837 Bytes=71348)
1 0 INDEX (FAST FULL SCAN) OF 'IND_TEST_ID' (NON-UNIQUE) (Cost=11 Card=17837 Bytes=71348)
当然我们也可以使用index full scan:
SQL> select/*+ index(test ind_TEST_ID)*/ object_id from test;
17837 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=41 Card=17837 Bytes=71348)
1 0 INDEX (FULL SCAN) OF 'IND_TEST_ID' (NON-UNIQUE) (Cost=101 Card=17837 Bytes=71348)
我们看到了两者都可以在这种情况下使用,那么他们有什么区别呢?有个地方可以看出两者的区别, 来看一下两者的输出结果,为了让大家看清楚一点,我们只取10行。
INDEX FAST FULL SCAN
SQL> select object_id from test where rownum<11;
OBJECT_ID
----------
66266
66267
66268
66269
66270
66271
66272
66273
66274
66275
10 rows selected.
INDEX FULL SCAN
SQL> select/*+ index(test ind_TEST_ID)*/ object_id from test where rownum<11;
OBJECT_ID
----------
10616
12177
12178
12179
12301
13495
13536
13539
13923
16503
10 rows selected.
可以看到两者的结果完全不一样,这是为什么呢?这是因为当进行index full scan的时候oracle定位到索引的root block,然后到branch block(如果有的话),再定位到第一个leaf block, 然后根据leaf block的双向链表顺序读取。它所读取的块都是有顺序的,也是经过排序的。
而index fast full scan则不同,它是从段头开始,读取包含位图块,root block,所有的branch block, leaf block,读取的顺序完全有物理存储位置决定,并采取多块读,没次读取db_file_multiblock_read_count个块。
使用这两种索引扫描需要表的索引字段至少有一个是not null限制。
快速全索引扫描比普通索引扫描速度快是因为快速索引扫描能够多块读取,并且能并行处理。
普通快速索引扫描可以减少排序操作。
6)Index Join索引连接
我们都知道表与表之间可以连接,那么索引与索引之间呢?当然也可以。索引连接是一种索引之间的hash连接,当查找的字段都已经包括在索引中时,就不需要去访问表的内容,直接通过访问多个索引就能得到结果。Index join只能在CBO使用的情况下进行。
分享到:
相关推荐
MySQL提供了几种优化策略,其中两种是利用索引来加速GROUP BY:松散索引扫描(Loose Index Scan)和紧凑索引扫描( Tight Index Scan)。 **松散索引扫描(Loose Index Scan)** 松散索引扫描适用于GROUP BY条件是...
数据库索引主要有以下几种类型: 1. 主键索引:这是唯一索引,确保索引字段的值在表中是唯一的。主键索引不允许有空值,并且一个表只能有一个主键。 2. 唯一索引:与主键索引类似,它也确保索引字段的值唯一,但并...
索引可以分为以下几种: * 单列索引 * 组合索引 * 唯一索引 * 主键索引 7.索引的使用 索引的使用可以根据实际情况选择,例如: * 对频繁查询的字段建立索引 * 对插入、更新、删除操作频繁的字段建立索引 * 对...
在某些特定情况下,Oracle数据库优化器可能会选择全表扫描(Full Table Scan, FTS)而非索引扫描(Index Scan)。这种情况的发生并非由于优化器的错误设计或实现,而是基于成本评估机制的一种合理选择。下面将详细...
索引可以分为普通索引、唯一索引、主键索引和全文索引四种。普通索引是最基本的索引,它没有任何限制。唯一索引保证了每个索引值的唯一性。主键索引是一种特殊的唯一索引,它同时也是一种聚簇索引。全文索引是用于...
在Oracle中,索引主要有以下几种类型: 1. **B树索引**:这是最常见的索引类型,类似二叉搜索树,通过比较键值来快速定位数据。B树索引适用于经常进行单行或范围查询的情况。 2. **位图索引**:适合在低选择性列...
### 几种常用的表连接方式详解 在数据库领域,表连接是数据检索和管理的核心技术之一,用于将多个数据表中的信息结合在一起,形成更完整、更有意义的数据集。本文将深入探讨四种常用的表连接方式:嵌套循环连接、...
如果使用索引,则扫描索引文件,根据索引项,找到元祖的地址,然后再根据地址找到数据。由于索引文件很小,而且索引有顺序,可以极大地提高查询的效率。 索引的存放内容 ------------------ 索引列的值(有序) ...
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个...
在 SAP BW 中,还有其他几种方式来提高查询效率。例如,可以使用“FULL”提示来指定使用全表扫描: SELECT * FROM /BIC/AZ2001ON300%_HINTS ORACLE 'FULL("/BIC/AZ2001ON300")' 这可以强制数据库使用全表扫描,...
下面将详细探讨几种常见的索引失效情况及其原因。 首先,索引不存储`NULL`值。在MySQL中,单列索引不会存储`NULL`值,而复合索引则不存储所有列都是`NULL`的值。这是因为`NULL`值在比较操作中具有特殊性,不适用于...
它们分为以下几种类型: - **非空约束(NOT NULL)**: 非空约束不允许字段值为NULL,确保该字段始终有值。 - **唯一约束(UNIQUE)**: 这种约束保证字段中的每个值都是唯一的,但允许NULL值。可以应用于单个字段...
其中,B树索引是最常见的一种,它通过分层结构快速定位数据行。位图索引则适合于低基数(即某个字段值较少)的列,通过位图方式存储,节省空间但不适用于高并发查询。 创建索引有多种方式,如使用`CREATE INDEX`...
可以通过以下几种方式收集统计信息: 1. **使用`ANALYZE TABLE`命令**: ```sql ANALYZE TABLE GD_YX_ZYTDYH COMPUTE STATISTICS FOR TABLE FOR ALL INDEXED COLUMNS; ``` 此命令将为表`GD_YX_ZYTDYH`中的所有...
接着,我们了解几种常见的文件组织形式: 1. 顺序文件:这是最基础的文件组织形式,数据按照一定的顺序存储,查找时需从头开始逐条扫描。 2. 索引文件:如上所述,带有索引表的文件,可以提供快速访问,因为索引表...
聚集索引和非聚集索引的主要区别在于数据存储的方式。在聚集索引中,索引和数据是合一的,而在非聚集索引中,索引是单独的结构,需要通过书签来定位实际数据。因此,非聚集索引查询通常比聚集索引慢,因为需要额外的...
在SQL Server中,表中的数据行与索引的叶子节点是同一块存储区域,这意味着每个表只能有一个聚集索引,因为数据行只能按照一种方式排列。例如,汉语字典的正文部分按照拼音排序就是一个聚集索引的例子。当查询的范围...
**ALTER INDEX REBUILD与ALTER INDEX REBUILD ONLINE的主要区别在于扫描方式的不同:** 1. **扫描方式不同:** - `REBUILD`命令使用`INDEX FAST FULL SCAN`(或`TABLE FULL SCAN`,具体取决于统计信息的成本)来...
另一方面,以下几种情况不适合创建索引: 1. **很少使用的列**:如果一个列很少被查询到,创建索引不会带来明显的性能提升。 2. **数据值很少的列**:如果一个列的取值很少,创建索引的意义不大。 3. **大文本类型...
1. **数据唯一性差的字段**:如果字段的取值非常有限,例如性别字段只有"男"和"女"两种可能,建立索引可能效果不佳,因为索引树的深度浅,查找效率接近于全表扫描。 2. **频繁更新的字段**:对于经常改变的字段,如...