首页公司产品市场技术方案
DBA大师实战国产数据库系列——达梦6.0之数据字典 2010-04-30

  作者简介:杨廷琨(网名Yangtingkun),现任海虹医药电子商务有限公司首席DBA, ITPUB论坛Oracle数据库管理版版主。2004年曾参与编写《Oracle数据库性能优化》一书,2007年被Oracle公司授予Oracle ACE称号,喜欢研究Oracle相关的技术问题,他的技术博客上积累了1500多篇Oracle相关的原创技术文章。


  前几天ITPUB的熊建国主编和我联系,希望我能参加国产数据库达梦的适用活动,并写几篇使用感受。本来最近手工的事情比较多,本打算推辞的,不过熊主编再三邀请,而且强调并非是枪手文,只要写出真实使用感受即可。既然如此,我就本着支持国产数据库的原则,写几篇试用感受。
  由于本人唯一熟悉的数据库就是Oracle,因此所有的对比都是与Oracle数据库进行对比,在这个过程中,将尽可能避免将对Oracle数据库的喜爱之情带进来,争取站在一个比较公正的位置上来进行评价。

  这一篇简单介绍一下达梦数据库的数据字典。

  数据字典是数据库存储对象结构,维护数据库正常运行的内部表、视图和同义词的总称。除了维护数据库对象的完整性外,数据字典还提供给用户方便的查询和维护接口,此外数据字典还提供动态的系统、实例和会话级的统计信息和状态信息。用户可以根据这些信息了解系统运行状态,分析、诊断系统问题,对系统进行优化。


  Oracle的数据字典可以分为两大类,一部分是以DBA/ALL/USER开头的视图,另一部分是以V_$开头的视图。前者是静态视图,里面包含数据库中所有数据对象的信息,是Oracle提供给用户的查询访问接口。而后者是动态视图,里面包含会话、实例以及系统级的动态统计信息或状态信息,用户可以根据这些视图的状态和统计信息,分析、诊断系统或会话,从而达到优化或问题诊断的目的。


  而达梦提供的数据字典信息就显得过于简单了。对于静态视图而言,没有USER和ALL类型的视图,这意味着普通用户很难获取当前的。


C:\dmdbms\bin>isql
isql V6.0.2.51-Build(2009.12.23)
SQL>login
server name:localhost
user name:test
password:
port:12345
dm_login time used:197.689(ms)
SQL>select * from systables;
select * from systables;
无效的表或视图名 'systables' .error code = -1010
SQL>select * from tables;
select * from tables;
无效的表或视图名 'tables' .error code = -1010
当前用户已经授权了SYSDBA角色,而查询数据字典仍然很难查询到当前用户下的对象信息:
SQL>login
server name:localhost
user name:sysdba
password:
port:12345
dm_login time used:44.871(ms)
SQL>select count(*) from systables;
select count(*) from systables;
 
1       101
1 rows got
time used: 0.430(ms) clock tick:707240.
SQL>set current database test;
set current database test
设置当前数据库为 'test'
time used: 0.305(ms) clock tick:495190.
SQL>select count(*) from systables;
select count(*) from systables;
 
1       77
1 rows got
time used: 0.399(ms) clock tick:649930.


  切换到SYSDBA用户,才能查询到数据字典的信息。


  而且由于存在多个数据库,不同数据库中查询的结果只是当前数据库中的信息,而不是总体信息,部分总的信息只保存在SYSTEM数据库中,比如LOGIN信息:


SQL>select name, defaultdb from syslogins;
select name, defaultdb from syslogins;
name            defaultdb
1       SYSDBA  0
2       test    4
2 rows got
time used: 1.400(ms) clock tick:2322140.


  难道只有SYSDBA用户才能获取对象的信息,而普通用户无法获得信息吗,其实也不是,在达梦数据库中,USER/ALL视图被合并在一起,且视图的前缀信息被去掉。比如TABLES中就是当前用户拥有或可以访问到的表。


只不过这些信息并不再当前用户中,而是存在于INFO_SCHEM或INFORMATION_SCHEMA模式中(其中INFO_SCHEM中仅包含最常用的几个视图):
SQL>login
server name:localhost
user name:test
password:
port:12345
dm_login time used:50.451(ms)
SQL>select table_schema, table_name, table_type
2   from test.information_schema.tables
3   where table_schema in ('test', 'INFORMATION_SCHEMA');
select table_schema, table_name, table_type
from test.information_schema.tables
where table_schema in ('test', 'INFORMATION_SCHEMA');
table_schema            table_name              table_type
1       INFORMATION_SCHEMA      INFORMATION_SCHEMA_CATALOG_NAME BASE TABLE

2       test    t       BASE TABLE
3       test    T1      BASE TABLE
4       test    T_BAK   BASE TABLE
5       test    t_bool  BASE TABLE
6       test    t_char  BASE TABLE
7       test    t_date  BASE TABLE
8       test    T_INC   BASE TABLE
9       test    T_LOB   BASE TABLE
10      test    T_LOBDMBLOB     BASE TABLE
11      test    t_num   BASE TABLE
12      test    T_PART  BASE TABLE
13      test    T_TAB   BASE TABLE
14      test    t_test  BASE TABLE
15      test    t_test3 BASE TABLE
16      test    t_text  BASE TABLE
17      test    t_textDMBLOB    BASE TABLE
18      test    t_type  BASE TABLE
19      INFORMATION_SCHEMA      CHECK_CONSTRAINTS       VIEW
20      INFORMATION_SCHEMA      COLUMN_EXPLICT_IN_PRIVILEGES    VIEW
21      INFORMATION_SCHEMA      COLUMN_EXPLICT_OUT_PRIVILEGES   VIEW
22      INFORMATION_SCHEMA      COLUMN_IMPLICT_IN_BYSELF        VIEW
23      INFORMATION_SCHEMA      COLUMN_IMPLICT_IN_PRIVILEGES    VIEW
24      INFORMATION_SCHEMA      COLUMN_IMPLICT_OUT_PRIVILEGES   VIEW
25      INFORMATION_SCHEMA      COLUMN_PRIVILEGES       VIEW
26      INFORMATION_SCHEMA      COLUMNS VIEW
27      INFORMATION_SCHEMA      COLUMNS_TAB     VIEW
28      INFORMATION_SCHEMA      COLUMNS_VIEW    VIEW
29      INFORMATION_SCHEMA      KEY_COLUMN_USAGE        VIEW
30      INFORMATION_SCHEMA      REFERENTIAL_CONSTRAINTS VIEW
31      INFORMATION_SCHEMA      SCHEMATA        VIEW
32      INFORMATION_SCHEMA      TABLE_CONSTRAINTS       VIEW
33      INFORMATION_SCHEMA      TABLE_PRIVILEGES        VIEW
34      INFORMATION_SCHEMA      TABLES  VIEW
35      INFORMATION_SCHEMA      TABLES_NET      VIEW
36      INFORMATION_SCHEMA      TABLES_WITH_ID  VIEW
37      INFORMATION_SCHEMA      USAGE_PRIVILEGES        VIEW
38      INFORMATION_SCHEMA      VIEW_TABLE_USAGE        VIEW
39      INFORMATION_SCHEMA      VIEW_TABLE_USAGE_NET    VIEW
40      INFORMATION_SCHEMA      VIEW_VIEW_USAGE_NET     VIEW
41      INFORMATION_SCHEMA      VIEWS   VIEW
42      INFORMATION_SCHEMA      VIEWS_NET       VIEW
43      test    V_TEST  VIEW
43 rows got
time used: 51.986(ms) clock tick:86851070.


  其中test模式下的表就是当前用户的表,而INFORMATION_SCHEMA模式下的视图,就是普通用户可以获取系统信息的视图。


  只不过在达梦数据库中,没有提供全局的同义词来进行访问,所以在查询数据字典信息的时候,一般用户必须要指定模式名称。


  显然达梦数据库中的静态视图要比Oracle中的USER开头的静态视图少一个数量级:


SQL> SELECT COUNT(*)                 
  2  FROM ALL_OBJECTS
  3  WHERE OBJECT_NAME LIKE 'USER_%'
  4  AND OBJECT_TYPE = 'SYNONYM';
  COUNT(*)
----------
       449


  下面看看动态视图,相比静态视图而言,达梦数据库中的动态视图就更是少的可怜了,在达梦的文档中只列出了V$VERSION、V$LOCK、V$SESSION、V$FILESTAT和V$BUFFER五个动态视图:


SQL>select * from system.sysdba.v$version;
select * from system.sysdba.v$version;
BANNER
1       DM Database Server V6.0.2.51-Build(2010.03.10)
2       DB Version: 0X1022b
2 rows got
time used: 0.413(ms) clock tick:678960.
SQL>select login_name, login_time, status
2   from system.sysdba.v$session;
select login_name, login_time, status
from system.sysdba.v$session;
login_name              login_time              status
1       SYSDBA  NULL    ACTIVE
2       SYSDBA  2010-04-12 18:49:20     ACTIVE
3       test    2010-04-12 18:54:24     ACTIVE
3 rows got
time used: 0.524(ms) clock tick:861090.


  而在Oracle中动态性能视图有几百个:


SQL> SELECT COUNT(*)
  2  FROM ALL_OBJECTS
  3  WHERE OBJECT_NAME LIKE 'V$%'
  4  AND OBJECT_TYPE = 'SYNONYM';
  COUNT(*)
----------
       604


  除了这些视图外,Oracle还提供了大量的系统包,来实现众多的功能:


SQL> SELECT COUNT(*)
  2  FROM DBA_OBJECTS
  3  WHERE OBJECT_NAME LIKE 'DBMS%'
  4  AND OBJECT_TYPE = 'PACKAGE';
  COUNT(*)
----------
       531


  在达梦数据库中,虽然在SYSDBA用户下也提供了一些过程和函数,但是这个数量也要比Oracle少一个数量级。


  显然对于达梦数据库而言,数据字典信息以及在数据库中提供的各种过程和函数,仍需要改进,对于使用Oracle习惯的用户在使用达梦数据库的时候会有不方便、不透明的感觉,这应该是达梦数据库进一步完善的方面。

技术文章问题解析培训服务技术支持

  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列—…
  • DBA大师实战国产数据库系列之…
  • DBA大师实战国产数据库系列之…
  • DBA大师实战国产数据库系列之…
  • DMETL快速入门(下) ——…
  • DMETL快速入门(上) ——…
  • 主备机同步和故障切换的应用
  • DM6水平分区简介
  • 浅析达梦动态缓冲区机制
  • DM6 Package功能兼容…
  • 基于虚拟机机制的编译型存储过程
  • 达梦函数与表达式索引
  • DM6.0基于成本的优化机制原…
  • 在DM6.0上扩展加密算法
  • DM集群功能概述
  • DM API和OCI编程方式比…
  • Python在数据库测试中的应…
  • Oracle 兼容之一 层次查…
  • 移动嵌入式数据库——市场与技术
  • 达梦备份恢复原理

关于达梦|联系我们|论坛|07版公司网站

©2010达梦数据库 鄂ICP备10011947