2009-08-20 4 views
1

私はDBD :: SQLiteをメモリデータベースに使用しています。テーブルの次のインデックスを定義しました。SQLite3では、このselect文は2つのインデックスの恩恵を受けるでしょうか?

CREATE INDEX x ON ss (a, b); 
CREATE INDEX y ON ss (c, d, e, o); 

次のselectステートメントは、これら2つのインデックスを使用しますか?

SELECT f, g 
FROM ss 
WHERE a = ? AND b = ? AND c = ? AND d = ? AND e = ? 

そして、where句の列に対してのみインデックスを作成する必要がありますか?


最小限のINDEXでさらにSELECTを実行したいからです。

SELECT f, g FROM ss WHERE o = ? 
SELECT f, g FROM ss WHERE a = ? AND b = ? 
SELECT f, g FROM ss WHERE c = ? AND d = ? AND e = ? 
SELECT f, g FROM ss WHERE c = ? AND d = ? AND o = ? 
SELECT f, g FROM ss WHERE a = ? AND b = ? AND c = ? AND d = ? AND e = ? 

答えて

2

EXPLAIN QUERY PLANhttp://sqlite.org/lang_explain.html)を使用して、どのインデックスが使用されているかを確認してください。私はSQLiteのドキュメントを覚えている限り多く

"0","0","TABLE ss WITH INDEX ..." 
+0

申し訳ありません、あなたのリンクは有効ではありません。 – Juergen

+0

リンクはhttp://sqlite.org/lang_explain.htmlです。エスケープマジックで壊れているようです。 – wierob

+0

はい、本当の魔法;-)ありがとう! – Juergen

0

は間違っている可能性が、それは、これまでの選択(サブ)tableinごとに、1つの以上のインデックスを使用した場合のsqliteの小さなフットプリント与えられた私は非常に驚くだろう。

ORACLEやDB2のようなモンスターデータベースは、最近、副選択ごとに1つのテーブルにつき1つ以上のインデックスを使用し始めました。

0

のようなもので

EXPLAIN QUERY PLAN 
SELECT f, g 
FROM ss 
WHERE a = ? AND b = ? AND c = ? AND d = ? AND e = ? 

Reusltは、SQLiteは常にだけ インデックスを使用しています。

ここで失敗するようになります。しかし、関連するすべてのフィールドを含む1つの索引を作成することができます(ただし、索引サイズのメモリー消費量が増え、挿入と更新が遅くなる可能性があります)。

修正:最新のドキュメントでは、オプティマイザが「少なくとも1つのインデックス」を使用しようとしています。optimizer docuを参照してください。それは、それは少しアップグレードされた縫い目 - しかし、それは複数のindizesを使用するときはまだ明確ではありません。したがって、wierobによって "EXPLAIN QUERY PLAN"をstatetとして使用する必要があります。

関連する問題