6

我有两张桌子 -KeysKeysTemp. KeysTemp包含应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 秒。

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

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

谢谢

4

3 回答 3

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吗?我不知道它是否以不同的方式工作......</p>

于 2012-10-05T16:05:51.007 回答
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])

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

于 2012-10-05T16:08:47.487 回答
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

于 2012-10-05T16:02:10.830 回答