【问题标题】:How to improve performance of a SQL JOIN with an OR condition如何使用 OR 条件提高 SQL JOIN 的性能
【发布时间】:2018-12-26 21:25:36
【问题描述】:

复杂的 JOIN 查询为:

SELECT 
  FIRST.NAME,
  SECOND.FIRST_NAME,
  SECOND.LAST_NAME
FROM FIRST_TABLE FIRST
LEFT JOIN SECOND_TABLE SECOND 
  ON (SECOND.FIRST_NAME = FIRST.NAME OR SECOND.LAST_NAME = FIRST.NAME)

会导致性能不佳。

如何获得更好的性能?

【问题讨论】:

  • 请提供样本数据和期望的结果。目前尚不清楚您真正想要做什么。
  • 我只是分享一些我必须处理的问题的知识。主要思想是分离连接条件和用例的使用比使用复杂的连接更好。
  • 您是否尝试添加索引?使用子查询而不是 LEFT JOIN?
  • SECOND.FIRST_NAME 和 SECOND.LAST_NAME 在 SECOND 中是唯一的吗?
  • 对于SECOND_TABLE 中的任何记录,我们能否假设SECOND.FIRST_NAME 永远不等于SECOND.LAST_NAME?

标签: mysql sql database join hana


【解决方案1】:

这回答了问题的原始版本。

exists 可能会更好:

SELECT FIRST.ID, FIRST.NAME
FROM FIRST_TABLE FIRST 
WHERE EXISTS (SELECT 1 FROM SECOND_TABLE SECOND WHERE SECOND.FIRST_NAME = FIRST.NAME) OR
      EXISTS (SELECT 1 FROM SECOND_TABLE SECOND WHERE  SECOND.LAST_NAME = FIRST.NAME);

然后为了性能,您需要SECOND_TABLE(LAST_NAME) AND SECOND_TABLE(FIRST_NAME) 上的索引。

【讨论】:

    【解决方案2】:

    你可以试试这个,看看你会得到什么。这在很大程度上取决于FIRST_NAME 和LAST_NAME 上的索引,但它避免了OR。

    SELECT 
      FIRST.NAME,
      SECOND.FIRST_NAME,
      SECOND.LAST_NAME
    FROM FIRST_TABLE FIRST
      LEFT JOIN (
         SELECT S1.FIRST_NAME as TEST_NAME,
                S1.FIRST_NAME,
                S1.LAST_NAME       
         FROM   SECOND_TABLE S1
         WHERE  S1.FIRST_NAME <> S1.LAST_NAME
         UNION ALL
         SELECT S2.LAST_NAME as TEST_NAME,
                S2.FIRST_NAME,
                S2.LAST_NAME       
         FROM   SECOND_TABLE S2
       ) AS SECOND
      ON FIRST.NAME = SECOND.TEST_NAME
    

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 2013-04-15
      • 2017-03-06
      • 1970-01-01
      • 2022-10-17
      • 2016-03-15
      • 2012-07-13
      • 1970-01-01
      • 2016-12-20
      相关资源
      最近更新 更多