2012-03-23 4 views
1

私はこのクエリを書いた:SQLiteインデックスが高速クエリではないのはなぜですか?

INSERT INTO KeysTable (KeyText, Id) 
SELECT KeyText as BKT, KeysTable.ID as CID FROM KeysTable 
INNER JOIN StatTable ON KeysTable.ID = StatTable.Key_ID 
WHERE StatTable.StatCommandCode = 4 AND 
EXISTS (SELECT 1 FROM StatTable WHERE StatCommandCode = 4 AND StatTable.Key_ID = CID); 

私は

AND StatTable.Key_ID = CID 

条件を削除すると、クエリが非常に速くなるだろうことを知っています。また、私が

AND StatTable.Key_ID = 444 // (444 - random static number) 

と置き換えると、そのクエリも非常に高速になります。

CREATE INDEX IF NOT EXISTS StatsIndex ON StatTable (Key_ID); 

KeysTableID列が主キーである:この状態で列が索引付けされ、両方。この場合、索引でパフォーマンスが向上しないのはなぜですか?

答えと私の悪い英語:(申し訳ありませんのためのおかげで

+1

にインデックスを追加してみてくださいすることができますか? –

+0

両方のフィールドは(INT同じ種類ありますか? CHAR?)? – Konerak

+3

EXISTSサブクエリはすでに参加しているので余計なようですね。 – Konerak

答えて

4

二つのテーブルのいずれにもCID列がない場合、EXISTSサブクエリは無用であるとして文を修正:。。

INSERT INTO KeysTable (KeyText, Id) 
    SELECT KeyText 
     , KeysTable.ID 
    FROM KeysTable 
    INNER JOIN StatTable 
     ON KeysTable.ID = StatTable.Key_ID 
    WHERE StatTable.StatCommandCode = 4 

それはまだ遅い場合、あなたはその `EXISTS`サブクエリの使用は何(StatCommandCode, Key_ID)

+0

私はこれが成し遂げようとしていることについてはまだまだバフルです。あなたは 'KeysTable'にいくつかのデータを挿入していますが、これらのデータは既にそこにあります...テーブル内に同じ行を持つ点は何ですか? –

+0

ありがとう!私はなぜ以前に存在するのか疑問に思っています:)(おそらく、別のサブクエリがある前にはわかりません)。存在は役に立たない、あなたは正しい。 – Dmitriy

+0

@Dmitriy:Insert文が何をしようとしているのか説明できますか?それの使用は何ですか? –

関連する問題