Как улучшить производительность SQL JOIN с условием ИЛИ - PullRequest
0 голосов
/ 27 декабря 2018

Сложный запрос 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)

приведет к плохой производительности.

Как повысить производительность?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вы можете попробовать это, посмотреть, что вы получите.Это будет сильно зависеть от индексов 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
0 голосов
/ 27 декабря 2018

ЭТО ОТВЕТЫ НА ОРИГИНАЛЬНУЮ ВЕРСИЮ ВОПРОСА.

Вам может быть лучше с 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).

...