复杂的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)
将导致性能下降。
如何获得更好的性能?
答案 0 :(得分:0)
这回答了问题的原始版本。
使用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)
和{{1}}上建立索引。
答案 1 :(得分:0)
您可以尝试一下,看看会得到什么。它在很大程度上取决于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