oracle聚簇和聚簇索引

news/2024/11/29 5:46:01/

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    


http://www.ppmy.cn/news/338384.html

相关文章

erlang基础练习题

erlang基础练习题 1、将列表中的integer,float,atom转成字符串并合并成一个字个字符串&#xff1a;[1,a,4.9,“sdfds”] 结果&#xff1a;“1a4.9sdfds”&#xff08;禁用 – append concat实现&#xff09; // An highlighted block spl([]) -> []; spl([H|T]) ->X i…

linux搭建java部署环境-docker

目录 一. Docker环境 二. JAVA环境安装 三. MySQL安装 四. Redis安装 五. Nginx安装 六.检查安装结果 七. 创建maven仓库 八. 项目打jar并发布 九. nginx反向代理 一. Docker环境 1. 查看linux内核版本: uname -a 2. 查看centos版本: cat /etc/redhat-release 3. 安…

企业微信开发/主要代码分享(前端)

前端起步 这次开发主要是自建应用/H5/Vue2 因为用的是自建应用H5&#xff0c;所以第一步考虑的是企微中jssdk的使用 1.利用vue的mixin方法和js类的方法写两个个公共组件&#xff08;可以下载任意目录下&#xff09; 首先是getAuth.js import { oauthUrl, oauthUser } from &q…

基于PHP的论文管理系统的设计与实现

目 录 论文总页数&#xff1a;27页 1 引言 1 2 系统需求 1 2.1 系统需求概述 1 2.2 系统详细需求分析 1 2.2.1 基于web开发 1 2.2.2 格式化文档 2 2.2.3 前台需求 2 2.2.4 性能需求 2 3 方案选择 2 3.1 方案比较 2 3.1.1 系统模式比较 2 3.1.2 程序语言选择与比较 3 3.1.3 数据…

自定义QCompleter,直接绑定QLineEdit,可默认选中,自动根据内容行数自动缩小高度

自定义QCompleter&#xff0c;直接绑定QLineEdit&#xff0c;可默认选中&#xff0c;自动根据内容缩小窗口&#xff0c;能设置最高显示行数&#xff0c;自动停靠。里面的duplicatelist是本人的特殊用途&#xff0c;正常情况下是不需要&#xff0c;也就构造函数最后一个参数其实…

紧急求助~~!!!

刚刚学了Java一个学期&#xff0c;刚刚对Java稍稍了解&#xff0c;老师就让我们完成一个课程设计题目。虽然应该可以编出来&#xff0c;但我现在真的没有什么思路&#xff0c;所以&#xff0c;紧急求助高手指点一二&#xff0c;帮帮在下吧&#xff0c;一个星期的时间就得上交了…

erlang练习题

-module(three). -export([]). %% 1、将列表中的integer,float,atom转成字符串并合并成一个字个字符串&#xff1a;[1,a,4.9,“sdfds”] 结果&#xff1a;“1a4.9sdfds” one([])->[]; one([H|T])-> if is_list(H)->Hone(T); true->lists:flatten(io_lib:format(&…

Quartz 单独启动任务调度器案例举例

Quartz 配置文件&#xff0c;如果是基于maven 的项目只需要放置到src/main/resources目录下 #quartz setting File # quartz instance Name org.quartz.scheduler.instanceName MySchedulerVincent# quarts thread pool size 3 ; maximum of 3 jobs can be run simultaneous…