技术开发 频道

盖国强:DM6.0初体验之DML操作与性能

  【IT168 独家

  摘要:本文档通过对达梦数据库DML的基本测试,与Oracle数据库进行对比,得出达梦数据库常规操作的印象。

  拿到达梦国产数据库,我最感兴趣的并不是一些高端功能,更关注的是达梦在基本操作方面的性能,在数据库技术大会上,我曾经提到,其实对于Oracle数据库来说,其核心的功能从Oracle 7之后就很少变化,之后的版本,更多的是锦上不断添花的增强,而我们的国产数据库,如果能够扎扎实实做好基础工作,则未来是非常值得期待的。

  以下是我的一些基础测试和对达梦的感觉。

  1. 登陆与密码验证

  安装达梦数据库之后,第一个遇到的是登陆问题,达梦数据库初始创立了3个用户,分别是 SYSDBA,SYSAUDITOR,SYSSSO,初始口令相同。这里我遇到的小小麻烦是,口令大小写问题,注意:达梦这三个缺省用户的口令是大写的,而且区分大小写。

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.

  这里的提示"未经授权的用户"让我困惑了好久,如果提示"用户名或口令错误",可能更易于理解。多次尝试之后,我把口令改为大写,成功登入数据库:

SQL>login
server name:localhost
user name:SYSDBA
password:
port:
12345
dm_login time used:
71.900(ms)

  2. DML操作的基本测试

  在达梦中创建数据表以及进行基本的过程编写符合标准,完全可以和Oracle通用。在ISQL中,缺省的会显示每个操作步骤的时间,以毫秒显示。

  以下创建一个基本的测试表,做出一点简单的测试:

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循环,插入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;

用户已创建。

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,不考察内部原理及其他相关技术实现,达梦在这个基本操作上,是有不错的体现的:

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

  进一步的,在达梦数据库中再次创建这些数据并提交,同时进行进一步数据追加,追加数据用时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;

已创建100000行。

已用时间:  
00: 00: 01.96
SQL
> commit;

提交完成。

已用时间:  
00: 00: 00.00

  最后测试一下删除与更新操作,批量删除20w数据用时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来说,这两个数字分别是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操作测试,达梦数据库的性能是非常良好的。Oracle数据库的UNDO与REDO机制是其特有的关键特性,这些特性衍生出强大的关联数据库功能;而我们目前对达梦的两方面的实现还知之甚少,希望在后续的测试和研究中,能够对这两方面的技术加深理解,进一步领会和对比这两大数据库平台。

  作者简介:盖国强,网名eygle。北京恩墨科技有限公司创始人。Oracle ACE Director(Oracle ACE总监),中国十大杰出数据库工程师之一(2006),ITPUB论坛Oracle管理版版主,ITPUB论坛超级版主,曾任ITPUB 微软技术版版主。《程序员》杂志特邀专家顾问。

0
相关文章