DB2 与 Oracle 中的查询

Posted

技术标签:

【中文标题】DB2 与 Oracle 中的查询【英文标题】:Query in DB2 vs Oracle 【发布时间】:2018-03-27 11:36:56 【问题描述】:

有一个查询有多个内连接。它涉及两个视图,其中一个视图基于四个表,总共有四个表(包括两个视图)。

在源表中具有相同数据量的相同查询在 Oracle 和 DB2 中运行。在 DB2 中,令人惊讶的是,加载 300 万条记录需要 2 分钟。在 Oracle 中,这需要两个小时。两个环境中的所有源表都有相同的索引。两种环境(Oracle 与 DB2)中视图的行为(在连接中使用时)是否不同?

我正在分享一个虚拟查询:-

 INSERT INTO TABLE_A
 SELECT
        adf.column1,
        adf.column2,
        dd.column3,
        SUM(otl.column4) column4,
        SUM(otl.column5) column5,
        (Case when SUM(otl.column5) = 0 then 0
        else round(CAST(SUM(otl.column4) AS DECIMAL(19,2)) /abs(CAST(SUM(otl.column4) AS DECIMAL(18,2))),4)
        end) taxl_unrlz_cgl_pct
 FROM
        view_a adf
        INNER JOIN table_b hr on hr.hh_ref_id = adf.hh_ref_id
              AND  hr.col_typ_cd = 'FIRM'
              AND  hr.col_end_dt =  TO_DATE('1/1/2900','MM/DD/YYYY')
        INNER JOIN dw.table_c ar on ar.colb_id = adf.colb_id
              AND  ar.col_cd = '@'
              AND  ar.col_num BETWEEN 10000000 AND 89999999
              AND  ar.col_dt IS NULL
        INNER JOIN table_d dd on dd.col_id = adf.col_id
        INNER JOIN view2 otl ON otl.cola_id = ar.cola_id
 GROUP BY adf.column1, adf.column2, dd.column3;

【问题讨论】:

我该如何优化这个......由于机密限制,我无法共享查询...... 如果不能共享查询,至少可以比较两个 RDBMS 的访问计划。看起来 Oracle 计划有问题,很可能通过检查访问计划很容易纠正。如果硬件资源相似并且表布局相似(您没有提到这两者),那么除了配置错误之外,没有理由说明 Oracle 的性能会比 Db2 差。 @PrithuBarnwal 您可以更改表名和列名以使其成为非机密文件。 我给出的一个虚拟查询......你可以得到一个想法 @mao 硬件资源相同...唯一不同的是在 DB2 中,其中一个视图使用了直接表而不是视图(但这不会影响任何性能) 【参考方案1】:

从技术上讲,DB2 和 Oracle 都将尝试使用您编写的基本查询以最有效的方式重写查询。但是,我在使用多表视图时看到的常见(但不常见)问题之一是 DBMS 无法使用基础表重写查询。因此,根据视图本身的复杂性以及有时附加的连接,DBMS 可能无法重写查询以正确使用基础表,从而导致无法使用视图中使用的基础表上的索引。发生这种情况时,视图本身就像物化表(工作表),查询会在物化表上进行表扫描。

对于何时会发生此类问题没有一致的模式。因此,您需要根据具体情况进行检查。

由于您提到大约 2 小时和 2 分钟,因此很可能是这种情况。因此,您需要检查 Oracle 和 DB2 上的访问路径。但是您还需要确保更新了统计信息,并且访问路径基于 DBMS 上的最新统计信息。否则它不会是苹果对苹果的比较。

【讨论】:

以上是关于DB2 与 Oracle 中的查询的主要内容,如果未能解决你的问题,请参考以下文章

DB2在查询语法上和Oracle、Mysql差异

在线等!!如何通过主表及其主键查询到与之关联的表及关联字段?数据库为db2

db2数据库怎么查询数据中含有特殊字符的

DB2 中的合并查询

如何编写通用 SQL 查询以与所有 RDBMS(Oracle、SQL 服务器、MySql、DB2 等等)兼容的 (YYYY-MM-DD) 形式提取日期

将 DB2 查询转换为 oracle 查询