SQL - 左外连接,MINUS,INTERSECTION速度比较

时间:2014-09-05 06:54:43

标签: sql oracle join left-join database-performance

我正在尝试使用PL / SQL

实现SCD Type1

这是我的源表

SRC

ID      NAME    PIN
101     ABC     250001
503     KLM     260001
981     PQR     260001
207     AKN     560

这是我的目标表

TRGT

ID      NAME    PIN
101     ABC     25001
981     PQR     26789

如果我使用左外连接

select TRGT.ID AS TRID,
       SRC.ID AS SRID
  from SRC 
  left join TRGT on TRGT.ID = SRC.ID;

我会得到这个。

输出

TRID    SRID
101     101     
NULL    503
981     981
NULL    207

仅仅是FYI

并不重要

在SCD类型1

  • 我需要插入所有具有相应NULL TRID的SRID,因为它们是新记录并且不存在于TRID中。
  • 我需要更新TRID中存在相应记录的所有SRID,因为它们需要更新旧记录。

FYI结束

我写了一些逻辑并插入了503,207并更新了101,981。

来到减号和交叉口操作员。

要提取503,207(插入),我可以使用

SELECT ID FROM SRC 
MINUS
SELECT ID FROM TRGT

要提取101,981(更新),我可以使用

SELECT ID FROM SRC
INTERSECT
SELECT ID FROM TRGT.

现在问题

对于我来说,当我使用MINUSINTERSECT时,实现整个SCD type1很容易 左外连接。

但哪个会更快,更有效?

因为我要处理SRC中的大量记录和TRGT中的小#s - 初始级别。 但在后期阶段,它将是另一种方式。

感谢您的评论。对不起,我很努力地解释自己的心态。

1 个答案:

答案 0 :(得分:2)

您是否考虑过使用MERGE声明?我相信它实际上是为了在像你这样的情况下实现最佳性能。

类似的东西:

MERGE INTO trgt
USING src
ON (trgt.id = src.id)
WHEN MATCHED THEN
  UPDATE SET trgt.name = src.name, trgt.pin = src.pin
WHEN NOT MATCHED THEN
  INSERT (trgt.id, trgt.name, trgt.pin)
  VALUES (src.id, src.name, src. pin);