唯一性索引(Unique Index)与普通索引(Normal Index)差异(下)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

声明:本篇知识体系受到dbsnake相关文章启发,特此感谢!

 

本系列的中篇(http://space.itpub.net/17203031/viewspace-700163)中,我们进行了Normal Index的导出和结构分析。分析后,我们发现Normal Index叶子节点实际上是表现为两个column结构,第一列为索引列值,第二列为对应rowid。本篇中,我们以相同的方法对unique index进行研究。

 

1、  Unique Index逻辑结构Dump

 

相似,使用Treedump的方法,将索引树idx_t_uniqueid进行导出。

 

 

--Unique Index

SQL> select name, value from  v$diag_info where name='Default Trace File';

 

NAME                 VALUE

-------------------- --------------------------------------------------------------------------------

Default Trace File   /u01/diag/rdbms/wilson/wilson/trace/wilson_ora_6330.trc

 

//75142为索引idx_t_uniqueidobject_id

SQL> alter session set events 'immediate trace name treedump level 75142';

Session altered

 

//Trace File中的核心片段如下:

*** 2011-06-15 02:16:41.584

*** SESSION ID:(138.4) 2011-06-15 02:16:41.584

*** CLIENT ID:() 2011-06-15 02:16:41.584

*** SERVICE NAME:(wilson) 2011-06-15 02:16:41.584

*** MODULE NAME:(PL/SQL Developer) 2011-06-15 02:16:41.584

*** ACTION NAME:(Command Window - New) 2011-06-15 02:16:41.584

 

----- begin tree dump

leaf: 0x415af9 4283129 (0: nrow: 3 rrow: 3)

----- end tree dump

 

 

由于该索引结构很小,只包括一个叶子节点索引块。该块地址的十六进为:0x415af9,对应十进制地址为4283129。查找对应的file编号和block编号。

 

 

SQL> select dbms_utility.data_block_address_file(4283129), dbms_utility. data_block_address_block(4283129)  from dual;

 

DBMS_UTILITY.DATA_BLOCK_ADDRES DBMS_UTILITY.DATA_BLOCK_ADDRES

------------------------------ ------------------------------

                             1                          88825

 

 

地址4283129对应的位置为file编号1,block编号88825

 

使用数据块dump的方法,将数据块dump出。

 

 

SQL> alter system dump datafile 1 block 88825;

System altered

 

//Trace File中的内容

Start dump data blocks tsn: 0 file#:1 minblk 88825 maxblk 88825

Block dump from cache:

Dump of buffer cache at level 4 for tsn=0, rdba=4283129

BH (0x2afeef14) file#: 1 rdba: 0x00415af9 (1/88825) class: 1 ba: 0x2adf6000

  set: 5 pool 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 55,19

 

(篇幅原因,省略部分……)

 

Block header dump:  0x00415af9

 Object id on Block? Y

 seg/obj: 0x12586  csc: 0x00.396f56  itc: 2  flg: -  typ: 2 - INDEX

     fsl: 0  fnx: 0x0 ver: 0x01

 

row#0[8021] flag: ------, lock: 0, len=11, data:(6):  00 41 5a e9 00 00

col 0; len 2; (2):  c1 02

row#1[8010] flag: ------, lock: 0, len=11, data:(6):  00 41 5a e9 00 01

col 0; len 2; (2):  c1 03

row#2[7999] flag: ------, lock: 0, len=11, data:(6):  00 41 5a e9 00 02

col 0; len 2; (2):  c1 04

----- end of leaf block dump -----

End dump data blocks tsn: 0 file#: 1 minblk 88825 maxblk 88825

 

 

此处,我们看到了Unique Index索引叶子节点和Normal Index的差异。在Unique Index叶子节点上,每行row只对应了一个col信息(而非normal index的两个)。Col[0]中对应的是索引列的键值。而rowid被放置在了行row的头部。这点差异就意味着两种索引结构在存储构成上的确有一些差距。

 

下面,我们来检查一下纯物理结构,借助BBED工具。

 

 

2、Unique Index物理结构分析

 

至此,我们已经知道了索引叶子块所在文件和块编号,进行物理分析只需要计算额外的offset偏移量。

 

从对unique index索引块dump出的结果看,我们可以看到相对偏移量信息。

 

row#2[7999] flag: ------, lock: 0, len=11, data:(6):  00 41 5a e9 00 02

col 0; len 2; (2):  c1 04

----- end of leaf block dump -----

 

与对Normal Index相同,我们研究第三行数据,相对偏移量是7999。由于索引idx_t_uniqueid也存在在system表空间,属于MSSM管理方式。计算块内偏移量信息:

 

 

7999+68+(2-1)*24=8091

 

 

 

使用BBED的要素已经获取到,进行物理分析。

 

//设置文件和块号

BBED> set dba 0x00415af9

        DBA             0x00415af9 (4283129 1,88825)

 

//设置偏移量

BBED> set offset 8091

        OFFSET          8091

 

BBED> dump

 File: /u01/oradata/WILSON/datafile/o1_mf_system_6bcsnqfc_.dbf (1)

 Block: 88825            Offsets: 8091 to 8191           Dba:0x00415af9

------------------------------------------------------------------------

 00000041 5ae90002 02c10400 0000415a e9000102 c1030000 00415ae9 000002c1

 02100000 40110e00 02004011 0e000203 c20837ac 00011300 13000040 110e0001

 0040110e 000103c2 0834ac00 01060006 00004011 0d000700 40110d00 0703c208

 32010657 6f

 

 <32 bytes per line>

 

 

对应原有的dump结果,可以清晰看到索引列键值和rowid信息。

 

 

row#2[7999] flag: ------, lock: 0, len=11, data:(6):  00 41 5a e9 00 02

col 0; len 2; (2):  c1 04

----- end of leaf block dump ---

 

 

 

加上连带的四个0,可以看到保存的方式。Rowid在行头,以0x02开头的col[0]结构,保存索引列键值。对比原有的normal index结构,可以发现差距。为便于查看,normal index的结构如下:

 

 

//Normal Index叶子节点,DUMP显示出来

BBED> dump

 File: /u01/oradata/WILSON/datafile/o1_mf_system_6bcsnqfc_.dbf (1)

 Block: 88817            Offsets: 8088 to 8191           Dba:0x00415af1

------------------------------------------------------------------------

 000002c1 04060041 5ae90002 000002c1 03060041 5ae90001 000002c1 02060041

 5ae90000 0d000040 15000002 00401500 000203c2 085eac00 01150015 00004015

 00000100 40150000 0103c208 5aac0001 11001100 0040110f 00090040 110f0009

 03c20858 0106496f

 

 <32 bytes per line>

 

Normal Index叶子节点长度为len=12,unique index长度为len=11。差异就是在于0x06的第二列col[1]标志位。

 

 

3、结论

 

唯一索引和普通索引在结构上存在差异,主要表现在存储结构和方式上。两者相比,唯一索引在体积上略小一点。但是从实际应用方面,唯一索引只是比普通索引增加了列值约束。其他如执行计划、效率没有过多的差别。

 

 

此时笔者想法有两个以为:

 

首先,Oracle在设计唯一索引的时候,为什么要选择这样的结构?在使用的时候有什么优势所在?

 

其次,唯一索引没有选择隐式的约束,这种结构类型如何实现唯一的效果?

案例-索引对于并发Insert性能优化测试 普通索引和分区索引(尤其是本地分区索引)在索引分裂时的行为存在显著差异。2、单节点比双节点插入效率-50%左右,原因为双节点分摊了并发压力,相关于单节点的:并发50,40w的数据插入,因此双节点要比单节点同样的压力要更优。原因分析:Insert 语句导致:直接复制表中的单条记录,然后对唯一索引字段修改为UUID值,日期字段为:sysdate,其它字段为固定值。索引字段有3个索引值为Null(索引无操作),另一个索引插入的值为固定值(无法做到IO分散),仅唯一索引的值为UUID(有效果)。 阅读详情

相关推荐

pandas多级索引groupby协同实战:构建分层数据分析工作流

多级索引(Hierarchical Index)是pandas处理树状结构化数据的核心机制,它将传统一维索引升级为支持层级寻址的内存B+树结构,显著提升区域/时间/产品等多维数据的切片聚合效率;其底层原理在于为每一级索引维护独立哈希映射有序列表,使loc查询接近O(1)时间复杂度;该技术groupby操作深度共生——多级索引提供结构化数据骨架,groupby则基于level参数实现按索引层级的零成本分组,避免重复哈希排序;典型应用场景包括BI仪表盘钻取分析、IoT设备多级指标聚合、用户行为路径分层统

weixin_33937913的博客 414

数据库键(key)、主键(primaryKey)索引(index)、唯一索引(uniqueIndex)区别

http://s5.sinaimg.cn/orignal/004msBIGzy7BcrhYAmg44

dsydly的博客 9552

唯一索引unique index)的创建和使用

如果在一个列上同时建唯一索引普通索引的话,mysql会自动选择唯一索引。 -- 创建唯一索引 CREATE UNIQUE INDEX uk_users_name ON t_users(name); uk_users_name:自由定义的唯一索引名称 t_users:表格名称 name:字段名称 注意:唯一索引对null不起作用,也就是字段为null的话可以重复; 注意:唯一索引对" “不起作...

厉兵秣码 12万+

唯一性索引Unique Index普通索引Normal Index差异(上)

索引是我们经常使用的一种数据库搜索优化手段。适当的业务操作场景使用适当的索引方案可以显著的提升系统整体性能和用户体验。在Oracle中,索引有包括很多类型。不同类型的索引适应不同的系统环境和访问场景。其中,唯一性索引Unique Index是我们经常使用到的一种。 唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列...

thy822的专栏 4万+

唯一性索引Unique Index普通索引Normal Index)性能差异

结论:从执行计划where条件中的表现看,Unique Index和一般normal Index没有显著性的差异。 以下文章中有详细的实验和分析 http://blog.itpub.net/17203031/viewspace-700089/

liangz_java的博客 1770

mysql索引类型normalunique,full text

问题1: mysql索引类型normalunique,full text的区别是什么? normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通INDEX

courage的专栏 5万+

唯一性索引Unique Index普通索引Normal Index差异()

索引是我们经常使用的一种数据库搜索优化手段。适当的业务操作场景使用适当的索引方案可以显著的提升系统整体性能和用户体验。在Oracle中,索引有包括很多类型。不同类型的索引适应不同的系统环境和访问场景。其中,唯一性索引Unique Index是我们经常使用到的一种。   唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引

筚路蓝缕 以启山林 1072

唯一性索引Unique Index普通索引Normal Index差异(中)

声明:本篇知识方法受到dbsnake相关文章启发,特此感谢!   在本系列的前篇(http://space.itpub.net/17203031/viewspace-700089)里,我们探讨了唯一索引普通索引在应用角度上的差异。实验中,我们发现在基础数据相同的情况下,两类型索引在体积上有细微的差异,这使得我们可以猜测两种类型索引在存储结构上的可能差异。   本篇打算从存储结构入手,探讨

school11的专栏 3420

predicate 列存储索引扫描_唯一性索引(unique index)普通索引(normal index)差异()唯一性索引 (single index 普通索引 (standard in...

唯一性索引(unique index)普通索引(normal index)差异()(唯一性索引 (single index 普通索引 (standard index) 差异 ())唯一性索引(unique index)普通索引(normal index)差异()(唯一性索引 (single index 普通索引 (standard index) 差异 ())Unique index...

weixin_36470210的博客 185

oracle唯一索引非唯一索引的区别 UNIQUE INDEX,NON-UNIQUE INDEX

索引是我们经常使用的一种数据库搜索优化手段。适当的业务操作场景使用适当的索引方案可以显著的提升系统整体性能和用户体验。在Oracle中,索引有包括很多类型。不同类型的索引适应不同的系统环境和访问场景。其中,唯一性索引Unique Index是我们经常使用到的一种。 唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列...

sod5211314的博客 4354

再说Unique IndexNormal Index行为差异

在笔者早期的文章中,从结构视角讨论过Unique IndexNormal Index差异。Oracle的Unique Index是一种特殊的约束索引结构,通常而言,Unique Index可以有几个方面的优势: ...

ciqu9915的博客 259

mysql唯一索引效率_mysql下普通索引和唯一索引的效率对比

昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快今天在我的虚拟机中布置了环境,测试抓图如下:抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致相同,而且如果在一个列上同时建唯一索引普通索引的话,mysql会自动选择唯一索引。谷歌一下:唯一索引普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。补充下概念:1普通索引普通...

weixin_42116705的博客 1010

如何精准识别排除MySQL中的主键索引?解析索引类型方法的实战指南

在MySQL数据库优化中,索引是提升查询性能的核心工具。然而,索引的类型(如唯一索引、全文索引普通索引)和方法(如BTREE、HASH)直接影响其使用场景和效率。表,开发者可以快速掌握表的索引结构,精准识别类型方法,并结合业务需求进行优化。合理使用索引是数据库高性能的基石,而排除主键干扰后的分析,则能更聚焦于辅助索引的设计调优。系统表,详细解析如何精准识别索引类型方法,并排除主键索引的干扰。表,可获取索引的元数据信息。若查询未命中索引,通过结果确认是否缺少。或性能库),删除冗余索引

dblens_com的博客 1014

数据库索引创建优化全解

索引Index)是数据库中用于加快查询速度的数据结构,类似书的“目录”。数据库通过索引可以更快地定位数据行,而无需全表扫描。MySQL(InnoDB):使用B+ 树索引SQL Server:使用B-Tree 索引MongoDB:使用B-Tree + 哈希索引PostgreSQL:支持。

猪猪侠 814

数据库-Oracle主键约束和唯一索引的黑

1、  分别用两种方法创建主键 create table test1(id number,name varchar2(10)); insert into test1 values(1,'t1'); insert into test1 values(2,'t2'); commit; alter table test1 add constraint pk_test1  primary key

Criss@陈磊 812
上一篇: 唯一性索引(Unique Index)与普通索引(Normal Index)差异(中)
下一篇: centos7 文件属性权限设置
school11
博客等级 码龄19年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值