gpt4 book ai didi

SQL:速度改进 - 在 cond1 或 cond2 上左连接

转载 作者:行者123 更新时间:2023-12-04 14:13:43 27 4
gpt4 key购买 nike

SELECT DISTINCT  a.*, b.*
FROM current_tbl a
LEFT JOIN import_tbl b
ON ( a.user_id = b.user_id
OR ( a.f_name||' '||a.l_name = b.f_name||' '||b.l_name)
)
  • 两个基本相同的表
  • 我无权访问表结构或数据输入(因此没有清理主键)
  • 有时 user_id 填充在一个而不是另一个
  • 有时名称相等,有时不相等

  • 我发现我可以通过匹配 user_id 或名字/姓氏来获取大部分数据。我在名称之间使用 ' ' 以避免出现这样的情况:一个用户的名字与另一个用户的姓氏相同,并且都缺少另一个字段(不太可能,但有道理)。

    此查询在 33000 毫秒内运行,而个性化它们每个大约为 200 毫秒。
  • 我已经迟到了,现在无法思考
  • 我想我可以做一个 UNION 并且只在 user_id 不存在的情况下按名称查询(默认加入是 user_id,如果 user_id 不存在,那么我想按名称加入)
  • 这里有一些免费积分给任何想要帮助
  • 的人

    请不要问执行计划。

    最佳答案

    如果人们的建议没有显着提高速度,那么您的真正问题可能是两种可能的连接条件的最佳查询计划不同。对于这种情况,您可能希望执行两个查询并以某种方式合并结果。这可能会使您的查询变得更加丑陋。

    我在这种情况下使用的一个不起眼的技巧是对 UNION ALL 查询执行 GROUP BY。这个想法看起来像这样:

    SELECT a_field1, a_field2, ...
    MAX(b_field1) as b_field1, MAX(b_field2) as b_field2, ...
    FROM (
    SELECT a.field_1 as a_field1, ..., b.field1 as b_field1, ...
    FROM current_tbl a
    LEFT JOIN import_tbl b
    ON a.user_id = b.user_id
    UNION ALL
    SELECT a.field_1 as a_field1, ..., b.field1 as b_field1, ...
    FROM current_tbl a
    LEFT JOIN import_tbl b
    ON a.f_name = b.f_name AND a.l_name = b.l_name
    )
    GROUP BY a_field1, a_field2, ...

    现在,数据库可以使用最有效的计划执行这两个连接中的每一个。

    (警告这种方法的缺点。如果 current_tbl 中的一行连接到 import_tbl 中的多行,那么您将以一种非常奇怪的方式合并数据。)

    附带的随机性能提示。除非您有理由相信存在潜在的重复行,否则请避免 DISTINCT。它强制隐式 GROUP BY,这可能很昂贵。

    关于SQL:速度改进 - 在 cond1 或 cond2 上左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018627/

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