【问题标题】:SQL Join Table vs. SelectSQL 连接表与选择
【发布时间】:2015-06-20 13:54:37
【问题描述】:

我继承了一些带有以下 sn-p 的遗留 SQL 代码(为简单起见,我已匿名)。

CREATE EXTERNAL TABLE dim_abc (user_id int)

CREATE TABLE dim_foo AS
SELECT user_id,
       ...
FROM my_table a
JOIN (SELECT * FROM dim_abc) b
ON (a.user_id = b.user_id)

而不是...

FROM my_table a
JOIN dim_abc b
ON (a.user_id = b.user_id)

知道为什么以前的开发人员会在 JOIN 中执行 SELECT 吗?

** 代码是 Hive。

【问题讨论】:

  • 看看这两个语句的区别。他们会生成不同的表格吗?只有我能想到的是,子选择可能会抑制开发人员不想在新表中继承的表定义的参数
  • 省略号有点混淆。很难判断它们是否在进行递归,或者它们是否是由省略号分隔的两个不同的语句。你能发布整个代码吗?
  • 好文章解决了这个stackoverflow.com/questions/7194547/…
  • 您使用的是哪个 DBMS?甲骨文?
  • a_horse_with_no_name - 这是 Hive。

标签: sql join


【解决方案1】:

出于各种原因,没有子选择的版本更好。由于子查询,某些数据库(您没有提及数据库)将无法使用dim_abc 上的索引。

不过,这不是你的问题。我最好的猜测是代码开始时更复杂。现在的dim_abc 可能在某个时间点需要额外的逻辑。由于代码被简化,最终结果是from 子句中的一个无用的子查询。这只是一种猜测,但它提供了一种似是而非的情景。

【讨论】:

  • 不使用子选择是否有性能优势?
  • 它们应该是等价的,尽管较长的版本可能会伪造出无法将其识别为基表的解析器/优化器。类似的事情可能会发生,甚至可能是意图。我对 Hive 一无所知,但我倾向于同意 Gordon。
  • @user2715877 。 . .大多数数据库将为这两个查询生成相同的执行计划。但是,MySQL(和相关的数据库)将实现子查询,从而导致性能问题。但是,这不是 MySQL,因为另一个限制是视图的 from 子句中不允许子选择。
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多