【IT168 独家】
摘要:本文档通过对达梦数据库DML的基本测试,与Oracle数据库进行对比,得出达梦数据库常规操作的印象。
拿到达梦国产数据库,我最感兴趣的并不是一些高端功能,更关注的是达梦在基本操作方面的性能,在数据库技术大会上,我曾经提到,其实对于Oracle数据库来说,其核心的功能从Oracle 7之后就很少变化,之后的版本,更多的是锦上不断添花的增强,而我们的国产数据库,如果能够扎扎实实做好基础工作,则未来是非常值得期待的。
以下是我的一些基础测试和对达梦的感觉。
1. 登陆与密码验证
安装达梦数据库之后,第一个遇到的是登陆问题,达梦数据库初始创立了3个用户,分别是 SYSDBA,SYSAUDITOR,SYSSSO,初始口令相同。这里我遇到的小小麻烦是,口令大小写问题,注意:达梦这三个缺省用户的口令是大写的,而且区分大小写。
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.
这里的提示"未经授权的用户"让我困惑了好久,如果提示"用户名或口令错误",可能更易于理解。多次尝试之后,我把口令改为大写,成功登入数据库:
server name:localhost
user name:SYSDBA
password:
port:12345
dm_login time used:71.900(ms)
2. DML操作的基本测试
在达梦中创建数据表以及进行基本的过程编写符合标准,完全可以和Oracle通用。在ISQL中,缺省的会显示每个操作步骤的时间,以毫秒显示。
以下创建一个基本的测试表,做出一点简单的测试:
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循环,插入10万条测试记录,耗时大约1841 ms:
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:
rollback;
time used: 325.134(ms) clock tick:665851724.
对比一下在Oracle中的同样操作(Oracle选择初始安装,未调整,10.2.0.4版本):
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;
用户已创建。
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);
表已创建。
在Oracle中,这个LOOP循环共耗时4130ms,回退这个事务则用了670ms,不考察内部原理及其他相关技术实现,达梦在这个基本操作上,是有不错的体现的:
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
进一步的,在达梦数据库中再次创建这些数据并提交,同时进行进一步数据追加,追加数据用时879ms:
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:
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;
已创建100000行。
已用时间: 00: 00: 01.96
SQL> commit;
提交完成。
已用时间: 00: 00: 00.00
最后测试一下删除与更新操作,批量删除20w数据用时530ms,更新单字段,用时4297ms:
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来说,这两个数字分别是6080 ms 和 5890 ms:
已删除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操作测试,达梦数据库的性能是非常良好的。Oracle数据库的UNDO与REDO机制是其特有的关键特性,这些特性衍生出强大的关联数据库功能;而我们目前对达梦的两方面的实现还知之甚少,希望在后续的测试和研究中,能够对这两方面的技术加深理解,进一步领会和对比这两大数据库平台。
作者简介:盖国强,网名eygle。北京恩墨科技有限公司创始人。Oracle ACE Director(Oracle ACE总监),中国十大杰出数据库工程师之一(2006),ITPUB论坛Oracle管理版版主,ITPUB论坛超级版主,曾任ITPUB 微软技术版版主。《程序员》杂志特邀专家顾问。