2

私の SQLite データベースには 500,000 行以上あります。初心者なので、VB.net アプリケーションで追加のインデックスを使い始めたばかりで、驚くほど速度が向上しています :)。

これらの改善は、テーブルの Date 列にインデックスを作成しても反映されません。以下にいくつかのコード スニペットの詳細を含めます。私が間違っている可能性がある点についてご意見をいただければ幸いです。

    'When creating the date column in DB (amongst others) 
oMainQueryR.CommandText += "RDate DATE, "

'creating index
oMainQueryR.CommandText = "Create INDEX main.iRDate ON DatabaseRows(RDate)"   
      oMainQueryR.ExecuteNonQuery()

'Storing the Data
.Parameters.Add(":Rdate", DbType.Date)
cmdSQLite.Parameters(":Rdate").Value = CDate(TextSplit(1)).ToString("dd/MM/yyyy")



'SQL Call to retrieve data
 oMainQueryR.CommandText = "SELECT * FROM DatabaseRows " _
                            & "WHERE DATE([RDate]) BETWEEN DATE(:StartDate) AND DATE(:EndDate) " _

呼び出しとすべてが正常に機能しており、RDate 列の速度に関してインデックスを作成しても改善されないだけで、正しい機能が得られます。

インデックスが正しく作成されているように見えることに言及する必要があります

助けていただければ幸いです、ありがとう

4

2 に答える 2

3

列の値ではなく関数呼び出しの結果を検索しているため、SQLite はこの検索にインデックスを使用しません。これDATE(RDate)はインデックスに格納されている値ではありません。

DATEクエリから関数を削除します。最適化を防止する以外は、クエリで何もしません。

... WHERE RDate BETWEEN :StartDate AND :EndDate

SQLite がクエリで実際にインデックスを使用しているかどうかを確認するには、EXPLAIN QUERY PLANを使用します。

dd/MM/yyyyは、SQLite でサポートされている日付形式の 1 つではないことに注意してください。yyyy-MM-dd文字列比較が正しく機能するには、使用する必要があります。

(このようなルックアップでは、日付を文字列として保存するか数値として保存するかはあまり重要ではありません。)

于 2013-09-17T16:42:56.990 に答える
2

日付データを格納することを検討してくださいINTEGER(日付データ型は、SQLite では本質的にサポートされていません)。

それはクエリを

SELECT * FROM DatabaseRows WHERE RDate BETWEEN (:StartDate) AND (:EndDate);

DATEこれにより、大量の関数呼び出しが回避されます。

実際、あなたの関数呼び出しは改善DATEを完全に無効にします。INDEX

また、INTEGER比較は比較よりもはるかに高速TEXTです。

于 2013-09-17T10:19:57.497 に答える