如何提高带有 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_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
复杂的 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_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