性能:在SQLite中使用IS NULL连接条件保持JOIN

时间:2016-07-01 05:53:51

标签: database sqlite left-join isnull

select *
from Dummy LEFT JOIN data_stream_2
    ON ((Dummy.id_2=data_stream_2.id_2) OR
       (Dummy.id_2 IS NULL and data_stream_2.id_2 IS NULL))

此查询需要26秒。我删除IS NULL检查的那一刻,即

select *
from Dummy LEFT JOIN data_stream_2
    ON ((Dummy.id_2=data_stream_2.id_2))

只需1.3秒。 如何更快地进行查询? 我们类似于这种情况Slow query with left outer join and is null condition但不同之处在于他的情况并非真正需要加入,因为他只使用Dummy中的列而不是data_stream_2中的列。我需要两个列。

1 个答案:

答案 0 :(得分:0)

在一般情况下,您可以将OR的两个部分分成compound query的两个部分:

SELECT *
FROM Dummy
LEFT JOIN data_stream_2
    ON Dummy.id_2 = data_stream_2.id_2
UNION ALL
SELECT *
FROM Dummy
JOIN data_stream_2
    ON Dummy.id_2 IS NULL AND data_stream_2.id_2 IS NULL;

但是,SQLite的IS运算符可以在任何一方使用任意表达式,并支持索引优化,因此您只需使用它来比较ID:

SELECT *
FROM Dummy
LEFT JOIN data_stream_2
    ON Dummy.id_2 IS data_stream_2.id_2;