6

私は2つのテーブルを持っています-KeysKeysTemp。 フィールドを使用してKeysTempマージする必要がある一時データが含まれています。クエリは次のとおりです。KeysHash

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秒かかります。

SourceIdまた、インデックスを分割してみました。つまり、とに異なるインデックスを作成しましHashたが、同じように機能します。OUTER JOINここではさらに悪化します。その問題を解決する方法は?

UPDATEクエリから 削除する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 kt.[Id] FROM [Keys] AS k1
                   INNER JOIN [KeysTemp] AS kt ON kt.Hash = k1.Hash
                   WHERE k1.[SourceId] = 10)

KeysTempHash列と列にKeysインデックスが必要SourceIdです。

于 2012-10-05T16:02:10.830 に答える
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でこれらの要素ではないものを取得します

于 2012-10-05T16:08:47.487 に答える