当前位置: 首页 > 面试题库 >

性能:子查询或联接

司允晨
2023-03-14
问题内容

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

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或?一起使用?


问题答案:

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

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

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

编辑

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

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


 类似资料:
  • 问题内容: 对于开发人员何时使用联接而不是子查询是否有经验法则还是相同的? 问题答案: 取决于RDBMS。您应该比较两个查询的执行计划。 根据我对Oracle 10和11的经验,执行计划始终是相同的。

  • 问题内容: 当表开始增长时,我担心WHERE子句中IN的性能。有没有人对这种查询有更好的策略?子查询返回的记录数比TradeLine表中的记录数增长得慢得多。TradeLine表本身以每天10个的速度增长。 谢谢你。 编辑:我使用了将子查询从WHERE移到FROM的想法。我对有助于此新查询的所有答案投了赞成票。 问题答案: 子句中的子查询不依赖于外部查询中的任何内容。您可以安全地将其移到子句中;一

  • 问题内容: 该问题可能特定于SQL Server。当我编写查询时,例如: 是否对表的EACH行执行Case内的Case内的函数调用fnQuarterDate(或任何子查询)? 如果我预先在类似这样的变量中获取函数(或任何子查询)的值,会怎么样呢? 我知道在MySQL中,如果WHERE子句中的IN(..)内有子查询,则对每一行都执行该子查询,我只想为SQL SERVER查找相同的子查询。 … 只需填

  • 问题内容: 我是一个老派的MySQL用户,并且始终喜欢子查询。但是如今,每个人都使用子查询,而我讨厌它。我不知道为什么 我缺乏理论知识来自行判断是否存在差异。子查询是否与a一样好,因此不必担心吗? 问题答案: 取自MySQL手册 (13.2.10.11将子查询重写为Joins): LEFT [OUTER] JOIN可以比同等子查询更快,因为服务器可能可以更好地对其进行优化-这不仅限于MySQL S

  • 问题内容: 我重构了从另一家公司继承来的应用程序的慢速部分,以使用内部联接而不是子查询,例如: 重构查询的运行速度大约快100倍。 (约50秒,约0.3秒)我期望有所改善,但是谁能解释为什么如此剧烈?where子句中使用的列均已建立索引。SQL是否在where子句中每行执行一次查询? 更新 -说明结果: 区别在于查询“(id)in()”的第二部分- vs 1带有连接的索引行: 问题答案: “相关子

  • 问题内容: 我重构了从另一家公司继承来的应用程序的慢速部分,以使用内部联接而不是子查询,例如: 重构后的查询运行速度提高了约100倍。 (约50秒,约0.3秒),我期望有所改善,但谁能解释为什么如此剧烈?where子句中使用的列均已建立索引。SQL是否在where子句中每行执行一次查询? 更新 -说明结果: 区别在于“(())中的id”查询的第二部分- vs 1带有连接的索引行: 问题答案: “相