表现:子查询或加入

dom*_*enk 5 sql oracle

我对子查询的性能/加入另一个表有一个小问题

INSERT
INTO Original.Person
  (
    PID, Name, Surname, SID
  )
  (
    SELECT ma.PID_new , TBL.Name , ma.Surname, TBL.SID 
    FROM Copy.Person TBL , original.MATabelle MA
    WHERE TBL.PID         = p_PID_old
      AND TBL.PID         = MA.PID_old
  );
Run Code Online (Sandbox Code Playgroud)

这是我的SQL,现在这个东西运行大约100万次或更多.我的问题是什么会更快?

  • 如果我TBL.SID改为(Select new from helptable where old = tbl.sid)

要么

  • 如果我将'HelpTable'添加到from并且加入where

edit1
嗯,这个脚本的运行次数和r个人一样多.

我的程序有2个模块,一个填充MaTabelle,一个传输数据.该程序确实将2个数据库合并在一起,因此有时会使用相同的密钥.
现在我正在研究一种没有重复密钥存在的解决方案.

我的解决方案是制作一个'HelpTable'.key(SID)的所有者生成一个新密钥并将其写入"HelpTable".使用此密钥的所有其他表都可以从"HelpTable"中读取它.

edit2
刚想到的东西:
如果一个表作为一个可以为null的键(外键没有链接)那么这将无法使用from或?

Mar*_*ams 7

现代RDBM(包括Oracle)将大多数联接和子查询优化为同一个执行计划.

因此,我会继续以最简单的方式编写查询,并专注于确保您已完全优化索引.

如果您提供最终查询和数据库架构,我们可能会提供详细的建议,包括有关潜在锁定问题的信息.

编辑

以下是适用于您的查询的一些常规提示:

  • 对于联接,请确保您正在加入的列上有索引.确保将索引应用于两个表中的联接列.您可能认为您只需要一个方向的索引,但您应该对两者都进行索引,因为有时数据库会确定最好以相反的方向加入.
  • 对于WHERE子句,请确保在WHERE中提到的列上具有索引.
  • 要插入多行,最好将它们全部插入到一个查询中.
  • 要在具有聚簇索引的表上插入,最好插入聚簇索引的增量值,以便将新行附加到数据的末尾.这样可以避免重建索引,并且通常可以避免对现有记录进行锁定,从而减慢对现有行的SELECT查询速度.基本上,插入对于系统的其他用户来说变得不那么痛苦.