技术开发 频道

专家点评:达梦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数据库的喜爱之情带进来,争取站在一个比较公正的位置上来进行评价。

  这一篇简单介绍达梦数据库提供的各种数据库对象。

  数据库对象类型比较多,只能从最简单的层面进行概述:

SQL>CREATE TABLE T_TAB (ID NUMBER, NAME VARCHAR);
CREATE TABLE T_TAB (ID NUMBER, NAME VARCHAR);
time used:
145.832(ms) clock tick:243819170.
SQL
>CREATE INDEX IND_T_TAB
2   ON T_TAB (ID);
CREATE INDEX IND_T_TAB
ON T_TAB (ID);
time used:
63.429(ms) clock tick:106042860.
SQL
>CREATE INDEX IND_T_TAB2
2   ON T_TAB(ID);
CREATE INDEX IND_T_TAB2
ON T_TAB(ID);
time used:
74.793(ms) clock tick:125041410.

 

  数据库中处理最常见的表之外,就是索引了,显然和Oracle数据库中不一样,同一个字段上可以重复索引多次。

  除了常规的索引外,还可以建立唯一索引和BITMAP索引:

SQL>CREATE UNIQUE INDEX IND_T_ID ON T(ID);
CREATE UNIQUE INDEX IND_T_ID ON T(ID);
time used:
48.352(ms) clock tick:80826160.
SQL
>CREATE BITMAP INDEX IND_T_DATE
2   ON T(CREATE_DATE);
CREATE BITMAP INDEX IND_T_DATE
ON T(CREATE_DATE);
time used:
1.051(ms) clock tick:1554330.

  达梦数据库还支持CLUSTER索引:

SQL>CREATE CLUSTER INDEX IND_T_C_NAME
2   ON T(NAME);
CREATE CLUSTER INDEX IND_T_C_NAME
ON T(NAME);
time used:
1573.010(ms) clock tick:1245465460.

  创建CLUSTER索引的时间要明显长于普通索引,而且这里的CLUSTER和Oracle中的CLUSTER以及CLUSTER INDEX并不相同,这里的CLUSTER索引类似SQLSERVER中的CLUSTER索引。

  函数索引也是支持的:

SQL>CREATE INDEX IND_UPP_NAME
2   ON T(UPPER(NAME));
CREATE INDEX IND_UPP_NAME
ON T(UPPER(NAME));
time used:
46.564(ms) clock tick:77264470.

  甚至连全文索引都是支持的:

SQL>CREATE TABLE T_LOB
2   (ID NUMBER,
3   CONTENTS CLOB);
CREATE TABLE T_LOB
(ID
NUMBER,
CONTENTS CLOB);
time used:
12.018(ms) clock tick:19830720.
SQL
>INSERT INTO T_LOB
2   VALUES (1, '用户可以在指定的表的文本列上建立全文索引');
INSERT INTO T_LOB
VALUES (1, '用户可以在指定的表的文本列上建立全文索引')
1 rows affected
time used:
0.390(ms) clock tick:639420.
SQL
>CREATE CONTEXT INDEX T_CONTEXT_LOB
2   ON T_LOB(CONTENTS);
CREATE CONTEXT INDEX T_CONTEXT_LOB
ON T_LOB(CONTENTS);
time used:
553.896(ms) clock tick:633347730.
SQL
>SELECT * FROM T_LOB
2   WHERE CONTAINS(CONTENTS, '索引');
SELECT * FROM T_LOB
WHERE CONTAINS(CONTENTS, '索引');
全文索引
'T_CONTEXT_LOB' 无效,需要重新填充.error code = -1453
SQL
>ALTER CONTEXT INDEX T_CONTEXT_LOB ON T_LOB REBUILD;
ALTER CONTEXT INDEX T_CONTEXT_LOB ON T_LOB REBUILD
time used:
1087.051(ms) clock tick:1746940440.
SQL
>SELECT * FROM T_LOB
2   WHERE CONTAINS(CONTENTS, '索引');
SELECT * FROM T_LOB
WHERE CONTAINS(CONTENTS, '索引');
ID              CONTENTS
1       1       用户可以在指定的表的文本列上建立全文索引
1 rows got
time used:
0.734(ms) clock tick:1213930.
SQL
>SELECT * FROM T_LOB
2   WHERE CONTAINS(CONTENTS, '索引' AND '文本');
SELECT * FROM T_LOB
WHERE CONTAINS(CONTENTS, '索引' AND '文本');
ID              CONTENTS
1       1       用户可以在指定的表的文本列上建立全文索引
1 rows got
time used:
1.117(ms) clock tick:1853100.

  全文索引的语法和Oracle的相似,但是有不少的区别,比如全文索引比较要先填充才能使用,比如CONTAINS操作返回的是布尔类型而不是数值。由于这部分包含的内容比较多,这里就不深入了,不过达梦显然是支持全文索引功能的,而且也是支持中文切词的。

  达梦数据库支持视图对象:

SQL>CREATE VIEW V_TEST
2   AS SELECT * FROM T;
CREATE VIEW V_TEST
AS SELECT * FROM T;
time used:
32.179(ms) clock tick:53413690.
SQL
>SELECT * FROM V_TEST;
SELECT * FROM V_TEST;
id              name            create_date
1       1       A       NULL
2       2       B       2010-04-07
3       3       ABC     NULL
3 rows got
time used:
0.524(ms) clock tick:860730.
SQL
>UPDATE V_TEST
2   SET NAME = LOWER(NAME);
UPDATE V_TEST
SET NAME = LOWER(NAME);
3 rows affected
time used:
28.230(ms) clock tick:47182590.
SQL
>SELECT * FROM V_TEST;
SELECT * FROM V_TEST;
id              name            create_date
1       1       a       NULL
2       2       b       2010-04-07
3       3       abc     NULL
3 rows got
time used:
0.292(ms) clock tick:473380.

  而且视图也是可以更新的。

  下面看看同义词对象:

SQL>CREATE SYNONYM S_T FOR T;
CREATE SYNONYM S_T FOR T;
time used:
38.520(ms) clock tick:64245130.
SQL
>SELECT * FROM S_T;
SELECT * FROM S_T;
id              name            create_date
1       1       a       NULL
2       2       b       2010-04-07
3       3       abc     NULL
3 rows got
time used:
0.528(ms) clock tick:865700.
SQL
>CREATE PUBLIC SYNONYM S_1 FOR T;
CREATE PUBLIC SYNONYM S_1 FOR T;
time used:
31.936(ms) clock tick:53378050.
SQL
>CREATE SYNONYM S_TEST FOR F_TAX;
CREATE SYNONYM S_TEST FOR F_TAX;
time used:
11.845(ms) clock tick:19788480.
SQL
>SELECT S_TEST(5000) FROM T;
SELECT S_TEST(5000) FROM T;

1       325
2       325
3       325
3 rows got
time used:
0.495(ms) clock tick:815300.

  可以创建普通同义词、PUBLIC同义词。可以创建指向表的同义词,也可以创建函数的同义词。这部分和Oracle中没有什么区别。

  看看序列部分:

SQL>CREATE SEQUENCE S_1
2   INCREMENT BY 3
3   START WITH 5;
CREATE SEQUENCE S_1
INCREMENT
BY 3
START
WITH 5;
time used:
63.185(ms) clock tick:105098660.
SQL
>SELECT S_1.NEXTVAL FROM T;
SELECT S_1.NEXTVAL FROM T;
NEXTVAL
1       5
2       8
3       11
3 rows got
time used:
0.947(ms) clock tick:1567590.

  序列也与Oracle提供的很相似,前面提到了,达梦实现了自增列,而现在又实现了类似功能的序列,主要应该是出于兼容性的考虑。

  在前面已经提到了,达梦数据库是支持过程、函数、包和触发器的,但是达梦数据库不支持对象。

  达梦还支持快照。不过这个SNAPSHOT和Oracle中的SNAPSHOT也就是物化视图大相径庭,达梦中的SNAPSHOT是数据库的快照,创建的实际上就是指定数据库在创建时间点的只读镜像,这实际上已经不是对象的概念了,这里就不再描述了。

  总的来说,Oracle绝大部分的对象在达梦数据库中都是支持的,而且大部分对象的用法和功能都没有发生变化,这使得迁移在对象层面上变得可行。

0
相关文章