2015-01-01 19 views
0

我有SQLite中兩個表:from_originalfrom_binary。我想要LEFT OUTER JOIN拉出from_original中不存在的記錄from_binary。問題是我寫的查詢沒有完成(大約1小時後我終止了它)。任何人都可以幫我理解爲什麼?sqlite查詢沒有完成 - 錯誤的索引,或只是太多的數據?

我會爲每個在我的查詢字段定義的索引,但explain query plan只提到指標之一將被引用。我不確定這是否是問題,還是隻是數據太多的問題。

下面是該查詢我試圖運行:

select * from from_original o 
left outer join from_binary b 
on o.id = b.id 
and o.timestamp = b.timestamp 
where b.id is null 

的表都有大約400萬條記錄:

rowcounts

我已經定義的索引的所有idtimestamp字段(請參閱帖子末尾的架構),但explain query plan僅指示將使用其中一個id索引。

explain query plan

這裏是表架構,其中包括索引定義:

schema

回答

1

這是您的查詢:

select o.* 
from from_original o left outer join 
    from_binary b 
    on o.id = b.id and o.timestamp = b.timestamp 
where b.id is null; 

(注:你不需要從列b,因爲他們都應該NULL。)

這個查詢的最好指標是from_binary(id, timestamp)一個綜合指數。你有很多SQLite的數據,但這可能會在有限的時間內完成。

+0

感謝,這有助於(今<30秒完成)。我猜這是最有幫助的綜合指數?正如你所說,反正所有的'b'列都是'NULL',所以我不認爲在我的查詢中拉他們會是一個問題('select *'vs'select o。*')? – Roberto

+0

@Roberto。 。 。綜合指數應該是提高績效的主要原因。如果你想'NULL'值'b'列,你應該能夠添加它們,對性能影響最小。 –

+0

這不是我有興趣看到空值。我只是在尋求自己的理解和好奇心。感謝您的解釋。 – Roberto