【IT168 独家】
编者言:在4月份举办的2010中国数据库与商业智能技术大会上,国产数据库的代表厂商达梦高调亮相,给一向由国外厂商把持的企业商业数据库市场带来不小的波澜。人们开始纷纷将目光投向国产数据库软件市场,开始关注由中国人自己开发的数据库产品。
国产数据库产品究竟能不能用?在功能和特性上够不够用?为了解开这些疑问,我们特邀请在数据库业界众多知名的技术专家亲身试用相关产品,并真实地写出自己的试用感受。这些专家大都是Oracle数据库的ACE,或者是对其它主流的商业数据库十分精通和了解,让他们站在这样的角度来客观写出自己对国产数据库的技术评测,是非常有说服力的。
尽管各位专家的工作都十分繁忙,但他们还是都认为,将国产数据库软件在技术上的真实情况书写出來,给出自己中肯的评价,这是一件非常有意义的工作。 更令人欣慰的是,相比过去,今天像达梦这样的国产数据库产品已经显得非常自信,它们希望听到业界技术专家的建议甚至是批评,不断完善自己的产品和功能,这将是一个非常良性的循环,长此下去,我们相信,摆在国产数据库脚下的将是更为宽广的道路!
作者简介:杨廷琨(网名Yangtingkun),现任海虹医药电子商务有限公司首席DBA, ITPUB论坛Oracle数据库管理版版主,知名社区技术专家。2004年曾参与编写《Oracle数据库性能优化》一书,2007年被Oracle公司授予Oracle ACE称号,喜欢研究Oracle相关的技术问题,他的技术博客上积累了1500多篇Oracle相关的原创技术文章。
前几天ITPUB的熊主编和我联系,希望我能参加国产数据库达梦的试用活动,并写几篇使用感受。本来最近手头的事情比较多,本打算推辞的,不过熊主编再三邀请,而且强调并非是枪手文,只要写出真实使用感受即可。既然如此,我就本着支持国产数据库的原则,写几篇试用感受。
达梦6.0试用之架构篇(即将发布)
达梦6.0试用之数据字典(即将发布)
达梦6.0试用之分区(即将发布)
达梦6.0试用之并发和锁机制(即将发布)
达梦6.0试用之备份恢复(即将发布)
达梦6.0试用之导入导出(即将发布)
由于本人唯一熟悉的数据库就是Oracle,因此所有的对比都是与Oracle数据库进行对比,在这个过程中,将尽可能避免将对Oracle数据库的喜爱之情带进来,争取站在一个比较公正的位置上来进行评价。
这一篇简单介绍达梦数据库提供的各种数据库对象。
数据库对象类型比较多,只能从最简单的层面进行概述:
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索引:
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索引:
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索引。
函数索引也是支持的:
2 ON T(UPPER(NAME));
CREATE INDEX IND_UPP_NAME
ON T(UPPER(NAME));
time used: 46.564(ms) clock tick:77264470.
甚至连全文索引都是支持的:
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操作返回的是布尔类型而不是数值。由于这部分包含的内容比较多,这里就不深入了,不过达梦显然是支持全文索引功能的,而且也是支持中文切词的。
达梦数据库支持视图对象:
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.
而且视图也是可以更新的。
下面看看同义词对象:
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中没有什么区别。
看看序列部分:
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绝大部分的对象在达梦数据库中都是支持的,而且大部分对象的用法和功能都没有发生变化,这使得迁移在对象层面上变得可行。