0

ほぼ 300K のレコードを含むテーブルがあります。インデックス付きの列 (「タイプ」はインデックス付き) で where 句を使用して単純な select ステートメントを実行します。

SELECT *
FROM Asset_Spec
WHERE type = 'County'

そのクエリは高速で、約 1 秒です。さらに、ステータスに対してテストしたい:

SELECT *
FROM Asset_Spec
WHERE type = 'County'
AND status = 'Active'

2 つ目は非常に遅い (分)。ステータスはインデックス化されておらず、この特定のケースでは、データベース内の値の 99.9% が「アクティブ」です。

パフォーマンスを向上させる方法はありますか? 独自のバージョンの SQLite をコンパイルしているので、多くの設定を微調整できます (FYI - iOS の事前に用意された SQLite で同じパフォーマンス)

4

3 に答える 3

2

クエリ プランを確認したところ、行数の見積もりが驚くほどずれていました。Asset_Spec (~2 行) - 実際の行数は約 300,000 です。「ANALYZE」を実行 - 同じクエリが 16 ミリ秒で実行されるようになりました。

于 2012-07-27T23:06:55.013 に答える
1

私が最初に試みることは、サブクエリを使用することです

SELECT * FROM
(SELECT *
FROM Asset_Spec
WHERE type = 'County')
WHERE status = 'Active'

また、Robertが示唆しているように、フィルタリングする列にインデックスを追加することをお勧めします。また、フィールドのタイプとステータスを文字列以外のものに変更することも検討します。

于 2012-07-27T19:07:33.637 に答える
0

* を選択する必要がある理由はありますか?

提案:

複数のレコードを取得する必要がありますか? 最初に見つかったレコードだけが必要な場合は、クエリの最後に「制限 1」を追加します。

行の存在を確認するだけの場合、つまりステータスがアクティブな行が 1 つあることだけを知りたい場合は、"select *" の代わりに "select 1" を使用します。

于 2012-07-27T19:30:59.703 に答える