有幸参加公司安排的达梦数据库DCA课程培训,培训三天,收获良多,感谢达梦大学和我的授课老师,耐心的帮助和仔细的讲解,效果非常好。我以前是有ORACLE基础的,学习达梦数据库感觉它的使用与ORACLE很像,上手也容易;相对DM7而言DM8也有了新特性,于是顺便帮助国产数据库达梦宣传一下,也简单介绍一下在使用过程中与ORACLE不同的细微之处,尤其是SQL或存储过程运算结果可能会有差异。
一、DM8 十大新特性:
- 共享存储集群 DSC 增强
最多可以支持 8 个节点的共享存储集群,支持共享存储集群 + 数据守护,进一步提高系统可用性,提供可替代 Oracle 的两地三中心解决方案。
- 提供分布式文件系统 DDFS
DDFS ( DM Distributed File System ) 是可供 DM 数据库服务器使用的底层分布式文件系统,DDFS 支持多副本数据冗余容灾,采用中心化副本控制协议 ( primary-secondary 协议 ) 和 Quorum 机制对副本进行管理,可快速进行主副本间的切换,能够有效地处理系统中的各种故障和异常情况。
- 支持分布式弹性计算集群
当单个达梦数据库系统在 SQL 执行过程中发现当前操作需要大量的内存和 CPU 资源,且当前局域网上有可利用的空闲 DM 数据库计算资源时,就可以把当前的 SQL 操作拆分成多个任务和相应的数据分发到这些可以利用的达梦数据库,并回收计算结果加以整合,从而实现复杂 SQL 的弹性计算。
- 查询优化器增强
支持多维统计信息,当查询中涉及的多个列互相并不独立时,允许用户指定针对多个列收集和计算统计信息,可提升多列过滤、多列连接场景下的代价计算精准度,生成更优的执行计划 ; 相关子查询、外连接等查询优化参数根据应用场景自动调整,减少人工干预 ; 复杂表达式的优化 ; 语句块中的 SQL 独立 HINT 支持等。
- AWR 报表工具增强
DM8 对 AWR 报表工具的内部构造策略进行了改造,大幅提升了 AWR 报表的生成效率。同时相对于 DM7 的 AWR 报表工具增加了多个统计表单,实现了对系统运行情况更加细致的展现。
- 安全功能增强
进一步增强强制访问控制、存储加密、资源限制、实时审计等安全功能。
- JDBC 接口增强
对 JDBC 接口进行了重新设计实现,资源开销更小,性能更高。
- 高级功能扩展
扩展了对多级分区表的功能支持,新增对分区交换、分区重命名、修改 LIST 分区范围值、增加约束功能的支持 ; 物化视图支持 ON COMMIT 快速刷新方式,支持嵌套物化视图,提升了复杂物化视图的刷新性能 ; 支持递归 CTE 表达式。
- 管理工具改进
管理工具提供了全新的 SQL 助手提供 SQL 语法检查和 SQL 输入助手功能 ;SQL 语法检查功能对用户输入的 SQL 语句进行实时的语法检查,定位错误的 SQL 语法。SQL 输入助手能够对用户输入 SQL 进行实时的智能提示。
- 达梦数据库管理服务平台
提供了全新的基于 Web 开发的数据库管理服务平台 ( DEM ) , DEM 不仅包含了桌面工具系统管理工具 ( Manager ) ,数据迁移工具 ( DTS ) ,性能监视工具 ( Monitor ) 的功能,还提供了集群部署 ( Deploy ) 功能、监控功能和告警功能。用户通过集群部署功能可快速和简单地在多台主机上部署 MPP 集群、DMDSC 集群和数据守护集群。
二、与ORACLE不同的细微之处
笔者由于好奇ORACLE和DM8有什么不同之处,就调研了下,发现以下运算结果会存在差异,大家要注意。
1.日期计算问题
达梦DM8默认两个整数相除,结果类型还是整数,而oracle是小数。
所以在oracle我们可以使用trunc(v_date)-1/86400获取1秒前的时间,但在达梦DM8,这样写跟trunc(v_date) - 0是一样的。
解决方法:是成trunc(v_date)-1.0/86400
2.出参问题
如果把一个变量传给一个函数做为函数出参,然后获取函数返回值,oracle默认会把这个函数清空,而达梦DM8不会。
这就导致一个问题,
验证代码如下:
/测试出参 在oracle期待输出为空 但是达梦会出现error
create or replace procedure testKinstarerOutParam(str OUT varchar2) as
begin
dbms_output.put_line('str = ' || str);
if (str is not null) THEN
RAISE_APPLICATION_ERROR(-20001, '出参没有清空');
end if;end;
/
create or replace procedure testKinstarerCallOutParam as
strIn varchar2(64) := 'error';
begin testKinstarerOutParam(strIn);end;
/
执行函数后发现出参并没有清空.
3.短路问题
短路功能是指在计算与或逻辑时,如果前半段逻辑已经能确定真假时,后半段逻辑不会执行。
plsql里面也实现了短路功能,我们一般会利用这个特性减少一些代码,例如先判断变量是否为空,如果不为空再使用变量做运算:
if (var is not null and va.exists(‘error’) ) then dbms_output.put_line(‘yes’); fi;
但在达梦DM8的存储过程,短路却没有实现。上面的代码不管var是否为空,都会进行va.exists(‘error’)这个逻辑。如果不幸var的变量是空的,就会导致运行异常。
测试代码:
dbms_output.enable;
declare
v_flag boolean;
begin
– 请问这个存储过程执行异常,报"非法的参数数据" 是不是达梦DM8的bug ,oracle下是可以正常运行的
– 还是有什么设置可以让存储过程正常执行
if (to_number(‘1’) != 1) and to_number(‘abc’) = 1 then
dbms_output.put_line('yes');
end if;
dbms_output.put_line(‘ok’);
end;
/