Hash clustered table与索引聚簇表非常相似,只有一个主要区别:聚簇键索引被一个hash函数所取代,表中的数据就是索引.所以没有物理索引

hash clustered table也有副作用,如果不对表加一个传统索引,将无法对表进行range scan,比如 select * from emp where deptno between 10 and 20,会产生全表扫描.

理想情况下,散列值均匀地分布到为散列聚簇分配的所有块上,从查询利用一个I/O就能直接找到数据。实际中,最后可能会有多行数据的散列值散列到同一个数据库块地址,而且这个块上放不下这么多行,这就会导致块串链,用一个链表把块串起来,来保存散列到这个块的所有行,当需要获取与某个散列键匹配的行时,可能必须访问多个块。此外,散列冲突也会增加开销,使块串联的可能性增加。

相关参数:

HASHKEYS:Oracle将HASHKEYS值“舍入”为与之最接近的质数(散列键数总是一个质数),然后再将SIZE参数乘以修改后的HASHKEYS值,根据这个结果为聚簇分配空间。也就是至少需要分配的空间字节数。可以用公式(HASHKEYS/trunc(blocksize/SIZE))来计算散列聚簇需要预留的最少块数量。对一个几乎为空的散列聚簇进行全表扫描与全面扫描一个满的散列聚簇所花的时间是一样的。所以,建立散列聚簇的目的是为了根据散列键查找从而非常快地访问数据,而不是为了频繁地对它进行全面扫描。

HASH IS:此选项用来指定散列函数。可以指定一个SQL函数。如果不指定则使用Oracle内部的散列函数。

SINGLE TABLE:此选项用来指定创建单表散列聚簇(single table hash cluster),这是散列聚簇有一个特例。它只支持聚簇中存在一个表。这种散列聚簇是为按主键来快速访问一个表而设计得。单表散列聚簇需要更少的缓冲区latch来完成处理,并CPU的用量会大幅减少

创建散列聚簇表步骤如下:

创建散列聚簇

create cluster emp_dep_cluster (depno number(2)) hashkeys 100 size 2048 hash is depno;

创建表

create table department (

depno number(2) primary key, depname varchar2(20))

cluster emp_dep_cluster(depno);

create table employee (

empno number primary key, empname varchar2(20),

depno number(2) references department(depno))

cluster emp_dep_cluster(depno);

hash clustered table的要点是:

1)hash clustered table中是把传递到查询的需求转换成一个FILE/BLOCK,并且直接读,不经过索引.

2)hash clustered table的I/O要少得多,因为heap table要至少做一次I/O来获取rowid,然后通过rowid来访问表

3)散列聚簇查询与索引查询所用的CPU是一样的,尽管它访问buffer hash的次数要少得多。但执行hash是一个CPU相当密集的操作(索引是I/O密集的操作).这里要做个权衡.

hash clustered table小结

1) 散列聚簇一开始就要分配空间。Oracle根据你的HASHKEYS和SIZE来计算HASHKEYS/trunc

(blocksize/SIZE),立即分配空间,并完成格式化,一旦将第一个表放入这个聚簇中,任何

全面扫描都会命中每一个已分配的块。在这方面,它与其他的所有表都不同。

2) 散列聚簇中的HASHKEY 数是固定大小的。除非重新聚簇,否则不能改变散列表的大小。这

并不会限制聚簇中能存储的数据量,它只是限制了能为这个聚簇生成的惟一散列键的个数。如

果HASHKEY 值设置得太低,可能因为无意的散列冲突影响性能。

3) 不能在聚簇键上完成区间扫描。诸如WHERE cluster_key BETWEEN 50 AND 60 谓词条件

不能使用散列算法。介于50~60 之间的可能值有无限多个,服务器必须生成所有可能的值,并

分别计算散列,来查看相应位置是否有数据。这是不可能的。如果你在一个聚簇键上使用区间

扫描,而且没有使用传统索引,实际上会全面扫描这个聚簇。

散列聚簇适用于以下情况:

· 很清楚表中会有多少行,或者知道一个合理的上界。HASHKEY和SIZE参数的大小要正确,这对于避免聚簇重建至关重要。

· 主要执行获取操作相比,DML(特别是插入)很少。更新不会引入严重的开销, 除非更新了HASHKEY(更新HASHKEY会导致行迁移)。

· 经常按HASHKEY值访问数据。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29337971/viewspace-1062759/,如需转载,请注明出处,否则将追究法律责任。

mysql库表散列_数据库表--hash clustered table相关推荐

  1. sql2008表支持多少列_数据库表分区是怎么回事?

    ​ 数据库表分区是怎么回事? 大家好,这一期呢,我们来说一下,数据库表和索引的分区.讲解这个问题,对于不同的数据库可能有一些技术细节上的不同,因此我们以某个数据库比如sql server为例来探讨这个 ...

  2. java mysql 表关系分析_数据库表的关系

    表与表之间一般存在三种关系,即一对一,一对多,多对多关系. 下面分别就三种关系讲解数据库相关设计的思路和思考过程: (1)一对一关系 例如,下面的一张表,保存了人的相关信息,有男有女,要求查处所有的夫 ...

  3. mysql 表名 复数_数据库表命名,复数或单数

    这个问题要求进行宗教战争. 我无疑应该是复数,因为- >表是行的集合. > sql语法变得更加自然 – SELECT * FROM Customers而不是SELECT * FROM Cu ...

  4. mysql表设计原子性_数据库表设计-原子性

    好的数据结构会影响速度.好的数据库表设计会影响数据库操作效率.特别是数据多的时候,如果表的结构不好的话操作的时候条件(where后的内容)会变的非常复杂. SQL是关系数据库中用到的一种语言.所以,为 ...

  5. mysql 表名 复数_数据库表名,应该用复数还是单数

    用单数形式更佳,理由如下: 1.概念直观. 你有一个袋子,里面有好多个苹果,你会说这是个苹果袋.但无论里面有0,1,百万个苹果,它依然是个袋子.表也是如此,表明需要描述清楚,表里面包含的对象,而非有多 ...

  6. mysql逻辑删除的问题_数据库表涉及-逻辑删除

    对于只进行逻辑删除的表,如 CREATE TABLE `pics` ( `pid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `aid` bigint( ...

  7. mysql表增加一行_数据库表增加一行数据

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. mysql主从复制、读写分离到数据库水平拆分及库表散列

    文章转载自http://blog.csdn.net/sd4422739/article/details/49514981 web项目最原始的情况是一台服务器只能连接一个mysql服务器(c3p0只能配 ...

  9. mysql表结构设计_数据库表结构设计

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证 ...

最新文章

  1. 怎样修改Ubuntu的root帐户密码并使用root登录
  2. 图的单源最短路径,Floyd算法(数据结构c++)
  3. 破云里步重华为什么说自己姓薛_都说虎毒不食子,但猫咪为什么会吃掉自己的孩子呢...
  4. 灰色关联度分析_数学建模|关联分析之术|灰度预测模型预备知识
  5. 资料员考试题库计算机,资料员考试试题库及答案(5套).docx
  6. Java使用Swing实现五子棋。
  7. 不会框架不要紧,我带你自定义框架
  8. ucore Lab1 系统软件启动过程
  9. win7如何显示文件后缀名 win7怎么显示文件后缀名?
  10. STEAM账号被盗(绑定QQ邮箱)的找回方法以及背后操作原理解析
  11. php 搜索引擎 分词_PHP 实现中文分词搜索功能
  12. 常见的http请求响应的状态码
  13. 计算机华科与电子科技大学哪个好,华中科技大学、电子科技大学、中国科学技术大学,哪所实力最强?...
  14. EASY spa单页面版文档
  15. SSM萌宠宠物网店毕业设计源码011042
  16. SparkSql 项目实战 | 各区域热门商品Top3
  17. [会议系统 | 手拉手会议]100㎡手拉手会议系统解决方案
  18. Java生成PDF417二维码
  19. (2019春)软件构造:雨课堂试卷(四)(第6章)
  20. java二维数组杨辉三角_java数组学习:使用二维数组输出杨辉三角

热门文章

  1. 哪个国家大学计算机物联网好,物联网专业实力强的大学有哪些
  2. 鸿蒙OS尝新版,华为鸿蒙系统最新版-华为鸿蒙系统os2.0官方版-华为harmonyos公测-游人手游网...
  3. java p12 ssl_从 p12 格式 SSL 证书解出 pem 格式公钥私钥给 Postman 使用
  4. 数据结构基础篇-链表反转(非递归与递归)C++实现
  5. 单位不同意签署无期限劳动合同怎么办
  6. c++笔记 STL list容器_反转和排序
  7. 小米wifi链android,小米WiFi链是什么?怎么玩?小米WiFi链app玩法详解
  8. 苹果手机怎么清理缓存_【优化】苹果清理缓存垃圾终极方案丨还你干净手机
  9. java在访问https资源时,忽略证书信任问题
  10. 骑行318、 2016.7.22