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