达梦6.0试用之数据库对象

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

由于本人唯一熟悉的数据库就是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索引的时间要明显长于普通索引,而且这里的CLUSTEROracle中的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提供的很相似,前面提到了,达梦实现了自增列,而现在又实现了类似功能的序列,主要应该是出于兼容性的考虑。

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

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

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

 

 

请使用浏览器的分享功能分享到微信等