Oracle索引扫描方式
文章目录
- 0、参考资料
- 1、索引扫描方式和索引类型概述
- 2、索引唯一扫描(index unique scan)
- 3、索引范围扫描(index range scan)
- 4、索引跳跃扫描(index skip scan)
- 5、索引全扫描(index full scan)
- 6、索引快速扫描(index fast full scan)
0、参考资料
Oracle Database Performance Tuning Guide -> The Query Optimizer -> Overview of Optimizer Access Paths
Database Concepts -> Part I Oracle Relational Data Structures -> 3 Indexes and Index-Organized Tables -> Index Scans
Darl Kuhn 写的《oracle索引技术》-> 索引扫描
1、索引扫描方式和索引类型概述
关于索引的类型,oracle官方的定义中有如下:
参考:Database Concepts -> Part I Oracle Relational Data Structures -> 3 Indexes and Index-Organized Tables -> Types of Indexes
- 按照数据结构分为B-Tree索引和非B-Tree索引,其中每个大类下又细分为:
B-Tree索引:
B-Tree 索引子类 | 简单描述 |
---|---|
Index-organized tables | 索引组织表 |
Reverse key indexes | 反转索引 |
Descending indexes | 倒排索引 |
B-tree cluster indexes | 聚簇索引 |
非B-Tree索引:
类型 | 简单描述 |
---|---|
Bitmap and bitmap join indexes | bitmap索引 |
Function-based indexes | 基于函数的索引 |
Application domain indexes | 应用程序域索引 |
- 按照约束特点来分:
create index创建的索引属于普通索引(非唯一索引)
create unique index创建的索引属于唯一索引
下面来说索引扫描方式:
Oracle提供了常见的五种索引扫描类型,根据具体索引类型、数据分布、约束条件以及where限制的不同进行选择:
- 索引唯一扫描(index unique scan)
- 索引范围扫描(index range scan)
- 索引跳跃扫描(index skip scan)
- 索引全扫描(index full scan)
- 索引快速扫描(index fast full scan)
2、索引唯一扫描(index unique scan)
索引唯一扫描,仅仅针对唯一索引的扫描,且仅适用于等值(=)条件的查询。从结果集看,至多返回一条记录。
具体情况分析:
对于单一列建立的索引(单一索引),当索引属于唯一索引,在检索条件中,使用该索引进行检索,且检索值不是null时,会使用“索引唯一扫描”
对于单一列建立的索引(单一索引),当索引属于唯一索引,在检索条件中,使用该索引进行检索,且检索值等于null时,会使用“全表扫描”
对于多个列建立的索引(组合索引),当索引属于唯一索引,且检索条件中,使用该组合索引进行检索,且检索列使用组合索引涉及的所有列时,会使用“索引唯一扫描”
需要注意:
对于组合索引,若其中涉及的部分列或所有列,在同一条记录上存在null值。当使用完整的组合索引列作为检索条件,且使用该null值进行该条记录的检索时,不会使用“索引唯一扫描”
示例:
–创建唯一索引
create unique index ind_test_normal on test_normal(empno,ENAME,SAL);
Index created.select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS from user_indexes where TABLE_NAME='TEST_NORMAL';INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
------------------------- --------------------------- --------------- ---------
IND_TEST_NORMAL NORMAL TEST_NORMAL UNIQUE
–查询记录并查看执行计划
select * from TEST_NORMAL where empno=7369 and ENAME='SMITH' and sal=800;EMPNO ENAME JOB SAL
---------- ---------- --------- ----------7369 SMITH CLERK 800Execution Plan
----------------------------------------------------------
Plan hash value: 1399315988
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes|Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1| 39| 1 (0)| 00:00:01|
| 1 | TABLE ACCESS BY INDEX ROWID| TEST_NORMAL | 1| 39| 1 (0)| 00:00:01|
|* 2 | INDEX UNIQUE SCAN | IND_TEST_NORMAL| 1| | 0 (0)| 00:00:01|
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------2 - access("EMPNO"=7369 AND "ENAME"='SMITH' AND "SAL"=800)Statistics
----------------------------------------------------------0 recursive calls0 db block gets2 consistent gets16 physical reads0 redo size581 bytes sent via SQL*Net to client458 bytes received via SQL*Net from client1 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processed
3、索引范围扫描(index range scan)
索引范围扫描,不仅可以针对唯一索引,也可以针对非唯一索引。从结果集看,可以是一条记录,也可以是多条记录。
具体情况分析:
对于单一列建立的索引(单一索引),当索引属于唯一索引,在检索条件中,使用该索引进行检索,且使用范围的操作符(>,<,>=,<=,between),会使用“索引范围扫描”。
对于单一列建立的索引(单一索引),当索引属于非唯一索引,在检索条件中,使用该索引进行检索,且检索值不是null值,会使用“索引范围扫描”。
对于多个列建立的索引(组合索引),当索引属于唯一索引,在检索条件中,使用该索引进行检索,且检索列使用组合索引涉及的部分列,但必须存在组合索引的引导列(创建组合索引时指定的第一列)时,会使用“索引范围扫描”。
对于多个列建立的索引(组合索引),当索引属于非唯一索引,在检索条件中,使用该索引进行检索,检索列涉及组合索引的部分列或者全部列,但必须存在组合索引的引导列(创建组合索引时指定的第一列)时,会使用“索引范围扫描”。
需要注意:
对于组合索引,当一条记录的引导列存在null值,当检索条件中,针对该条记录,仅使用该引导列进行检索时,不会使用“索引范围扫描”。
对于组合索引,当一条记录的引导列存在null值,当检索条件中,针对该条记录,在使用该引导列进行检索的同时,使用组合索引的其他列且这些列针对该条记录的列值不是null值,一并进行检索,会使用“索引范围扫描”。
示例:
–创建普通索引
create index ind_test_normal on test_normal(empno,ENAME,SAL);
Index created.
–验证普通索引创建情况,确认为非唯一索引
select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS from user_indexes where TABLE_NAME='TEST_NORMAL';INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
------------------------- --------------------------- --------------- ---------
IND_TEST_NORMAL NORMAL TEST_NORMAL NONUNIQUE
–查询记录并观察执行计划,此时扫描类型为index range scan
select * from TEST_NORMAL where empno=7369 and ENAME='SMITH' and sal=800;EMPNO ENAME JOB SAL
---------- ---------- --------- ----------7369 SMITH CLERK 800Execution Plan
-----------------------------------------------
Plan hash value: 67814702
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 18 | 2 (0)| 00:00:01|
| 1 | TABLE ACCESS BY INDEX ROWID| TEST_NORMAL | 1 | 18 | 2 (0)| 00:00:01|
|* 2 | INDEX RANGE SCAN | IND_TEST_NORMAL| 1 | | 1 (0)| 00:00:01|
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------2 - access("EMPNO"=7369 AND "ENAME"='SMITH' AND "SAL"=800)Statistics
----------------------------------------------------------0 recursive calls0 db block gets3 consistent gets16 physical reads0 redo size717 bytes sent via SQL*Net to client469 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processed
4、索引跳跃扫描(index skip scan)
该索引扫描方式主要发生在组合索引上,且组合索引的引导列未被指定在检索条件中的情况下发生。
在组合索引中,无论该索引是否为唯一索引。当引导列未被指定在检索条件的情况下,可能会发生“索引跳跃扫描”
以下内容摘引自http://book.51cto.com/art/201312/422441.htm
对于组合索引,在无前导列的情况下还能使用索引,是因为Oracle帮我们对该索引的前导列的所有distinct值做了遍历。
所谓的对目标索引的所有distinct值做遍历,其实际含义相当于对原目标SQL做等价改写(即把要用的目标索引的所有前导列的distinct值都加进来)。例如:create index idx_employee on employee(gender,employee_id),表数据量10000行,其中gender列只有“M”跟“F”值。
当执行select * from employee where employee_id = 100时,相当于执行了等价改写,改写为:
select * from employee where gender = 'F' and employee_id = 100
union all
select * from employee where gender = 'M' and employee_id = 100;因此,Oracle中的索引跳跃式扫描仅仅适用于那些目标索引前导列的distinct值数量较少、后续非前导列的可选择性又非常好的情形,
因为索引跳跃式扫描的执行效率一定会随着目标索引前导列的distinct值数量的递增而递减。否则将执行全表扫描。
示例:
–查询测试表的总数据量
–该表总数据为22928行
select count(*) from test;COUNT(*)
----------22928
–查询测试表中owner列的列值数据分布情况
–从查询结果看,对于owner列,在22928行的数据中,只分布了3个不同的列值,数据数值的分布情况较为集中
select count(distinct owner) from test;COUNT(DISTINCTOWNER)
--------------------3
–查询测试表中object_id列的数值分布情况
–从查询结果看,对于object_id列,在22928行的数据中,分布了22912个不同的数值,该列整体的数值分布情况较为零散
select count(distinct object_id) from test;COUNT(DISTINCTOBJECT_ID)
------------------------22912desc testName Null? Type----------------------------------------------------------------------OWNER VARCHAR2(30)OBJECT_NAME VARCHAR2(128)SUBOBJECT_NAME VARCHAR2(30)OBJECT_ID NUMBERDATA_OBJECT_ID NUMBEROBJECT_TYPE VARCHAR2(19)CREATED DATELAST_DDL_TIME DATETIMESTAMP VARCHAR2(19)STATUS VARCHAR2(7)TEMPORARY VARCHAR2(1)GENERATED VARCHAR2(1)SECONDARY VARCHAR2(1)
–以数值较为集中的owner作为组合索引的引导列,创建普通索引
create index test on test(owner,OBJECT_ID);
Index created.select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS from user_indexes where TABLE_NAME='TEST';INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
------------------------- ------------------- --------------- ---------
TEST NORMAL TEST NONUNIQUE
–收集测试表最新的统计信息
analyze table test compute statistics for table for all columns for all indexes;
Table analyzed.
–清空buffer cache缓冲池,保证无测试表的数据块存在在内存中,防止影响到测试结果
alter system flush buffer_cache;
System altered.
–使用之前创建的组合索引,以组合索引非引导作为条件查询列进行条件查询
–从执行计划看,oracle用到了索引扫描,而且采用index skip scan的方式进行扫描
select * from test where object_id=3;Execution Plan
----------------------------------------------------------
Plan hash value: 2389257771
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes| Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 86| 5 (0)| 00:00:01|
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 86| 5 (0)| 00:00:01|
|* 2 | INDEX SKIP SCAN | TEST | 1 | | 4 (0)| 00:00:01|
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------2 - access("OBJECT_ID"=3)filter("OBJECT_ID"=3)Statistics
----------------------------------------------------------0 recursive calls0 db block gets6 consistent gets24 physical reads0 redo size1402 bytes sent via SQL*Net to client469 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processed
–删除之前的索引
drop index test;
Index dropped.
–以数值分布较为零散的object_id列作为引导列,再次创建普通索引
create index test on test(OBJECT_ID,owner);
Index created.
–收集测试表最新的统计信息
analyze table test compute statistics for table for all columns for all indexes;
Table analyzed.
–清空buffer cache缓冲池,避免影响数据测试
alter system flush buffer_cache;
System altered.
–使用上面刚刚创建的组合索引的非引导列owner作为条件查询列进行查询操作
–从执行计划看,此次oracle未选择走索引扫描,而是采用了全表扫描的方式
–到此,印证了之前对于index skip scan方式选择的说法
select * from test where owner='BI';
8 rows selected.Execution Plan
----------------------------------------------------------
Plan hash value: 1357081020
------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes| Cost (%CPU)| Time |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 688| 74 (2)| 00:00:01|
|* 1 | TABLE ACCESS FULL| TEST | 8 | 688| 74 (2)| 00:00:01|
------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("OWNER"='BI')Statistics
----------------------------------------------------------1 recursive calls0 db block gets318 consistent gets315 physical reads0 redo size1583 bytes sent via SQL*Net to client469 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)8 rows processed
5、索引全扫描(index full scan)
对于索引全扫描,就是使用目标索引进行索引扫描时,会扫描所有索引叶块的所有索引行。
对于索引全扫描,只适用于CBO。
对于索引全扫描,使用单块读取的方式,有序读取索引块。
对于索引全扫描,从结果集看,结果全部源于索引块,而且由于已经按照索引键值顺序排序,因此不需要单独排序
对于索引全扫描,会话会产生db file sequential reads事件。
具体情况分析:
对于单一列建立的索引(单一索引),当该索引列有非空约束时,在具体检索中只检索该列全部数据,会使用“索引全扫描”。
对于单一列建立的索引(单一索引),当该索引列无非空约束时,在具体检索中只检索该列全部数据,且是对该列的统计(count)或者非空条件查询(is not null),会使用“索引全扫描”。
对于单一列建立的索引(单一索引),当该索引列无非空约束时,在具体检索中只检索该列全部数据,且是对该列的常规查询,不会使用“索引全扫描”。(这是因为对于oracle索引,对于列中存在的null值不记录在b-tree索引中)
对于多个列建立的索引(组合索引),当该索引列有非空约束时,在具体检索中只检索组合索引中涉及的全部列或者部分列的全部数据,会使用“索引全扫描”。
对于多个列建立的索引(组合索引),当该索引列无非空约束时,在具体检索中只检索组合索引中涉及的全部列或者部分列的全部数据,且是对这些相关列的统计(count)或者非空条件查询(is not null),会使用“索引全扫描”。
对于多个列建立的索引(组合索引),当该索引列无非空约束时,在具体检索中只检索组合索引中涉及的全部列或者部分列的全部数据,且是对该列的常规查询,不会使用“索引全扫描”。
示例:
–为测试表TEST_NORMAL的empno列添加非空约束
alter table TEST_NORMAL modify(empno not null);
Table altered.
–以empno列以及ename列作为组合,创建普通索引
create index TEST_NORMAL_ind on TEST_NORMAL(empno,ename);
Index created.
–查询上面组合索引涉及的ename列,该列不存在非空约束
–从执行计划看,oracle选择了index full scan的索引扫描方式,且结果集仅仅来源于索引块(没有根据rowid返回数据集的记录,说明无访问数据块)
select ename from TEST_NORMAL;
14 rows selected.Execution Plan
----------------------------------------------------------
Plan hash value: 2425626010
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 70 | 1 (0)| 00:00:01 |
| 1 | INDEX FULL SCAN | TEST_NORMAL_IND | 14 | 70 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------0 recursive calls0 db block gets2 consistent gets8 physical reads0 redo size705 bytes sent via SQL*Net to client469 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)14 rows processed
6、索引快速扫描(index fast full scan)
对于索引快速扫描,就是使用目标索引进行索引扫描时,会扫描所有索引叶块的所有索引行。
对于索引快速扫描,只适用于CBO。
对于索引快速扫描,使用多块读取的方式,读取索引块。(这种方式相较于索引全扫描,获取数据的效率更高)
对于索引快速扫描,从结果集看,结果全部源于索引块,但数据结果不一定有序。
对于索引快速扫描,会话会产生db file scattered reads事件。
具体情况分析:
参阅上面的索引全扫描,两者所谓的同宗,只是不同的需求(对于结果的响应速度或是数据序列,当然CBO优化器也会进行内部的计算评估选取最优执行路径),产生的不同的执行结果,下面的示例会展示
示例:
–查询测试表的数据量,显示此表有22928行数据
select count(*) from test;COUNT(*)
----------22928
–确认数据列中不含非空约束
desc testName Null? Type--------------------------------------------------------------------------------OWNER VARCHAR2(30)OBJECT_NAME VARCHAR2(128)SUBOBJECT_NAME VARCHAR2(30)OBJECT_ID NUMBERDATA_OBJECT_ID NUMBEROBJECT_TYPE VARCHAR2(19)CREATED DATELAST_DDL_TIME DATETIMESTAMP VARCHAR2(19)STATUS VARCHAR2(7)TEMPORARY VARCHAR2(1)GENERATED VARCHAR2(1)SECONDARY VARCHAR2(1)
–针对object_id列,创建普通索引
create index test on test(object_id);
Index created.
–确认上面创建的索引为非唯一索引
select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS from user_indexes where TABLE_NAME='TEST';INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
-------------------------------------------------------------------------
TEST NORMAL TEST NONUNIQUE
–清空buffer_cache缓冲池数据,防止造成测试的影响
alter system flush buffer_cache;
System altered.
–清空shared pool缓冲池数据,防止对测试造成影响
alter system flush shared_pool;
System altered.
–收集测试表最新的统计信息
analyze table test compute statistics for table for all columns for all indexes;
Table analyzed.
–打开会话追踪,仅查看执行计划
set autotrace trace
–查询索引列object,同时使用is not null作为查询条件。
–由于b-tree索引中不记录null值信息,而且该列不存在非空约束,通过not null条件指定,让oracle不必考虑null值。
–从执行计划看,由于读取的数据量很大且不用排序,oracle选择了更快的多块读方式的index fast full scan,尽快获取数据。
–同样的,此时未出现access by index rowid的情况,说明未查询数据块,仅仅查询了索引块。
select object_id from test where object_id is not null;
22928 rows selected.Execution Plan
----------------------------------------------------------
Plan hash value: 1645531115
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 23290 | 295K| 14 (0)| 00:00:01 |
|* 1 | INDEX FAST FULL SCAN| TEST | 23290 | 295K| 14 (0)| 00:00:01 |
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("OBJECT_ID" IS NOT NULL)Statistics
----------------------------------------------------------0 recursive calls0 db block gets1582 consistent gets53 physical reads0 redo size502642 bytes sent via SQL*Net to client17277 bytes received via SQL*Net from client1530 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)22928 rows processed
–修改上面的查询,增加排序操作。
–从执行计划看,由于此次增加了排序操作,oracle选择了偏向有序读取的index full scan的方式进行扫描。
–同样的,此次未查询数据块(不存在access by index rowid)。
select object_id from test where object_id is not null order by object_id;
22928 rows selected.Execution Plan
----------------------------------------------------------
Plan hash value: 3883652822
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 23290 | 295K| 60 (2)| 00:00:01 |
|* 1 | INDEX FULL SCAN | TEST | 23290 | 295K| 60 (2)| 00:00:01 |
-------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------1 - filter("OBJECT_ID" IS NOT NULL)Statistics
----------------------------------------------------------0 recursive calls0 db block gets1578 consistent gets64 physical reads0 redo size502642 bytes sent via SQL*Net to client17277 bytes received via SQL*Net from client1530 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)22928 rows processed
–再次修改查询,取消not null条件查询以及排序操作。
–此时,对于没有非空约束的object_id列,增加了null值的可能性,而b-tree索引不保存null信息。
–此次,oracle选择了全表扫描的方式。
select object_id from test;
22928 rows selected.Execution Plan
----------------------------------------------------------
Plan hash value: 1357081020
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 22928 | 91712 | 74 (2)| 00:00:01 |
| 1 | TABLE ACCESS FULL| TEST | 22928 | 91712 | 74 (2)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------1 recursive calls0 db block gets1830 consistent gets315 physical reads0 redo size415626 bytes sent via SQL*Net to client17277 bytes received via SQL*Net from client1530 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)22928 rows processed
Oracle索引扫描方式相关推荐
- Oracle 索引扫描的五种类型
之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...
- Oracle索引扫描四大类的分析
学习Oracle时,你可能会遇到Oracle索引扫描问题,这里将介绍Oracle索引扫描问题的解决方法,在这里拿出来和大家分享一下.根据索引的类型与where限制条件的不同,有4种类型的Oracle索 ...
- Oracle教程之分析Oracle索引扫描四大类
学习Oracle时,你可能会遇到Oracle索引扫描问题,这里将介绍Oracle索引扫描问题的解决方法,在这里拿出来和大家分享一下.根据索引的类型与where限制条件的不同,有4种类型的Orac ...
- oracle索引扫描的种类,Oracle 系列之索引(Index)
索引的意义在于类似一本书的目录,可以快速的查找到需要的内容. 一.创建语法 create or replace unique|bitmap index .on .(|asc|desc , |asc|d ...
- oracle索引实现方式,Oracle之索引的创建方式
Oracle 的索引可分为5种,它们包括唯一索引.组合索引.反向键索引.位图索引和基于函数的索引. 1.创建索引的标准语法 以下为引用内容: CREATE INDEX 索引名 ON 表名 (列名)T ...
- oracle建立覆盖索引,oracle索引类型及扫描方式大整理
oracle索引类型及扫描方式大整理 1. 存储类型 索引在各种关系型数据库系统中都是举足轻重的组成部分,其对于提高检索数据的速度起至关重要的作用.在Oracle中,索引基本分为以下几种:B*Tree ...
- 查看索引是否命中oracle,Oracle索引命中与扫描规律总结
索引扫描类型(该表取自网络文章): index unique scan(索引唯一扫描)通过唯一索引查找一个数值经常返回单个ROWID.如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导 ...
- oracle 索引命中条件,Oracle索引命中与扫描规律总结 | 学步园
索引扫描类型(该表取自网络文章): index unique scan(索引唯一扫描)通过唯一索引查找一个数值经常返回单个ROWID.如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导 ...
- Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
理解oracle索引扫描类型的特点以及具体触发的条件,对于通过合理地使用索引,进行sql优化至关重要(例如组合索引的引导列的选择问题). 在总结索引扫描类型前,需要再次强调关于索引特点的几个关键点: ...
最新文章
- Java集合学习_Java集合学习(适合新手)
- Dubbo 云原生之路:ASF 毕业一周年、3.0 可期
- [转贴]暴雪的霸王条款是否合理?
- 微软开始取消 Windows 10 对 32 位系统的支持
- 拓端tecdat|R语言:用R语言填补缺失的数据
- photoshop 插件_Photoshop的光度模式
- 英语口译笔记法实战指导 吴钟明 pdf_三口过关,名师指导备考干货帖(内附口译笔记讲解)...
- 暴力猴插件的安装及使用
- Android团队技术随写、随写
- alertmanager集群莫名发送resolve消息的问题探究
- excel单元格下拉选项怎么设置_单元格下拉效果怎么实现?
- 教你做5种地图展现方法,无需代码,上手即会
- 1.7 基尔霍夫定律
- ACM图灵奖现状以及得主及其分别分别的贡献
- paddledet 训练旋转目标检测 ppyoloe-r 训练自己的数据集
- dell7920工作站安装Linux,戴尔工作站(Precision 7920)安装双系统win10+ubuntu18.04
- 统计学基础之数据分布
- win10怎么将txt转换为html,win10怎么把txt格式改成bat_win10系统txt文件改成bat操作方法-win7之家...
- 冯唐《有本事》观感1
- nodejs 实现发邮件nodemailer
热门文章
- 只怪自己当时年纪太小,一心只看那只泼猴了
- 研究生科研必备!!!2015-2020年各类国际会议基于图像的三维重建论文综述(1)——总览
- Python实战从入门到精通第十六讲——匿名函数捕获变量值
- NLP简报(Issue #3)
- 重量计算python月球_千年前的古诗,苏轼的不知月亮上是何年何月|现在我用Python来计算出来了...
- 折线图_Pyecharts数据可视化分析—折线图
- Linux编程(4)_gcc
- 什么是微服务 Martin Fowler的microservices
- 如何精准鉴别菜鸟和老手程序员 网友:精辟!
- 'int' object has no attribute 'backward'报错 使用Pytorch编写 Hinge loss函数