SQLite NOT IN查询很慢

时间:2012-10-05 16:00:15

标签: sql performance sqlite

我有两张桌子 - KeysKeysTempKeysTemp包含应使用Keys字段与Hash合并的临时数据。 这是查询:

SELECT
    r.[Id]
FROM
    [KeysTemp] AS k
WHERE
    r.[Hash] NOT IN (SELECT [Hash] FROM [Keys] WHERE [SourceId] = 10)

我在SourceIdHash字段的两个表上都有索引:

CREATE INDEX [IdxKeysTempSourceIdHash] ON [KeysTemp]
(
    [SourceId],
    [Hash]
);

Keys表的索引相同,但查询仍然很慢。 临时表中有5行,主表中有大约60000行。通过散列查询大约需要27毫秒,但查询这5行大约需要3秒钟。

我也试过拆分索引,即为SourceIdHash创建不同的索引,但它的工作方式相同。 OUTER JOIN在这里工作得更厉害。如何解决这个问题?

更新 如果我从查询中删除WHERE [SourceId] = 10它在30毫秒内完成,那很好,但我需要这样的条件:)

由于

3 个答案:

答案 0 :(得分:5)

也许

select k.id
from keytemp as k left outer join keys as kk on (k.hash=kk.hash and kk.sourceid=10)
where kk.hash is null;

?假设rk。还试过not exists吗?我不知道它是否以不同的方式工作......

答案 1 :(得分:0)

如果只有几个新密钥可以试试这个:

SELECT
    r.[Id]
FROM
    [KeysTemp] AS k
WHERE
    r.[Id] NOT IN (SELECT kt.[Id] FROM [Keys] AS k1
                   INNER JOIN [KeysTemp] AS kt ON kt.Hash = k1.Hash
                   WHERE k1.[SourceId] = 10)

KeysTemp应该在Hash列上有一个索引,Keys列上有SourceId

答案 2 :(得分:0)

我愿意:

SELECT
    r.[Id]
FROM 
    [KeysTemp] AS k
WHERE
    r.[Id] NOT IN (SELECT A.[Id] FROM [KeysTemp] AS A, [Keys] AS B WHERE B.[SourceId] = 10 AND A.[Hash] == B.[Hash])

列出Keys中存在的KeysTemp(少数)中的所有元素,然后在KeysTemp中取不出这些元素