Oracle聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。一个表最多只能有一个聚簇索引。
聚簇是一种存储表的方法,这些表密切相关并经常一起连接进磁盘的同一区域。例如,表 BOOKSHELF 和BOOKSHELF_AUTHOR 数据行可以一起插入到称为簇(Cluster)的单个区域中,而不是将两个表放在磁盘上的不同扇区上。
簇键(Cluster Key)可以是一列或多列,通过这些列可以将这些表在查询中连接起来(例如,BOOKSHELF表和BOOKSHELF_AUTHOR表中的 Title列)。为了将表聚集在一起,必须拥有这些将要聚集在一起的表。

对于几个表密切相关并经常一起通过某个字段连接的比较实用:
实验1:
create cluster BOOKandAUTHOR (Col1 VARCHAR2(100));

create table BOOKSHELF
(Title VARCHAR2(100) primary key,
Publisher VARCHAR2(20),
CategoryName VARCHAR2(20),
Rating VARCHAR2(2)
)
cluster BOOKandAUTHOR(Title);

在向BOOKSHELF表中插入数据行之前,必须建立一个Oracle聚簇索引:
create index BOOKandAUTHORndx on cluster BOOKandAUTHOR;

insert into BOOKSHELF values('aaa','sdf','sdfds','aa');

create table BOOKSHELF_AUTHOR
(Title VARCHAR2(100) primary key,
AuthorName VARCHAR2(50)
)
cluster BOOKandAUTHOR (Title);

insert into BOOKSHELF_AUTHOR values('sdfds','sdfds');
insert into BOOKSHELF_AUTHOR values('aaa','sdfds');
select rowid,t.* from BOOKSHELF_AUTHOR t;
AAAjbUAAEAAHsDcAAA
AAAjbUAAEAAHsDdAAA

select rowid,t.* from BOOKSHELF t;
AAAjbUAAEAAHsDdAAA

当这两个表被聚在一起时,每个唯一的Title在簇中实际只存储一次。对于每个Title,都从这两个表中附加列。

来自这两个表的数据实际上存放在一个位置上,就好像簇是一个包含两个表中的所有数据的大表一样。
select  segment_name,file_id,block_id,blocks  from  dba_extents  where
segment_name ='BOOKANDAUTHOR';
1    BOOKANDAUTHOR    4    2015448    8
select rowid,dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid),dbms_rowid.rowid_row_number(rowid),t.* from BOOKSHELF t;
1    AAAjbUAAEAAHsDdAAA    4    2015453    0    aaa    sdf    sdfds    aa

select * from BOOKSHELF_AUTHOR a ,BOOKSHELF b where a.title=b.title and a.title='aaa';
select * from v$mystat where rownum<2;
select spid from v$process t where t.ADDR in (select s.PADDR from v$session s where sid='1193');
alter system dump datafile 4 block min 2015453 block max 2015453;
可以dump出来看看块内的内容。两个表的行确实存在一个块中。两个表没有单独的段,段在聚簇上。

实验2:
参考sys.TAB$   sys.IND$  建聚簇。

create cluster clu_obj (OBJ# number);

CREATE TABLE t_obj_test 
   (  OBJ# NUMBER NOT NULL ENABLE, 
  DATAOBJ# NUMBER, 
  TS# NUMBER NOT NULL ENABLE, 
  FILE# NUMBER NOT NULL ENABLE, 
  BLOCK# NUMBER NOT NULL ENABLE, 
  BOBJ# NUMBER, 
  TAB# NUMBER, 
  COLS NUMBER NOT NULL ENABLE, 
  CLUCOLS NUMBER, 
  PCTFREE$ NUMBER NOT NULL ENABLE, 
  PCTUSED$ NUMBER NOT NULL ENABLE, 
  INITRANS NUMBER NOT NULL ENABLE, 
  MAXTRANS NUMBER NOT NULL ENABLE, 
  FLAGS NUMBER NOT NULL ENABLE, 
  AUDIT$ VARCHAR2(38) NOT NULL ENABLE, 
  ROWCNT NUMBER, 
  BLKCNT NUMBER, 
  EMPCNT NUMBER, 
  AVGSPC NUMBER, 
  CHNCNT NUMBER, 
  AVGRLN NUMBER, 
  AVGSPC_FLB NUMBER, 
  FLBCNT NUMBER, 
  ANALYZETIME DATE, 
  SAMPLESIZE NUMBER, 
  DEGREE NUMBER, 
  INSTANCES NUMBER, 
  INTCOLS NUMBER NOT NULL ENABLE, 
  KERNELCOLS NUMBER NOT NULL ENABLE, 
  PROPERTY NUMBER NOT NULL ENABLE, 
  TRIGFLAG NUMBER, 
  SPARE1 NUMBER, 
  SPARE2 NUMBER, 
  SPARE3 NUMBER, 
  SPARE4 VARCHAR2(1000), 
  SPARE5 VARCHAR2(1000), 
  SPARE6 DATE
   )cluster clu_obj(OBJ#);
   
   
   CREATE TABLE t_ind_test
   (    OBJ# NUMBER NOT NULL ENABLE, 
    DATAOBJ# NUMBER, 
    TS# NUMBER NOT NULL ENABLE, 
    FILE# NUMBER NOT NULL ENABLE, 
    BLOCK# NUMBER NOT NULL ENABLE, 
    BO# NUMBER NOT NULL ENABLE, 
    INDMETHOD# NUMBER NOT NULL ENABLE, 
    COLS NUMBER NOT NULL ENABLE, 
    PCTFREE$ NUMBER NOT NULL ENABLE, 
    INITRANS NUMBER NOT NULL ENABLE, 
    MAXTRANS NUMBER NOT NULL ENABLE, 
    PCTTHRES$ NUMBER, 
    TYPE# NUMBER NOT NULL ENABLE, 
    FLAGS NUMBER NOT NULL ENABLE, 
    PROPERTY NUMBER NOT NULL ENABLE, 
    BLEVEL NUMBER, 
    LEAFCNT NUMBER, 
    DISTKEY NUMBER, 
    LBLKKEY NUMBER, 
    DBLKKEY NUMBER, 
    CLUFAC NUMBER, 
    ANALYZETIME DATE, 
    SAMPLESIZE NUMBER, 
    ROWCNT NUMBER, 
    INTCOLS NUMBER NOT NULL ENABLE, 
    DEGREE NUMBER, 
    INSTANCES NUMBER, 
    TRUNCCNT NUMBER, 
    SPARE1 NUMBER, 
    SPARE2 NUMBER, 
    SPARE3 NUMBER, 
    SPARE4 VARCHAR2(1000), 
    SPARE5 VARCHAR2(1000), 
    SPARE6 DATE
   ) cluster clu_obj(OBJ#);

create index clu_objidx on cluster clu_obj;
insert into t_obj_test select * from sys.TAB$;
insert into t_ind_test select * from sys.IND$;

select * from t_obj_test o  where rownum<5;
select * from t_ind_test o where rownum<5 for update;  修改一些值使他们有相等的。
analyze table t_obj_test compute statistics;
analyze table t_ind_test compute statistics;
select * from t_obj_test o ,t_ind_test i where o.obj#=i.obj# and o.obj#=17;
执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS            3    1    215        
 MERGE JOIN CARTESIAN            3    1    215        
  TABLE ACCESS CLUSTER    SPUSER    T_IND_TEST    2    1    83        
   INDEX UNIQUE SCAN    SPUSER    CLU_OBJIDX    1    1        "I"."OBJ#"=17    
  BUFFER SORT            1    1    132        
   TABLE ACCESS CLUSTER    SPUSER    T_OBJ_TEST    1    1    132        "O"."OBJ#"=17

select * from t_obj_test o ,t_ind_test i where o.obj#=i.obj# and o.obj#<200;
执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS            9    11    2365        
 HASH JOIN            9    11    2365    "O"."OBJ#"="I"."OBJ#"    
  TABLE ACCESS CLUSTER    SPUSER    T_IND_TEST    4    27    2241        
   INDEX RANGE SCAN    SPUSER    CLU_OBJIDX    2    27        "I"."OBJ#"<200    
  TABLE ACCESS CLUSTER    SPUSER    T_OBJ_TEST    4    12    1584        
   INDEX RANGE SCAN    SPUSER    CLU_OBJIDX    2    12        "O"."OBJ#"<200

select * from t_obj_test o ,t_ind_test i where o.obj#=i.obj# ;
执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS            9081    8647    1859105        
 MERGE JOIN            9081    8647    1859105        
  TABLE ACCESS CLUSTER    SPUSER    T_IND_TEST    826    19983    1658589        
   INDEX FULL SCAN    SPUSER    CLU_OBJIDX    26    19983            
  SORT JOIN            8255    8647    1141404    "O"."OBJ#"="I"."OBJ#"    "O"."OBJ#"="I"."OBJ#"
   TABLE ACCESS FULL    SPUSER    T_OBJ_TEST    7995    8647    1141404

select * from t_obj_test o where o.obj#=59 ;
执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS            2    1    132        
 TABLE ACCESS CLUSTER    SPUSER    T_OBJ_TEST    2    1    132        
  INDEX UNIQUE SCAN    SPUSER    CLU_OBJIDX    1    1        "O"."OBJ#"=59    
  
select * from t_obj_test o where o.dataobj#=59 ;
执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS            7995    1    132        
 TABLE ACCESS FULL    SPUSER    T_OBJ_TEST    7995    1    132        "O"."DATAOBJ#"=59

create index idx_obj_test_n1 on t_obj_test(dataobj#);
select * from t_obj_test o where o.dataobj#=59 ;
执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS            3    1    132        
 TABLE ACCESS BY INDEX ROWID    SPUSER    T_OBJ_TEST    3    1    132        
  INDEX RANGE SCAN    SPUSER    IDX_OBJ_TEST_N1    1    1        "O"."DATAOBJ#"=59

oracle聚簇和聚簇索引相关推荐

  1. oracle bookauthor,Oracle 聚簇(征集)

    Oracle 聚簇(收集) 1. 什么是聚簇 聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的.Oracle聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点.非聚簇索引的顺序与 ...

  2. 资源放送丨《Oracle聚簇因子的作用 - 2020云和恩墨大讲堂》PPT视频

    前段时间,墨天轮分享了直播<Oracle聚簇因子的作用 - 2020云和恩墨大讲堂>,在这里我们共享一下PPT和视频,供大家参考学习. 本分享从索引的结构和特点入题,引出聚簇因子的作用,并 ...

  3. Oracle聚簇因子(Clustering factor,CF)

    Oracle 聚簇因子(Clustering factor) 聚簇因子是 Oracle 统计信息中在CBO优化器模式下用于计算cost的参数之一,决定了当前的SQL语句是否走索引,还是全表扫描以及是否 ...

  4. oracle强制走索引_实验验证:Oracle聚簇因子对索引使用的影响

    [引言] 本文基于如下文章进行的实验,讲述聚簇因子对SQL索引的影响. 链接如下: https://www.modb.pro/db/40283 一张表上有索引,sql在执行的时候却不走索引的原因有很多 ...

  5. oracle聚簇因子对于索引使用的影响

    1.聚簇因子的概念 聚簇因子,是CBO优化器决定是否使用索引的因素之一,主要反映索引块上的数据(顺序存储),与该索引基于的表块上的数据(无序存储)的顺序相似程度的差异性.即表数据的存储顺序是否与相应索 ...

  6. Oracle聚簇Cluster

    Oracle数据表三种基本类型:堆表Heap Table.索引组织表IOT和聚簇表Cluster.在我们日常中,最常用也是适应性最好的一种数据表就是堆表Heap Table.一般在没有特殊性能缺陷和特 ...

  7. oracle簇表 数据抽取,Oracle聚簇表

    tacustomer有200万左右的记录数,记录长度上限(各个字段最大长度之和,如VARCHAR2(100)视作最长100个字节)约800个字节.taaccoinfo表约200万,记录长度上限为788 ...

  8. Oracle 11g Release 1 (11.1)——简单管理聚簇

    http://docs.oracle.com/cd/B28359_01/server.111/b28310/clustrs.htm#i1006586 本文内容 创建聚簇 变更聚簇 删除聚簇 创建聚簇 ...

  9. 霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理

    举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种"指南"和"圣经"难以枚举,不一而足,仿佛SQL优化已然是妇孺皆知的理论常识, ...

最新文章

  1. Linux——Linux概念架构的理解
  2. PCB差分走线的阻抗控制技术(一)
  3. linux七个运行级如何设置,RHEL7 运行级别简介及切换操作
  4. 成本费用跨年取得发票的财务、税务处理
  5. Pixhawk之姿态解算篇(3)_源码姿态解算算法分析
  6. IOS基础之NSFounation框架的NSDictionary,NSMutableDictionary的使用
  7. Theory and tools for the conversion of analog to spiking convolutional neural networks
  8. SVN错误:Attempted to lock an already-locked dir及不能提交.so文件
  9. 停车场管理系统软件详细设计说明书
  10. 「Odoo 基础教程系列」第七篇——从 Todo 应用开始(6)
  11. react 组件 进阶之 ref (ts 版本)
  12. 图片:“给你五十行代码把我变成字符画!” 程序:“太多了,一半都用不完!”
  13. 帆软 文件控件图标更换_【产品对比】赢在自我的战场:TABLEAU VS. 帆软 (1)
  14. 僵尸网络检测和抑制方法
  15. plsr matlab,matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)
  16. Android 接入穿山甲激励视频广告步骤与错误总结
  17. spring boot基础简介
  18. python设置刻度间隔不等_Matplotlib绘图遇到时间刻度就犯难?现在,一次性告诉你四种方法...
  19. split()和split(‘ ‘)的区别
  20. java打包exe实例(使用javapackager)

热门文章

  1. devtools安装
  2. SAP 采购合同案例教程案例介绍
  3. 我的世界云之海服务器无尽试炼绿洲,怪兽别跑手游_怪兽别跑安卓版_菜鸟游戏网...
  4. 人到中年,不做这13种人,活成风景而不煞风景!
  5. PAT 甲级1034 Head of a Gang--帮派领袖
  6. 学习arm需要Linux吗,学了半年ARM+linux的一点感想
  7. 网游中将聊天部分与游戏逻辑分离
  8. 马云、郁亮都爱的网红店曝上市传闻 文和友到底为何“走红”?
  9. Linux 高并发学习笔记 - exec 函数簇重载进程
  10. 做个小游戏吧~貌似还挺准