sql - 优化联合内部联接?

标签 sql postgresql amazon-redshift

我对优化查询的运行时间很感兴趣:

create temp table table_base as
(
  SELECT table_a.* FROM source_A a
  INNER JOIN
  source_B b
  USING(common_field1)
  WHERE a.field1 = x AND a.field2 = y
) 
UNION
(
  SELECT a.* FROM source_C a
  INNER JOIN
  source_B b
  USING(common_field1)
  WHERE a.field1 = x AND a.field2 = y
) UNION...

每个子查询中的第一个表(在本例中为source_A 和source_C)具有相同的结构,但数据量最大。 source_B 的内部连接是必要的我有兴趣追加一个字段并删除 source_B 的公共(public)字段中不可用的值。

查询本身目前确实在运行,但我想知道是否有更快的方法来执行此操作。我已经将 WHERE 子句放在子查询中而不是放在联合的末尾,但这让我想知道先联合/联合所有然后再进行单个内部联接是否更快?

非常感谢任何帮助(即使这意味着这在某种程度上是最有效的查询结构)。

最佳答案

要提高性能,一个关键方面是尽快移除未选中的行。有两个单独的联接是一个不错的选择,因为您强制联接立即排除不匹配的行。

但首先,您需要确保引擎使用最快的访问谓词从海量表 source_Asource_C 中过滤数据。对于您的过滤谓词,您使用的是简单的等式……这很完美。我会将以下索引添加到您的表中(如果您还没有它们):

create index ix1 on source_A (field1, field2);
create index ix2 on source_C (field1, field2);

现在,一旦选择了 source_Asource_C 中的行,您就需要访问 source_B。为了快速完成此任务,您需要确保还存在以下索引:

create index ix3 on source_B (common_field);

您还提到可以使用 source_B 中的某些列。要使其略微更快,您可以尝试对其使用覆盖索引。例如,如果您使用 source_B 中的 name 列,我会将此索引转换为覆盖索引,如下所示:

create index ix3 on source_B (common_field, name); -- added column "name"

最后,完成这些更改后,您应该获得一个执行计划以查看 SQL 优化器正在做什么。这永远不会造成伤害,并且会向您详细展示它是否选择了最佳路径。使用 EXPLAIN 获取它。

关于sql - 优化联合内部联接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55734246/

相关文章:

sql - 为什么在存储为 View 时,与列名相同的别名会被删除?

amazon-s3 - Redshift 卸载到连接字符串的 S3 位置

amazon-web-services - 我正在寻找一种通过 cloudformation 将新的 cloudwatch 事件添加到现有 redshift 集群的方法

postgresql - 为什么 "||"在 PostgreSQL/Redshift 中用作字符串连接

MySQL 数据库 : how store different size of product?

sql - Rails : complex search on 3 models, 只返回最新的 - 如何做到这一点?

sql - 如何计算同一个表中两个单独的列并将它们求和成一个新列

ruby-on-rails - postgres中的绝对值

sql - 反向 SQL 查询模式修改

Postgresql:LEFT JOIN 不起作用