首页公司产品市场技术方案
DBA大师实战国产数据库系列——达梦6.0之数据库对象 2010-04-29

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


  前几天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索引的时间要明显长于普通索引,而且这里的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绝大部分的对象在达梦数据库中都是支持的,而且大部分对象的用法和功能都没有发生变化,这使得迁移在对象层面上变得可行。

技术文章问题解析培训服务技术支持

  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列之…
  • DBA大师实战国产数据库系列之…
  • DBA大师实战国产数据库系列之…
  • DMETL快速入门(下) ——…
  • DMETL快速入门(上) ——…
  • 主备机同步和故障切换的应用
  • DM6水平分区简介
  • 浅析达梦动态缓冲区机制
  • DM6 Package功能兼容…
  • 基于虚拟机机制的编译型存储过程
  • 达梦函数与表达式索引
  • DM6.0基于成本的优化机制原…
  • 在DM6.0上扩展加密算法
  • DM集群功能概述
  • DM API和OCI编程方式比…
  • Python在数据库测试中的应…
  • Oracle 兼容之一 层次查…
  • 移动嵌入式数据库——市场与技术
  • 达梦备份恢复原理

关于达梦|联系我们|论坛|07版公司网站

©2010达梦数据库 鄂ICP备10011947