1

私のテーブルには、インデックスのない列がいくつかあります。これらの列の値の検索には、SQLite がテーブル全体をスキャンするため、非常に時間がかかる場合があります。

私の特定のケースでは、探している行 (値は一意です) は、ほとんどの場合、最後に挿入された行の中にあります。

スキャンを実行するときにSQLiteが最も古い(最初の)行から開始すると思われます.SQLiteにテーブルスキャンを逆の順序で実行するように指示する方法はありますか?

更新:変更ログでこれを見つけました:

オプティマイザーは、そうすることが ORDER BY ... DESC 句を満たす場合、逆方向にテーブルをスキャンするようになりました。

つまり、おそらくこれは、ORDER BY 句を追加して高速化できることを意味します。

4

2 に答える 2

2

解決策は次のとおりです。

ORDER BY rowid DESC LIMIT 1

それはルックアップを超高速にしました!

于 2011-09-25T20:46:37.603 に答える
1

FULL テーブル スキャンが必要なため、スキャンの順序 (古いものから新しいものへ、または新しいものから古いものへ) は関係ありません。すべての行を訪問する必要があります。あなたは「私が探している行」と述べていますが、条件

                    .... where col = 'a'

1 行を返す場合もあれば、10 行または 500 行を返す場合もあります。SQLite は、LIMIT ディレクティブを使用しない限り、最初に一致する行が検出されたときに単純に停止して、それを良い一日の仕事と呼ぶことはできません。

編集:ただし、タイムスタンプ列を使用してインデックスを作成し、インライン ビューを使用して比較的最近の行を取得することができます。

              select * from
              (
               select * from T 
               where datecreated > {somerecentdate}
              ) as myView
              where myView.someColumn = 'a'

または単に

            select * from T where datecreated > {some date} and somecolumn = 'a'

そのアプローチは反復プロセスになる可能性があります。行が返されない場合は、より広い時間枠で再クエリする必要がある場合があります。ただし、datecreated にインデックスを付ける場合は、[someColumn] にインデックスを付けることもできます。

于 2011-09-25T17:29:49.637 に答える