技术开发 频道

专家点评:达梦6.0试用之分区

  【IT168 独家

  编者言:在4月份举办的2010中国数据库与商业智能技术大会上,国产数据库的代表厂商达梦高调亮相,给一向由国外厂商把持的企业商业数据库市场带来不小的波澜。人们开始纷纷将目光投向国产数据库软件市场,开始关注由中国人自己开发的数据库产品。

  国产数据库产品究竟能不能用?在功能和特性上够不够用?为了解开这些疑问,我们特邀请在数据库业界众多知名的技术专家亲身试用相关产品,并真实地写出自己的试用感受。这些专家大都是Oracle数据库的ACE,或者是对其它主流的商业数据库十分精通和了解,让他们站在这样的角度来客观写出自己对国产数据库的技术评测,是非常有说服力的。

  尽管各位专家的工作都十分繁忙,但他们还是都认为,将国产数据库软件在技术上的真实情况书写出來,给出自己中肯的评价,这是一件非常有意义的工作。 更令人欣慰的是,相比过去,今天像达梦这样的国产数据库产品已经显得非常自信,它们希望听到业界技术专家的建议甚至是批评,不断完善自己的产品和功能,这将是一个非常良性的循环,长此下去,我们相信,摆在国产数据库脚下的将是更为宽广的道路!

  作者简介:杨廷琨(网名Yangtingkun),现任海虹医药电子商务有限公司首席DBA, ITPUB论坛Oracle数据库管理版版主,知名社区技术专家。2004年曾参与编写《Oracle数据库性能优化》一书,2007年被Oracle公司授予Oracle ACE称号,喜欢研究Oracle相关的技术问题,他的技术博客上积累了1500多篇Oracle相关的原创技术文章。

  前几天ITPUB的熊主编和我联系,希望我能参加国产数据库达梦的试用活动,并写几篇使用感受。本来最近手头的事情比较多,本打算推辞的,不过熊主编再三邀请,而且强调并非是枪手文,只要写出真实使用感受即可。既然如此,我就本着支持国产数据库的原则,写几篇试用感受。

  达梦6.0 for Windows安装

  达梦6.0试用之测试环境搭建

  达梦6.0试用之SQL篇

  达梦6.0试用之数据类型

  达梦6.0试用之PLSQL篇

  达梦6.0试用之数据库对象

  达梦6.0试用之架构篇

  达梦6.0试用之数据字典

  达梦6.0试用之分区

  达梦6.0试用之并发和锁机制(即将发布)

  达梦6.0试用之备份恢复(即将发布)

  达梦6.0试用之导入导出(即将发布)

  由于本人唯一熟悉的数据库就是Oracle,因此所有的对比都是与Oracle数据库进行对比,在这个过程中,将尽可能避免将对Oracle数据库的喜爱之情带进来,争取站在一个比较公正的位置上来进行评价。

  这一篇简单介绍一下达梦数据库的分区。

  达梦支持水平和垂直两种分区方式。其中水平分区支持范围分区和散列分区。

  垂直分区是指:将一个表的一些字段划分到单独的对象也就是分区中,而用户在访问的时候并不需要了解分区的存在,直接访问原表就可以访问到整个表的所有字段。在Oracle中没有垂直分区的概念,和INDEX CLUSTER有一定的相似之处。不过INDEX CLUSTER是通过索引列将不同表的数据存储在同一个BLOCK中,这样访问的时候可以避免执行连接操作,仅扫描很少的块就可以完成查询。而垂直分区则是将表中的列分开到不同的分区中,并不是存储在一起,而是分别存储,只是访问的时候通过统一的接口。而且INDEX CLUSTER没有一个统一的接口。Oracle中想要实现同样的功能,可以通过两个表再加上一个视图来模拟垂直分区的分区表,同时还要再视图上建立INSTEAD OF触发器,来处理视图上的INSERT/UPDATE/DELETE操作。

SQL>CREATE TABLE T_PART_COL
2   (ID NUMBER PRIMARY KEY,
3   NAME VARCHAR(30),
4   AGE NUMBER,
5   ADDRESS VARCHAR(30))
6   PARTITION BY COLUMN ((ID, NAME, AGE), (ADDRESS));
CREATE TABLE T_PART_COL
(ID
NUMBER PRIMARY KEY,
NAME
VARCHAR(30),
AGE
NUMBER,
ADDRESS
VARCHAR(30))
PARTITION
BY COLUMN ((ID, NAME, AGE), (ADDRESS));
time used:
85.715(ms) clock tick:143158160.

  上面这个例子就将T_PART_COL分为两个分区,分别存储ID、NAME、AGE列和ADDRESS列。

SQL>SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
2   FROM INFORMATION_SCHEMA.COLUMNS
3   WHERE TABLE_SCHEMA = 'TEST'
4   AND TABLE_NAME LIKE 'T_PART_COL%';
SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'TEST'
AND TABLE_NAME LIKE 'T_PART_COL%';
TABLE_NAME              COLUMN_NAME             ORDINAL_POSITION

1       T_PART_COL      ID      1
2       T_PART_COL      NAME    2
3       T_PART_COL      AGE     3
4       T_PART_COL      ADDRESS 4
5       T_PART_COL00DMPART      ID      1
6       T_PART_COL00DMPART      NAME    2
7       T_PART_COL00DMPART      AGE     3
8       T_PART_COL01DMPART      ADDRESS 1
8 rows got
time used:
12.599(ms) clock tick:21052930.

  Oracle生成了两张表,名称是表名后面增加00DMPART和01DMPART。查询或修改的时候数据库自动将两种表组合在一起。

  水平分区支持RANGE和HASH两种方法,与Oracle的RANGE、HASH分区相比要简单很多。

  首先看看RANGE分区:

SQL>CREATE TABLE T_PART_RANGE
2   (ID NUMBER,
3   NAME VARCHAR(30),
4   CREATE_DATE DATE)
5   PARTITION BY RANGE (CREATE_DATE)
6   LEFT FOR VALUES (TO_DATE('2009-1-1', 'YYYY-MM-DD'),
7   TO_DATE('2010-1-1', 'YYYY-MM-DD'),
8   TO_DATE('2011-1-1', 'YYYY-MM-DD'));
CREATE TABLE T_PART_RANGE
(ID
NUMBER,
NAME
VARCHAR(30),
CREATE_DATE DATE)
PARTITION
BY RANGE (CREATE_DATE)
LEFT FOR VALUES (TO_DATE('2009-1-1', 'YYYY-MM-DD'),
TO_DATE(
'2010-1-1', 'YYYY-MM-DD'),
TO_DATE(
'2011-1-1', 'YYYY-MM-DD'));
time used:
18.524(ms) clock tick:30718050.

  用户只能通过设定分区的上限或下限来确定分区的创建,而达梦似乎并没有提供分区信息的视图。

  这是一个HASH分区的例子:

SQL>CREATE TABLE T_PART_RANGE
2   (ID NUMBER,
3   NAME VARCHAR(30),
4   CREATE_DATE DATE)
5   PARTITION BY RANGE (CREATE_DATE)
6   LEFT FOR VALUES (TO_DATE('2009-1-1', 'YYYY-MM-DD'),
7   TO_DATE('2010-1-1', 'YYYY-MM-DD'),
8   TO_DATE('2011-1-1', 'YYYY-MM-DD'));
CREATE TABLE T_PART_RANGE
(ID
NUMBER,
NAME
VARCHAR(30),
CREATE_DATE DATE)
PARTITION
BY RANGE (CREATE_DATE)
LEFT FOR VALUES (TO_DATE('2009-1-1', 'YYYY-MM-DD'),
TO_DATE(
'2010-1-1', 'YYYY-MM-DD'),
TO_DATE(
'2011-1-1', 'YYYY-MM-DD'));
time used:
18.524(ms) clock tick:30718050.

  虽然达梦数据库支持RANGE和HASH分区,但是与Oracle的分区还是存在很大的区别的。其中最主要的一点就是不透明,分区表建立成功后,就无法判断这个表十分是分区表了,而建立的分区数量,每个分区的名称以及物理属性都是不可见的。连分区名称都不清除,更不要说支持Oracle的SELECT * FROM TABLE PARTITION (P1)的语法了。

  达梦数据库支持分区,也支持分区索引,但是在分区的透明度上还存在很大的不足。

0
相关文章