gpt4 book ai didi

sql - 优化联合内部联接?

转载 作者:行者123 更新时间:2023-11-29 14:27:57 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com