SQLite不在查询中速度较慢

SQLite不在查询中速度较慢,sql,performance,sqlite,Sql,Performance,Sqlite,我有两个表-Keys和KeysTemp。 KeysTemp包含应使用Hash字段与Keys合并的临时数据。 以下是查询: SELECT r.[Id] FROM [KeysTemp] AS k WHERE r.[Hash] NOT IN (SELECT [Hash] FROM [Keys] WHERE [SourceId] = 10) 我在两个表上都有SourceId和Hash字段的索引: CREATE INDEX [IdxKeysTempSourceIdHash] ON

我有两个表-
Keys
KeysTemp
KeysTemp
包含应使用
Hash
字段与
Keys
合并的临时数据。 以下是查询:

SELECT
    r.[Id]
FROM
    [KeysTemp] AS k
WHERE
    r.[Hash] NOT IN (SELECT [Hash] FROM [Keys] WHERE [SourceId] = 10)
我在两个表上都有
SourceId
Hash
字段的索引:

CREATE INDEX [IdxKeysTempSourceIdHash] ON [KeysTemp]
(
    [SourceId],
    [Hash]
);
键的索引与表的索引相同,但查询速度仍然非常慢。
临时表中有5行,主表中大约有60000行。按哈希查询大约需要27毫秒,但查询这5行大约需要3秒钟

我还尝试了拆分索引,即为
SourceId
Hash
创建不同的索引,但其工作方式相同<代码>外部连接
在这里的效果更差。如何解决这个问题

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


谢谢

如果只有几把新钥匙,您可以尝试以下方法:

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
列上有索引,在
SourceId
列上有
Keys

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;
??假设
r
k
。您是否也尝试过
不存在
?我不知道它是否以不同的方式工作…

我会:

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])

列出KeysTemp中存在于Keys中的所有元素(很少),然后仅按sourceid对KeysTemp中的元素进行索引,并仅按hash对KeysTemp中的元素进行索引。如果不是所有组件都以相同的顺序在查询中使用,则无法使用索引。我认为使用包含数千个元素的not in子句是非常沉重的。最好考虑常见元素,然后在SQLite中不支持当前剩余的右、全外连接。当顺序颠倒时,工作时间约为818ms。不存在时工作时间更糟。这很奇怪,让我试着使用索引。>但这是左外连接:哦,对不起。我没有注意到你的编辑,但仍然是2731ms。我想没有正确的索引就可以了!67毫秒好多了。好吧,本来是要留下来的,但你没能读懂我的心思——真是太遗憾了。如果
不存在
有帮助,这可能是我所能做的。我的意思是,我没有主意了;)它可以工作,但大约需要251ms。仍然不完美。索引呢?
Hash
上的
KeysTemp
SourceId
上的
Keys