達夢6.0試用之資料庫物件

yangtingkun發表於2010-07-20

前幾天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絕大部分的物件在達夢資料庫中都是支援的,而且大部分物件的用法和功能都沒有發生變化,這使得遷移在物件層面上變得可行。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-668544/,如需轉載,請註明出處,否則將追究法律責任。

相關文章