蓋國強老師談DM6.0中DML操作與性能體驗
對于國產數(shù)據(jù)庫,51CTO一直持支持態(tài)度,在關鍵領域需要有我們自己的數(shù)據(jù)庫產品。而本文作者蓋國強老師,51CTO數(shù)據(jù)庫頻道也撰寫過《51CTO專訪蓋國強:NoSQL很火 但還需市場檢驗》這樣的文章。
拿到達夢國產數(shù)據(jù)庫,我最感興趣的并不是一些高端功能,更關注的是達夢在基本操作方面的性能,在數(shù)據(jù)庫技術大會上,我曾經提到,其實對于Oracle數(shù)據(jù)庫來說,其核心的功能從Oracle 7之后就很少變化,之后的版本,更多的是錦上不斷添花的增強,而我們的國產數(shù)據(jù)庫,如果能夠扎扎實實做好基礎工作,則未來是非常值得期待的。
以下是我的一些基礎測試和對達夢的感覺。
1. 登陸與密碼驗證
安裝達夢數(shù)據(jù)庫之后,第一個遇到的是登陸問題,達夢數(shù)據(jù)庫初始創(chuàng)立了3個用戶,分別是 SYSDBA,SYSAUDITOR,SYSSSO,初始口令相同。這里我遇到的小小麻煩是,口令大小寫問題,注意:達夢這三個缺省用戶的口令是大寫的,而且區(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)
未經授權的用戶
Login first.
這里的提示"未經授權的用戶"讓我困惑了好久,如果提示"用戶名或口令錯誤",可能更易于理解。多次嘗試之后,我把口令改為大寫,成功登入數(shù)據(jù)庫:
- SQL>login
- server name:localhost
- user name:SYSDBA
- password:
- port:12345
- dm_login time used:71.900(ms)
2. DML操作的基本測試
在達夢中創(chuàng)建數(shù)據(jù)表以及進行基本的過程編寫符合標準,完全可以和Oracle通用。在ISQL中,缺省的會顯示每個操作步驟的時間,以毫秒顯示。
以下創(chuàng)建一個基本的測試表,做出一點簡單的測試:
- 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.
通過一個Loop循環(huán),插入10萬條測試記錄,耗時大約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.
回退這個批量的INSERT操作,需要大約325ms:
- SQL>rollback;
- rollback;
- time used: 325.134(ms) clock tick:665851724.
對比一下在Oracle中的同樣操作(Oracle選擇初始安裝,未調整,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;
授權成功。
- 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中,這個LOOP循環(huán)共耗時4130ms,回退這個事務則用了670ms,不考察內部原理及其他相關技術實現(xiàn),達夢在這個基本操作上,是有不錯的體現(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 過程已成功完成。
已用時間: 00: 00: 04.13
SQL> rollback;
回退已完成。
已用時間: 00: 00: 00.67
進一步的,在達夢數(shù)據(jù)庫中再次創(chuàng)建這些數(shù)據(jù)并提交,同時進行進一步數(shù)據(jù)追加,追加數(shù)據(jù)用時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中,這個時間消耗是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 過程已成功完成。
已用時間: 00: 00: 03.26
SQL> commit;
提交完成。
已用時間: 00: 00: 00.00
- SQL> insert into eygle select * from eygle;
已創(chuàng)建100000行。
已用時間: 00: 00: 01.96
SQL> commit;
提交完成。
已用時間: 00: 00: 00.00
最后測試一下刪除與更新操作,批量刪除20w數(shù)據(jù)用時530ms,更新單字段,用時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.
對于Oracle來說,這兩個數(shù)字分別是6080 ms 和 5890 ms:
- SQL> delete from eygle;
已刪除200000行。
已用時間: 00: 00: 06.08
- SQL> rollback;
回退已完成。
已用時間: 00: 00: 02.66
- SQL>
- SQL> UPDATE EYGLE SET NAME='EYGLE@2010';
已更新200000行。
已用時間: 00: 00: 05.89
- SQL> ROLLBACK;
回退已完成。
已用時間: 00: 00: 05.68
通過簡單的單用戶DML操作測試,達夢數(shù)據(jù)庫的性能是非常良好的。Oracle數(shù)據(jù)庫的UNDO與REDO機制是其特有的關鍵特性,這些特性衍生出強大的關聯(lián)數(shù)據(jù)庫功能;而我們目前對達夢的兩方面的實現(xiàn)還知之甚少,希望在后續(xù)的測試和研究中,能夠對這兩方面的技術加深理解,進一步領會和對比這兩大數(shù)據(jù)庫平臺。
蓋國強先生簡介
蓋國強,+10 年Oracle數(shù)據(jù)庫使用經驗,+ 8 年Oracle DBA管理與實踐經驗。
曾任職于某國家大型企業(yè),服務于煙草行業(yè),開發(fā)過基于Oracle數(shù)據(jù)庫的大型ERP系統(tǒng);后任職于北京某電信增值服務商企業(yè),提供電信級數(shù)據(jù)庫的規(guī)劃與運維支持。目前從事獨立的數(shù)據(jù)庫服務、數(shù)據(jù)庫咨詢,專注于為中國企業(yè)提供中立、專業(yè)的數(shù)據(jù)庫服務。
實踐經驗豐富,長于數(shù)據(jù)庫診斷、性能調整與SQL優(yōu)化等。對于Oracle內部技術等具有深入研究。高級培訓講師,培訓經驗豐富。以上資料來自北京恩墨科技有限公司(www.eygle.com)。
【編輯推薦】