2016-07-01 1 views
2
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, то естьПроизводительность: Влево JOIN с условием NULL соединения в SQLite

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

Можете ли вы показать нам некоторые данные образца? Можете ли вы отличить «NULL» от отсутствия совпадения в соединении и фактическое значение «NULL»? –

+0

Вы уверены, что вы сравниваете эффективность правильно? Например, вы пытались выдать каждый запрос несколько раз в разных заказах. Возможно, вы ищете не то место. – Thinkeye

+0

Да, я уверен. SQLite Manager показывает время в секундах – user584263

ответ

0

В общем случае, вы можете разделить эти две части ИЛИ на две части в 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 является оператор может использовать произвольные выражения с обеих сторон, а также поддерживает индекс оптимизации, поэтому вы можете просто использовать его для сравнения идентификаторов:

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

Спасибо, что ответили. Я попробовал решение, но он не сделал запрос быстрее. – user584263

Смежные вопросы