小编典典

性能:子查询或联接

sql

我对子查询的性能/连接另一个表有一些疑问

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
  );

这是我的SQL,现在这个东西可以运行大约一百万次或更多。我的问题是什么会更快?

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

或者

  • 如果我将’HelpTable’添加到中from并在中进行联接where

edit1
好吧,此脚本仅运行与r个人一样多的人。

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

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

edit2
我刚想到:
如果一个表作为键可以为空(未链接的外键),那么这将无法与from或?一起使用?


阅读 188

收藏
2021-03-23

共1个答案

小编典典

包括Oracle在内的现代RDBM都将大多数联接和子查询优化到相同的执行计划。

因此,我将以对您来说最简单的方式来编写您的查询,并专注于确保您已完全优化索引。

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

编辑

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

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