蓋國(guó)強(qiáng)老師談DM6.0中DML操作與性能體驗(yàn)
對(duì)于國(guó)產(chǎn)數(shù)據(jù)庫(kù),51CTO一直持支持態(tài)度,在關(guān)鍵領(lǐng)域需要有我們自己的數(shù)據(jù)庫(kù)產(chǎn)品。而本文作者蓋國(guó)強(qiáng)老師,51CTO數(shù)據(jù)庫(kù)頻道也撰寫過(guò)《51CTO專訪蓋國(guó)強(qiáng):NoSQL很火 但還需市場(chǎng)檢驗(yàn)》這樣的文章。
拿到達(dá)夢(mèng)國(guó)產(chǎn)數(shù)據(jù)庫(kù),我最感興趣的并不是一些高端功能,更關(guān)注的是達(dá)夢(mèng)在基本操作方面的性能,在數(shù)據(jù)庫(kù)技術(shù)大會(huì)上,我曾經(jīng)提到,其實(shí)對(duì)于Oracle數(shù)據(jù)庫(kù)來(lái)說(shuō),其核心的功能從Oracle 7之后就很少變化,之后的版本,更多的是錦上不斷添花的增強(qiáng),而我們的國(guó)產(chǎn)數(shù)據(jù)庫(kù),如果能夠扎扎實(shí)實(shí)做好基礎(chǔ)工作,則未來(lái)是非常值得期待的。
以下是我的一些基礎(chǔ)測(cè)試和對(duì)達(dá)夢(mèng)的感覺。
1. 登陸與密碼驗(yàn)證
安裝達(dá)夢(mèng)數(shù)據(jù)庫(kù)之后,第一個(gè)遇到的是登陸問題,達(dá)夢(mèng)數(shù)據(jù)庫(kù)初始創(chuàng)立了3個(gè)用戶,分別是 SYSDBA,SYSAUDITOR,SYSSSO,初始口令相同。這里我遇到的小小麻煩是,口令大小寫問題,注意:達(dá)夢(mèng)這三個(gè)缺省用戶的口令是大寫的,而且區(qū)分大小寫。
- C:\dmdbms\bin>isql
 - isql V6.0.2.51-Build(2009.12.23)
 - SQL>login
 - server name:localhost
 - user name:sysdba
 - password:
 - port:12345
 - dm_login time used:80.306(ms)
 
未經(jīng)授權(quán)的用戶
Login first.
這里的提示"未經(jīng)授權(quán)的用戶"讓我困惑了好久,如果提示"用戶名或口令錯(cuò)誤",可能更易于理解。多次嘗試之后,我把口令改為大寫,成功登入數(shù)據(jù)庫(kù):
- SQL>login
 - server name:localhost
 - user name:SYSDBA
 - password:
 - port:12345
 - dm_login time used:71.900(ms)
 
2. DML操作的基本測(cè)試
在達(dá)夢(mèng)中創(chuàng)建數(shù)據(jù)表以及進(jìn)行基本的過(guò)程編寫符合標(biāo)準(zhǔn),完全可以和Oracle通用。在ISQL中,缺省的會(huì)顯示每個(gè)操作步驟的時(shí)間,以毫秒顯示。
以下創(chuàng)建一個(gè)基本的測(cè)試表,做出一點(diǎn)簡(jiǎn)單的測(cè)試:
- SQL>CREATE TABLE EYGLE (
 - 2 ID NUMBER,
 - 3 NAME VARCHAR2(30),
 - 4 MAIL VARCHAR2(60),
 - 5 PHONE VARCHAR2(60),
 - 6 LDATE DATE);
 - CREATE TABLE EYGLE (
 - ID NUMBER,
 - NAME VARCHAR2(30),
 - MAIL VARCHAR2(60),
 - PHONE VARCHAR2(60),
 - LDATE DATE);
 - time used: 1.860(ms) clock tick:3364215.
 - SQL>SELECT * FROM EYGLE;
 - SELECT * FROM EYGLE;
 
ID NAME MAIL PHONE LDATE
0 rows got
time used: 0.850(ms) clock tick:1727965.
通過(guò)一個(gè)Loop循環(huán),插入10萬(wàn)條測(cè)試記錄,耗時(shí)大約1841 ms:
- SQL>begin
 - 2 for i in 1 .. 100000 loop
 - 3 insert into eygle values(i,'eygle','eygle@eygle.com','13911812803',sysdate);
 - 4 end loop;
 - 5 end;
 - 6 /
 - begin
 - for i in 1 .. 100000 loop
 - insert into eygle values(i,'eygle','eygle@eygle.com','13911812803',sysdate);
 - end loop;
 - end;
 - 1 rows affected
 - time used: 1841.828(ms) clock tick:3771986460.
 - SQL>select * from eygle where rownum <2;
 - select * from eygle where rownum <2;
 
ID NAME MAIL PHONE LDATE
1 1 eygle eygle@eygle.com 13911812803 2010-04-19
1 rows got
time used: 1.577(ms) clock tick:3217072.
回退這個(gè)批量的INSERT操作,需要大約325ms:
- SQL>rollback;
 - rollback;
 - time used: 325.134(ms) clock tick:665851724.
 
對(duì)比一下在Oracle中的同樣操作(Oracle選擇初始安裝,未調(diào)整,10.2.0.4版本):
- C:\Users\eygle>sqlplus "/ as sysdba"
 - SQL*Plus: Release 10.2.0.4.0 - Production on 星期一 4月 19 11:56:32 2010
 - Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
 
連接到:
- Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
 - With the Partitioning, OLAP, Data Mining and Real Application Testing options
 - SQL> select name from v$database;
 - NAME
 - ---------
 - EYGLE
 - SQL> create user eygle identified by eygle;
 
用戶已創(chuàng)建。
- SQL> grant connect,resource,dba to eygle;
 
授權(quán)成功。
- SQL> connect eygle/eygle
 
已連接。
- SQL> set timing on
 - SQL> CREATE TABLE EYGLE (
 - 2 ID NUMBER,
 - 3 NAME VARCHAR2(30),
 - 4 MAIL VARCHAR2(60),
 - 5 PHONE VARCHAR2(60),
 - 6 LDATE DATE);
 
表已創(chuàng)建。
在Oracle中,這個(gè)LOOP循環(huán)共耗時(shí)4130ms,回退這個(gè)事務(wù)則用了670ms,不考察內(nèi)部原理及其他相關(guān)技術(shù)實(shí)現(xiàn),達(dá)夢(mèng)在這個(gè)基本操作上,是有不錯(cuò)的體現(xiàn)的:
- SQL> begin
 - 2 for i in 1 .. 100000 loop
 - 3 insert into eygle values(i,'eygle','eygle@eygle.com','13911812803',sysdate);
 - 4 end loop;
 - 5 end;
 - 6 /
 
PL/SQL 過(guò)程已成功完成。
已用時(shí)間: 00: 00: 04.13
SQL> rollback;
回退已完成。
已用時(shí)間: 00: 00: 00.67
進(jìn)一步的,在達(dá)夢(mèng)數(shù)據(jù)庫(kù)中再次創(chuàng)建這些數(shù)據(jù)并提交,同時(shí)進(jìn)行進(jìn)一步數(shù)據(jù)追加,追加數(shù)據(jù)用時(shí)879ms:
- SQL>begin
 - 2 for i in 1 .. 100000 loop
 - 3 insert into eygle values(i,'eygle','eygle@eygle.com','13911812803',sysdate);
 - 4 end loop;
 - 5 end;
 - 6 /
 - begin
 - for i in 1 .. 100000 loop
 - insert into eygle values(i,'eygle','eygle@eygle.com','13911812803',sysdate);
 - end loop;
 - end;
 - 1 rows affected
 - time used: 1764.746(ms) clock tick:3614125982.
 - SQL>commit;
 - commit;
 - time used: 2.361(ms) clock tick:3931726.
 - SQL>insert into eygle select * from eygle;
 - insert into eygle select * from eygle;
 - 100000 rows affected
 - time used: 879.129(ms) clock tick:1800413670.
 - SQL>commit;
 - commit;
 - time used: 1.975(ms) clock tick:3076490.
 
而在Oracle中,這個(gè)時(shí)間消耗是1960ms:
- SQL> begin
 - 2 for i in 1 .. 100000 loop
 - 3 insert into eygle values(i,'eygle','eygle@eygle.com','13911812803',sysdate);
 - 4 end loop;
 - 5 end;
 - 6 /
 
PL/SQL 過(guò)程已成功完成。
已用時(shí)間: 00: 00: 03.26
SQL> commit;
提交完成。
已用時(shí)間: 00: 00: 00.00
- SQL> insert into eygle select * from eygle;
 
已創(chuàng)建100000行。
已用時(shí)間: 00: 00: 01.96
SQL> commit;
提交完成。
已用時(shí)間: 00: 00: 00.00
最后測(cè)試一下刪除與更新操作,批量刪除20w數(shù)據(jù)用時(shí)530ms,更新單字段,用時(shí)4297ms:
- SQL>delete from eygle;
 - delete from eygle;
 - 200000 rows affected
 - time used: 530.098(ms) clock tick:1025037644.
 - SQL>rollback;
 - rollback;
 - time used: 591.067(ms) clock tick:1210472582.
 - SQL>UPDATE EYGLE SET NAME='EYGLE@2010';
 - UPDATE EYGLE SET NAME='EYGLE@2010';
 - 200000 rows affected
 - time used: 4297.675(ms) clock tick:3718914483.
 - SQL>rollback;
 - rollback;
 - time used: 3810.759(ms) clock tick:744454156.
 
對(duì)于Oracle來(lái)說(shuō),這兩個(gè)數(shù)字分別是6080 ms 和 5890 ms:
- SQL> delete from eygle;
 
已刪除200000行。
已用時(shí)間: 00: 00: 06.08
- SQL> rollback;
 
回退已完成。
已用時(shí)間: 00: 00: 02.66
- SQL>
 - SQL> UPDATE EYGLE SET NAME='EYGLE@2010';
 
已更新200000行。
已用時(shí)間: 00: 00: 05.89
- SQL> ROLLBACK;
 
回退已完成。
已用時(shí)間: 00: 00: 05.68
通過(guò)簡(jiǎn)單的單用戶DML操作測(cè)試,達(dá)夢(mèng)數(shù)據(jù)庫(kù)的性能是非常良好的。Oracle數(shù)據(jù)庫(kù)的UNDO與REDO機(jī)制是其特有的關(guān)鍵特性,這些特性衍生出強(qiáng)大的關(guān)聯(lián)數(shù)據(jù)庫(kù)功能;而我們目前對(duì)達(dá)夢(mèng)的兩方面的實(shí)現(xiàn)還知之甚少,希望在后續(xù)的測(cè)試和研究中,能夠?qū)@兩方面的技術(shù)加深理解,進(jìn)一步領(lǐng)會(huì)和對(duì)比這兩大數(shù)據(jù)庫(kù)平臺(tái)。
蓋國(guó)強(qiáng)先生簡(jiǎn)介
蓋國(guó)強(qiáng),+10 年Oracle數(shù)據(jù)庫(kù)使用經(jīng)驗(yàn),+ 8 年Oracle DBA管理與實(shí)踐經(jīng)驗(yàn)。
曾任職于某國(guó)家大型企業(yè),服務(wù)于煙草行業(yè),開發(fā)過(guò)基于Oracle數(shù)據(jù)庫(kù)的大型ERP系統(tǒng);后任職于北京某電信增值服務(wù)商企業(yè),提供電信級(jí)數(shù)據(jù)庫(kù)的規(guī)劃與運(yùn)維支持。目前從事獨(dú)立的數(shù)據(jù)庫(kù)服務(wù)、數(shù)據(jù)庫(kù)咨詢,專注于為中國(guó)企業(yè)提供中立、專業(yè)的數(shù)據(jù)庫(kù)服務(wù)。
實(shí)踐經(jīng)驗(yàn)豐富,長(zhǎng)于數(shù)據(jù)庫(kù)診斷、性能調(diào)整與SQL優(yōu)化等。對(duì)于Oracle內(nèi)部技術(shù)等具有深入研究。高級(jí)培訓(xùn)講師,培訓(xùn)經(jīng)驗(yàn)豐富。以上資料來(lái)自北京恩墨科技有限公司(www.eygle.com)。
【編輯推薦】















 
 
 





 
 
 
 