索引的概念
在使用
oracle
的过程中
,
我们就不能不考虑性能和
SQL
优化
,
而正确的使用索引在优化过程中是很关键的
.
索引是建立在表的一列或多列上的辅助对象
,
它有助于快速访问该表中的数据
.
索引由于其内在的结构
,
具有某些内在的开销
,
这些开销依赖于为了检索由索引中
ROWID
指定的行所访问的表中的块数
,
需要特别注意的是
:
这个开销可能会超过进行顺序全表扫描的成本
.
Oracle
使用
B*
树存储索引
(
包括位图索引
).
索引的顶点称为根节点
,
第二级节点称为分支节点
,
最低级的节点是叶节点
.
上级索引块
(
分支节点
)
包含了指向下级索引块的索引数据
.
最低级索引块
(
叶节点
)
包含每个值的索引数据和一个相对应的用来确定该实际行位置的
ROWID.
叶节点本身使用双向链表连接
,
允许叶节点双向切换
.
二
,
索引的文件存储
索引文件在存储器上分为两个区:索引区和数据区。索引区存放索引表,数据区存放主文件。建立索引文件的过程:
(
1
)
按输入记录的先后次序建立数据区和索引表。其中索引表中关键字是无序的
(
2
)
待全部记录输入完毕后对索引表进行排序,排序后的索引表和主文件一起就形成了索引文件。
【例】对于表
10.2
的数据文件,主关键字是职工号,排序前的索引表如表
10.3
所示,排序后的索引表见表
10.4
,表
10.2
和表
10.4
一起形成了一个索引文件。
drop
table
t_index_test;
create
table
T_index_test(
f1
integer
,
f2
integer
,
f3
varchar2
(
400
)
);
insert
into
t_index_test
select
rownum
,
mod
(
rownum
,
100
),lpad(
rownum
,
300
,
'-'
)
from
dba_objects, dba_tab_cols
where
rownum
<=
10000
;
commit
;
create
index
ind_index_test_1
on
t_index_test(f1);
analyze
index
ind_index_test_1
validate
structure
;
select
*
from
index_stats
where
name
= upper(
'ind_index_test_1'
);
字段名称
|
字段描述
|
字段内容
|
HEIGHT
|
索引树高度
|
2
|
BLOCKS
|
分配给索引的块数
|
32
|
NAME
|
|
IND_INDEX_TEST_1
|
PARTITION_NAME
|
|
|
LF_ROWS
|
索引叶子节点个数
|
10000
|
LF_BLKS
|
叶子节点块数
|
21
|
LF_ROWS_LEN
|
叶子节点总长度
|
149801
|
LF_BLK_LEN
|
平均每个叶子块的大小
|
7980
|
BR_ROWS
|
根节点指针个数,
就是说根节点中有20
个指针指向叶子节点
|
20
|
BR_BLKS
|
根节点个数
|
1
|
BR_ROWS_LEN
|
根节点总长度
|
220
|
BR_BLK_LEN
|
|
8012
|
DEL_LF_ROWS
|
删除的叶子节点行数
|
0
|
DEL_LF_ROWS_LEN
|
|
0
|
DISTINCT_KEYS
|
不同值总数
|
10000
|
MOST_REPEATED_KEY
|
|
1
|
BTREE_SPACE
|
分配给索引的字节数
|
175592
|
USED_SPACE
|
索引已经使用的字节数
|
150021
|
PCT_USED
|
|
86
|
ROWS_PER_KEY
|
每个字段的平均个数
|
1
|
BLKS_GETS_PER_ACCESS
|
|
3
|
PRE_ROWS
|
|
0
|
PRE_ROWS_LEN
|
|
0
|
OPT_CMPR_COUNT
|
|
0
|
OPT_CMPR_PCTSAVE
|
|
0
|
可以看到,该所引高度为
2
,只有
1
个
branch
块,同时也是
root
根节点,同时有
21
个
leaf
块。
select
extent_id,file_id,block_id,blocks
from
dba_extents
where
segment_name=upper(
'ind_index_test_1'
)
EXTENT_ID
|
FILE_ID
|
BLOCK_ID
|
BLOCKS
|
0
|
33
|
12073
|
8
|
1
|
33
|
12081
|
8
|
2
|
33
|
12089
|
8
|
3
|
33
|
12097
|
8
|
如何建立最佳索引
假定索引的唯一目的是减少
IO
操作
,
如果一个查询使用索引时相对于全表扫描执行了更多的
IO
操作
,
则使用索引的意义会明显降低
.
例如
,
假设有一个拥有
1000000
行的表存储在
5000
个块中
,
某个给定的查询需要的结果分布在其中
4000
个数据块中
,
这种情况下
,
建立和使用这一列上的索引肯定不是最佳的
.
如果一个拥有
1000
行的表经历了大量的重复插入和删除操作后
,
表的高水位标记线将升高
,
因为
delete
操作不能收回已经使用的数据块
.
如果高水位标记线为
1000,
而实际记录存储在其中
100
个数据块中
,
这时使用索引是有意义的
.
因为被访问的数据块的数量和执行
IO
操作的数量明显少于执行全表扫描的数量
.
较好的索引
(
数据按照索引组织
,
在索引中顺序的内容在表中也相邻存储
.
这样之需要读取较少的数据块就可以完成检索任务
)
A---------7
A---------8
B---------8
B---------8
C----------8
C----------9
较差的索引
(
索引中相邻的数据在表中存储位置相隔较远
,
导致每次读取了多余的重复数据块
)
A---------1357
A---------2
B---------9878
B---------38
C----------1008
C----------9
什么是
ClusteringFactor
|
什么是
Clustering Factor
呢?
Clustering Factor
是的含义是如果通过一个索引扫描一张表,需要访问的表的数据块的数量。
Clustering Factor
计算的方法如下:
1
、扫描一个索引
2
、比较某行的
rowid
和前一行的
rowid
,如果这两个
rowid
不属于同一个数据块,那么
cluster factor
增加
1
3
、整个索引扫描完毕后,就得到了该索引的
cluster factor
。
如果
Clustering Factor
接近于表存储的块数,说明这张表是按照索引字段的顺序存储的。如果
Clustering Factor
接近于行的数量,那说明这张表不是按索引字段顺序存储的。在计算索引访问成本的时候,这个值十分有用。
Clustering Factor
乘以选择性参数(
selectivity
)就是访问索引的开销。
如果这个统计数据不能真实反映出索引的真实情况,那么可能会造成优化器错误的选择执行计划。另外如果某张表上的大多数访问是按照某个索引做索引扫描,那么将该表的数据按照索引字段的顺序重新组织,可以提高该表的访问性能。
|
|
问题和答案
1,
什么是
Index clustering Facotr(CF).
Index CF
是一个
CBO
的统计值
,
这个值标示表中两行记录的距离与索引中两行记录的距离的比值
.
可以大致理解为
( rowid(row1) – rowid(row2))/(rowed(index1) – rowed(index2)).
2,
为什么
Index CF
值越小越好
.
根据上面的定义描述
,
我们知道
,
这个值越小
,
索引中两个相邻值在表中存储的位置越接近
,
这样
oracle
在根据根据索引范围得到存储记录的位置的范围越小
.
所需要读取的数据块数就越少
,
所以索引的性能就越高
.
3,
使用
exp/imp
或者
table/index move
可以帮助减少
Index CF
值吗
?
答案是否定的
,
这两种方式都对
index CF
没有改变
.
Ok,
那么我们就可以理解为
, table/index move
虽然可以收回没有记录的数据块
,
但这个过程并不对数据记录排序后重新存储
,
而只是简单地将几个相邻的空闲块中的内容写入新块中
.
4,
怎么做才能减少
index CF
只有对结果记录排序后重新
reload
到表中才能减少这个值
.
5,
如果表中的索引不止一个
,
怎么办
?
如果表的索引不止一个
,
我们不可能同时让所有的
index CF
值减少
,
而只能通过排序
reload
减少某一个或者几个索引的
index CF
值
.
6,
有没有什么办法可以避免产生高的
index CF values?
可以将表放在
keep pool
中
.
…
7,
减少
index CF values
的方式
.
使用外部排序特性
,
对表数据按照索引排序后重新读入
.
或者使用
create table as select from table order by
的方式
.
以下问题的答案有助于建立最佳索引
.
1,
与全表扫描相比
,
索引扫描需要执行多少块
IO
操作
.
如果知道这个问题的答案
,
就会立即知道建立和使用一个索引是否具有性能意义
.
2,
用于特定表中的数据访问的最常用列组合是什么
?
研究应用程序代码
,
如果程序代码不容易看懂
,
则查看
V$SQLAREA
或
V$SQLTEXT,
并分析最常用的
SQL
语句
.
查找在
V$SQLAREA
中具有较高执行次数的语句
,
并查找它们的
where
子句的成分
.
3,
对打算在其上建立索引的一组给定的列
,
其选择性是什么
?
如果一些列始终有值并且相对唯一
font-family: Times New Ro
分享到:
相关推荐
综上所述,数据库索引设计和优化是一个涉及多方面因素的复杂过程,需要结合业务需求、数据特性和系统资源,进行全面考虑和精细调整,才能实现最佳的系统性能。通过学习《数据库索引设计与优化》这样的专业书籍,我们...
综上,《Oracle与MySQL数据库索引设计与优化》一书详细介绍了这两个数据库系统的索引特性、设计原则以及优化方法,对于数据库管理员和开发人员来说是一本极具价值的参考书。通过学习,读者可以更好地理解和应用索引...
Oracle数据库是全球广泛使用的数据库系统之一,其性能优化的关键之一在于有效的索引设计与使用。本文将深入探讨Oracle索引的原理、创建方法,并结合SQL优化策略,帮助你提升数据库查询速度,降低资源消耗。 首先,...
### 数据库索引及优化详解 #### 一、数据库索引的重要性 数据库索引就像是图书...综上所述,合理的索引设计与优化是提高数据库性能的关键所在。通过对索引的理解和正确应用,可以有效提升系统的响应速度和整体性能。
### SQL Server 索引设计与优化 #### 索引的重要性 索引在SQL Server数据库性能优化中扮演着至关重要的角色。一个精心设计的索引可以极大地提高查询效率,减少资源消耗,从而显著提升整体系统的响应速度。本文旨在...
二、索引的种类与特性 1. B树索引:大多数关系型数据库默认使用的索引类型,适用于范围查询和排序操作。B树索引能够保持有序性,并支持快速的插入、删除和查找操作。 2. 哈希索引:基于哈希函数的索引,适用于等值...
B-树的特性确保了索引的高效性,使得即使在大量数据中也能实现快速访问。 #### 三、索引的工作原理示例 以一个名为`people`的表为例,表中包含两列:`peopleid`(整型,不可为空)和`name`(字符型,不可为空)。...
sql学习 索引特性之有序优化distinct.sql
### 数据库索引设计与优化 #### 一、索引基础概述 索引是数据库管理系统(DBMS)中用于提高数据检索速度的数据结构。通过创建索引,可以在表中的一个或多个列上建立类似于图书目录的结构,从而帮助快速定位到特定...
sql学习 索引特性之有序优化order by.sql
3. **唯一索引与非唯一索引**:唯一索引确保索引项的唯一性,有助于减少数据冗余;非唯一索引允许重复值,但可能增加查询复杂性。 4. **覆盖索引**:当查询只需要索引中的信息,而无需访问实际数据行时,覆盖索引...
sql学习 索引特性之有序难优化union.sql
理解这些特性有助于更好地设计索引。 - **分区与分片**:对于超大型表,可以考虑使用分区或分片技术,将数据分布在多个物理存储上,以提高查询性能。 总之,索引优化是提升MySQL查询性能的核心手段,需要结合业务...
sql学习 索引特性之有序与存列值优化max.sql
sql学习 索引特性之存列值优化count.sql
Oracle 11g 中引入了一个新特性,称为索引不可见(Index Invisible),它允许 DBA 将索引设置为不可见状态,使得优化器在选择查询计划时忽视该索引,而不影响索引的正常更新。 索引维护是 DBA 的一项重要工作。在...
MySQL性能优化中的索引优化是提升数据库查询效率的关键技术。索引是一种特殊的数据...在实践中,开发者需要根据具体的应用场景和数据特性,结合监控和分析工具,持续调整和优化索引策略,以实现数据库的最佳运行状态。
数据库索引设计与优化是数据库管理系统中的核心环节,它直接影响着数据查询的速度和系统的整体性能。索引在数据库中扮演着查找快照的角色,类似于书籍的目录,使得数据检索能够快速定位到目标信息,避免全表扫描,...
sql学习 索引特性之存列值优化sum avg.sql