Oracle支持两种类型的聚簇:索引聚簇和哈希聚簇

一.索引聚簇表的原理

聚簇:如果一些表有一些共同的列,则将这样一组表存储在相同的数据块中

聚簇还表示把相关的数据存储在同一个块上。利用聚簇,一个块可能包含多个表的数据。

概念上就是说如果两个表或多个表经常做连接操作,就可以预先把需要的数据也存储在一起。

聚簇还可以用于单个表,可以按某个列将数据分组存储。

简单的说,簇就是一组表,由一组共享相同数据块的多个表组成,将经常一起使用的表组合在一起成簇

就可以提高处理效率。

二.使用方法

建立的顺序:簇——>簇表——>簇索引——>数据

如下

a.创建簇

CREATE CLUSTER my_clu(
deptno NUMBER(10))
PCTUSED 60 
PCTFREE 10
SIZE 1024 --
TABLESPACE USERS
storage(
INITIAL 128k
NEXT 128k
MINEXTENTS 2
MAXEXTENTS 20
);

关于size选项:size为1024表示每个聚簇键关联大约1024字节的数据(1024对于一般的表一条数据没问题)

oracle会用size这个设置来计算每个块最多能放下多少个聚簇键。假设块大小为8kb,oradcle会在每个数据块

上放做多7个聚簇键,也就是说deptno为10-60的数据会放在一个块上,一旦插入部门80,就会使用一个新块,

存放的顺序是和插入顺序相关的。

size控制着每块上聚簇键的最大个数。是对聚簇空间利用率影响最大的因素。如果size设置的过高,那么每个块

上的键就会很少(单位block可以存的聚簇键就少了),会导致不必要的使用过多的空间。如果设置的过低,又会

导致数据过分串链(一个聚簇键不够存放一条数据),就与聚簇本来的目的不符,因为聚簇原本就是为了把相关

数据都存储在一个块上

b.创建簇表

CREATE TABLE t1_dept(
deptno NUMBER(10),
dname VARCHAR2(20))
CLUSTER my_clu(deptno);

CREATE TABLE t1_emp(
empno NUMBER,
ename VARCHAR2(20),
birth_date DATE,
deptno NUMBER(10))
CLUSTER my_clu(deptno);

此时如果直接查询创建的表,将会出现提示

SELECT * FROM t1_dept; --聚簇表无法在索引建立之前使用

c.为簇创建索引

CREATE INDEX clu_index ON cluster my_clu;

j聚簇索引的任务是拿到一个聚簇键值,然后返回包含这个键的block的块地址.实际上这是一个 主键

其中每个聚簇键值指向聚簇本身中的一个块。因此,在请求deptno=10的数据时,oracle会读取聚簇键

确定相应的块地址,然后读取数据

管理聚簇

a.对于簇的修改使用alter,需要具有alter any cluster的权限

ALTER CLUSTER my_clu PCTUSED 40;
b.删除簇

drop cluster my_clu: --仅适用于删除空簇

drop cluster my_clu including tables;--删除簇和簇表

drop cluster my_clu including tables cascade constraints;--同时删除外键约束

c.清空簇

truncate cluster my_clu;

注:所有在此簇上的表的数据全部被清空

三.加载数据

向聚簇表中加载数据需要使用合理的处理方法,否则会使得聚簇的功能发挥不完全,

降低查询的效率

四.不宜使用簇的情况

1.如果预料到聚簇表会大量被修改,聚簇表会对dml的性能造成负面影响

2.非常不适合对单表的全表扫描,因为只能引起对其他表的全表扫描

3.频繁对表进行truncate操作,因为聚簇中的表是不能truncate的,只能清空(truncate)簇

4.如果簇只是欧惹人被连接或他们的公共列经常被吸怪,则不要聚簇表

5.如果经常从所有相同聚簇值得表查询出的结果的数据超过一个或两个oracle块,则不要聚簇表

6.如果空间不够,并且不能为将要插入的新纪录分配额外的空间,那么不要使用簇

oracle聚簇表的理解 (转自:https://blog.csdn.net/gumengkai/article/details/51009345 )的更多相关文章

  1. myeclipse通过数据表生成jpa或hibernate实体---https://blog.csdn.net/partner4java/article/details/8560289

    myeclipse通过数据表生成jpa或hibernate实体-----https://blog.csdn.net/partner4java/article/details/8560289

  2. golang语言并发与并行——goroutine和channel的详细理解(一) 转发自https://blog.csdn.net/skh2015java/article/details/60330785

    如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人. Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据. ...

  3. 系统虚拟内存的理解 转载自http://blog.csdn.net/do2jiang/article/details/4690967

    在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序 ...

  4. 如何简单地理解Python中的if __name__ == '__main__'(https://blog.csdn.net/yjk13703623757/article/details/77918633)

    1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '_ ...

  5. 使用Mybatis进行连表查询、left join---https://blog.csdn.net/jinzhencs/article/details/51980518

    使用Mybatis进行连表查询.left join https://blog.csdn.net/jinzhencs/article/details/51980518

  6. Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

    一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue. 当一个进程访问需 ...

  7. Redis中为什么使用跳表---------转自http://blog.csdn.net/u010412301/article/details/64923131

    最近在研究数据库的一些底层实现,百度的面试官问到了跳表,当时没有回答上来,在csdn上看到了这篇文章,感觉写的比较好,希望大家可以多多交流. Redis里面使用skiplist是为了实现sorted ...

  8. MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844

    查看分区数据量,查看全库数据量 USE information_schema; SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PAR ...

  9. oracle的散列聚簇表

    在簇表中,Oracle使用存储在索引中的键值来定位表中的行, 而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行. 创建散 ...

随机推荐

  1. java File delete()执行失败原因(转)

    java.io.File里的delete操作很实用也很常用,可以用来删除单独的文件和某一目录.但有时候会出现delete失败的情况,出现这种情况的原因一般有以下几种:1.删除时还有其他程序在使用该文件 ...

  2. js根据子目录数目显示父级目录

    需求:<ul>中<li>数量为0,则不显示<ul>以及<b>:<div>中<ul>数量为0,则不显示<div> 1. ...

  3. [转]微信小程序开发系列(一)小程序开发初体验

    本文转自:http://www.cnblogs.com/rennix/p/6287432.html 开发小程序所需的基本技能   关于小程序的介绍和使用场景这里不作介绍,这个系列的文章会一步一步地带领 ...

  4. flutter Failed to setup Skia Gr context导致白屏

    添加 --enable-software-rendering参数运行 G:\soft\flutter\project\hello_world> flutter run --enable-soft ...

  5. CSS3动画属性animation的基本用法

    CSS3新增了一个令人心动的属性:animation,尽管利用animation做出来的动画没有flash或者javascript做出的动画流畅绚丽,但是从代码量和浏览器性能上有着明显的优点. ani ...

  6. Python3.4 获取百度网页源码并保存在本地文件中

    最近学习python 版本 3.4 抓取网页源码并且保存在本地文件中 import urllib.request url='http://www.baidu.com' #上面的url一定要写明确,如果 ...

  7. Java 访问权限控制- protected 关键字

    protected 关键字的真正内涵 文章来源:http://blog.csdn.net/justloveyou_/article/details/61672133 很多介绍Java语言的书籍(包括& ...

  8. 详解nodejs中使用socket的私聊和公聊的办法

    详解nodejs中使用socket的私聊和公聊的办法 nodejs的应用中,关于socket应该是比较出彩的了,socket.io在github上有几万人的star,它的成功应该是不输于express ...

  9. 【Linux】 Linux编程规范&Linux 编程环境搭建

    一.通过Samba映射网络驱动器 菜单栏-计算机-映射网络驱动器 English 菜单栏-Home -Easy access-Map as drive 编辑代码使用 Windows 编译 运行程序在 ...

  10. python 继承式多线程

    Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run(): Thread继承 import threading import time class MyThrea ...