123
返回列表 发新帖
楼主: wgz7747

是oracle的错误还是我理解概念的错误?

[复制链接]
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
21#
 楼主| 发表于 2006-12-30 15:58 | 只看该作者
我为什么一直深究这个cluster key到底是含一个字段还是三个字段,是由于在文档上有这样的描述
对于一个cluster key及相关的行,是存储在一起的
如果是三个字段是一个cluster key的话,那么一个cluster key就只和一个数据行相关
如果这个cluster key包含只有一个字段的话,那么这个cluster key就和多个数据行相关
而sorted hash cluster是在一个cluster key的相关行内的sort,而不是所有记录的sort
也就是说电话号码是一个cluster key,它的通话记录是这个电话号码 cluster key的相关行
-----------------
CREATE CLUSTER call_detail_cluster (
telephone_number NUMBER,
call_timestamp NUMBER SORT,
call_duration NUMBER SORT )
HASHKEYS 10000 HASH IS telephone_number
SIZE 256;
从这个size,也可以看出应该电话号码是cluster key,而不是三个字段,因为后面的call_detail表的四个字段的字节数和不可能有256字节

CREATE TABLE call_detail (
telephone_number NUMBER,
call_timestamp NUMBER SORT,
call_duration NUMBER SORT,
other_info VARCHAR2(30) )
CLUSTER call_detail_cluster (
telephone_number, call_timestamp, call_duration );

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
122
马上加薪
日期:2014-02-19 11:55:14ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-03-29 13:11:152010广州亚运会纪念徽章:篮球
日期:2011-02-20 22:50:172011新春纪念徽章
日期:2011-02-18 11:42:492011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
22#
发表于 2006-12-30 16:33 | 只看该作者
[php]
SQL> create cluster call_detail_cluster(telephone_number number,
  2  call_timestamp number sort,
  3  call_duration number sort)
  4  hashkeys 10000 hash is telephone_number size 256;

簇已创建。

SQL> CREATE TABLE call_detail (
  2  telephone_number NUMBER,
  3  call_timestamp NUMBER SORT,
  4  call_duration NUMBER SORT,
  5  other_info VARCHAR2(30) )
  6  CLUSTER call_detail_cluster (
  7  telephone_number, call_timestamp, call_duration );

表已创建。

SQL> insert into call_detail values(1234,12,34,'t');

已创建 1 行。

SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block# from call_detail;

       FNO     BLOCK#
---------- ----------
         4        744

SQL> insert into call_detail values(1234,124,343,'X');

已创建 1 行。

SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block# from call_detail;

       FNO     BLOCK#
---------- ----------
         4        744
         4        744


SQL> insert into call_detail values(5432,12,34,'t');

已创建 1 行。

SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block# from call_detail;

       FNO     BLOCK#
---------- ----------
         4        744
         4        744
         4        747

--
[/php]


可见,cluster key应该只有telephone_number,改变其他两个列只要telephone_number一样,还是保存在同一个block中

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
122
马上加薪
日期:2014-02-19 11:55:14ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-03-29 13:11:152010广州亚运会纪念徽章:篮球
日期:2011-02-20 22:50:172011新春纪念徽章
日期:2011-02-18 11:42:492011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
23#
发表于 2006-12-30 16:46 | 只看该作者
[php]
SQL> create cluster call_detail_cluster_2(telephone_number number,
  2  call_timestamp number sort,
  3  call_duration number sort)
  4  hashkeys 10000  size 256;

簇已创建。

SQL> CREATE TABLE call_detail2 (
  2  telephone_number NUMBER,
  3  call_timestamp NUMBER SORT,
  4  call_duration NUMBER SORT,
  5  other_info VARCHAR2(30) )
  6  CLUSTER call_detail_cluster_2 (
  7  telephone_number, call_timestamp, call_duration );

表已创建。

SQL> insert into call_detail2 values(1234,12,34,'t');

已创建 1 行。

SQL> insert into call_detail2 values(1234,124,343,'X');

已创建 1 行。

SQL> insert into call_detail2 values(5432,12,34,'t');

已创建 1 行。

SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block# from call_detail2;

       FNO     BLOCK#
---------- ----------
         4       1256
         4       1256
         4       1259

--
[/php]


可见,对于sorted hash cluster,cluster key还是telephone_number一个column,加了sort关键字的列只是用来排序的,不是用cluster key的组成部分

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
122
马上加薪
日期:2014-02-19 11:55:14ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-03-29 13:11:152010广州亚运会纪念徽章:篮球
日期:2011-02-20 22:50:172011新春纪念徽章
日期:2011-02-18 11:42:492011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
24#
发表于 2006-12-30 16:49 | 只看该作者
[php]
SQL> create cluster call_detail_cluster_3(telephone_number number,
  2  call_timestamp number,
  3  call_duration number)
  4  hashkeys 10000  size 256;

簇已创建。

SQL> CREATE TABLE call_detail3 (
  2  telephone_number NUMBER,
  3  call_timestamp NUMBER,
  4  call_duration NUMBER,
  5  other_info VARCHAR2(30) )
  6  CLUSTER call_detail_cluster_3 (
  7  telephone_number, call_timestamp, call_duration );

表已创建。

SQL> insert into call_detail3 values(1234,12,34,'t');

已创建 1 行。

SQL> insert into call_detail3 values(1234,124,343,'X');

已创建 1 行。

SQL> insert into call_detail3 values(5432,12,34,'t');

已创建 1 行。

SQL> insert into call_detail3 values(5432,12,1,'t');

已创建 1 行。

SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block# from call_detail3;

       FNO     BLOCK#
---------- ----------
         4       1344
         4       1440
         4       1467
         4       1538
--
[/php]


这个例子的cluster key才是telephone_number, call_timestamp, call_duration 三个列的联合

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
122
马上加薪
日期:2014-02-19 11:55:14ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-03-29 13:11:152010广州亚运会纪念徽章:篮球
日期:2011-02-20 22:50:172011新春纪念徽章
日期:2011-02-18 11:42:492011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
25#
发表于 2006-12-30 16:52 | 只看该作者
总结一下

对于普通的hash cluster,如果没有指定hash is字句,也没有使用sort关键字,则用create cluster中所有列出的column做为联合cluster key

如果hash is指定了具体的表达式,则是用hash is指定的表达式做为cluster key

sorted hash cluster中,指定了sort关键字的sorted 列不是cluster key的组成部分。

对于hash cluter的理解不够深,有理解错误的地方欢迎大家探讨

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
51
ITPUB元老
日期:2007-09-25 14:45:26现代
日期:2014-02-10 13:35:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-08-25 08:54:25
26#
 楼主| 发表于 2006-12-30 17:12 | 只看该作者
根据你做的试验,可以得出这样的结论。
这是根据试验来得出的结论,但是在oracle的文档中没有看到这样的描述

-------------------
但还是有不严谨的地方
原因如下:
第一:
出现在同一块内的行不一定就一定属于同一个cluster key,在创建cluster时指定的size参数为256,那么就是说一个块内也可以存储多个cluster key的行,但这似乎与你做试验要说明的东西无关
第二:
当然了,不在同一个块内的行也不一定就不属于一个cluster key,因为如果一个cluster key的相关行很多的话,会形成chain,就会在一个以上的块中存在同一个cluster key的行(当然,你做的例子不会出现第二种情况,因为cluster key没有多少相关行)

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
122
马上加薪
日期:2014-02-19 11:55:14ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-03-29 13:11:152010广州亚运会纪念徽章:篮球
日期:2011-02-20 22:50:172011新春纪念徽章
日期:2011-02-18 11:42:492011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
27#
发表于 2006-12-30 17:23 | 只看该作者
实验是有不严谨的地方,因为做了很多简化和假设。不过结论我想应该是正确的。而且,dump出具体的block应该可以看到行是不是属于同一个key的,太长了就不贴出来了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表