我有两张桌子 - Keys
和KeysTemp
。
KeysTemp
包含应使用Keys
字段与Hash
合并的临时数据。
这是查询:
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]
);
Keys
表的索引相同,但查询仍然很慢。
临时表中有5行,主表中有大约60000行。通过散列查询大约需要27毫秒,但查询这5行大约需要3秒钟。
我也试过拆分索引,即为SourceId
和Hash
创建不同的索引,但它的工作方式相同。 OUTER JOIN
在这里工作得更厉害。如何解决这个问题?
更新
如果我从查询中删除WHERE [SourceId] = 10
它在30毫秒内完成,那很好,但我需要这样的条件:)
由于
答案 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;
?假设r
是k
。还试过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中取不出这些元素