对于国产数据库,51CTO一直持支持态度,在关键领域需要有我们自己的数据库产品。而本文作者盖国强老师,51CTO数据库频道也撰写过《51CTO专访盖国强:NoSQL很火 但还需市场检验》这样的文章。
拿到达梦国产数据库,我最感兴趣的并不是一些高端功能,更关注的是达梦在基本操作方面的性能,在数据库技术大会上,我曾经提到,其实对于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机制是其特有的关键特性,这些特性衍生出强大的关联数据库功能;而我们目前对达梦的两方面的实现还知之甚少,希望在后续的测试和研究中,能够对这两方面的技术加深理解,进一步领会和对比这两大数据库平台。
盖国强先生简介
盖国强,+10 年Oracle数据库使用经验,+ 8 年Oracle DBA管理与实践经验。
曾任职于某国家大型企业,服务于烟草行业,开发过基于Oracle数据库的大型ERP系统;后任职于北京某电信增值服务商企业,提供电信级数据库的规划与运维支持。目前从事独立的数据库服务、数据库咨询,专注于为中国企业提供中立、专业的数据库服务。
实践经验丰富,长于数据库诊断、性能调整与SQL优化等。对于Oracle内部技术等具有深入研究。高级培训讲师,培训经验丰富。以上资料来自北京恩墨科技有限公司(www.eygle.com)。
【编辑推荐】