【发布时间】:2016-01-13 21:38:18
【问题描述】:
我有两个 Oracle 表,我正在它们之间进行 UNION 以找出存储在这两个表中的数据的差异,但是当我在 SQL Developer 中运行查询时,查询太慢了,我使用的是相同的Informatica 中的查询,其吞吐量也较小。
表 1:W_SALES_INVOICE_LINE_FS EBS(NET_AMT, INVOICED_QTY, CREATED_ON_DT, CHANGED_ON_DT, INTEGRATION_ID, 'EBS' 作为 SOURCE_NAME)
表 2:W_SALES_INVOICE_LINE_F DWH (NET_AMT, INVOICED_QTY, CREATED_ON_DT, CHANGED_ON_DT, INTEGRATION_ID, 'EBS' 作为 SOURCE_NAME)
我附上带有问题的查询:
SELECT EBS.NET_AMT,
nvl(EBS.INVOICED_QTY,
case nvl(EBS.NET_AMT,0) when 0 then EBS.INVOICED_QTY
else -1 end) INVOICED_QTY,
EBS.CREATED_ON_DT,
EBS.CHANGED_ON_DT,
EBS.INTEGRATION_ID,
'EBS' AS SOURCE_NAME
FROM
W_SALES_INVOICE_LINE_FS EBS
WHERE NOT EXISTS (SELECT INTEGRATION_ID FROM W_SALES_INVOICE_LINE_F DWH
WHERE EBS.INTEGRATION_ID = DWH.INTEGRATION_ID)
UNION
SELECT DWH.NET_AMT,
DWH.INVOICED_QTY,
DWH.CREATED_ON_DT,
DWH.CHANGED_ON_DT,
DWH.INTEGRATION_ID,
'DWH' AS SOURCE_NAME
FROM
W_SALES_INVOICE_LINE_F DWH
where DWH.IS_POS = 'N' and
not exists (SELECT INTEGRATION_ID FROM W_SALES_INVOICE_LINE_FS EBS
WHERE EBS.INTEGRATION_ID = DWH.INTEGRATION_ID);
【问题讨论】:
-
Union和Not Exists可能会成为性能杀手。您确定这里需要Union而不能使用Union All代替吗? -
考虑使用
UNION ALL而不是UNION以避免不必要的排序 -> 查询的两个部分的结果总是不同的,因为最后一列SOURCE_NAME是“EBS”或“DWH” ,但数据库不知道这一点,必须对两个结果进行排序才能执行联合。
标签: sql oracle informatica