如何提高带有 OR 条件的 SQL JOIN 的性能

How to improve performance of a SQL JOIN with an OR condition

复杂的 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)

会导致性能不佳。

如何获得更好的性能?

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

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)SECOND_TABLE(FIRST_NAME).

上的索引

你可以试试这个,看看你会得到什么。它在很大程度上取决于 FIRST_NAMELAST_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