1

私のテーブルには次のフィールドがあります。

  1. 日付 (整数)
  2. 状態 (整数)
  3. 製品 ID (整数)
  4. 商品名 (整数)
  5. 説明 (テキスト) (最大テキスト長 3000 文字)

行数は 800 万行を超えます。商品説明を別の表に入れるかどうかを決める必要があります。私の主な目標は、このステートメントを非常に迅速に作成することです。

SELECT Date,State,ProductId,ProductName FROM tablename ORDER BY DATE desc LIMIT 100

SQL の結果は、上記のステートメントの [説明] フィールドの値をフェッチしません。アプリケーション (新しいクエリ) で行が選択されている場合にのみ、ユーザーに説明が表示されます。

製品の説明を同じテーブルに入れたいのですが、SQLite が行をスキャンする方法がわかりません。日付の値が一致しない場合、SQLite はすぐに次の行にスキップできると思います。それとも、行が終了したことを知るために、説明フィールド値の最後に到達するまで、行のすべてのフィールドをスキャンする必要があるのでしょうか? 次の行に到達するためにすべてのフィールドをスキャンする必要がある場合、説明フィールドの 3000 文字の値は速度を大幅に低下させますか?

編集: INSERT 速度が重要であるため、インデックス作成は使用しないでください。

編集:すべてを1つのテーブルにまとめようとする唯一の理由は、何百ものアイテムの1つのトランザクションでINSERTとUPDATEを実行したいからです。同じトランザクションで同じアイテムが挿入され、後で更新される可能性があるため、アイテムごとの最後の挿入 ID を知ることはできません。

4

2 に答える 2

1
  1. そのクエリを使用し、列にインデックスがない場合Date、SQLite はテーブルからすべてのレコードを読み取り、一時テーブルを使用して結果を並べ替えます。
  2. 列にインデックスがある場合Date、SQLite はインデックス内の最後の 100 レコードを検索し、それらのレコードのすべてのデータをテーブルから読み取ります。
  3. カバリングインデックス、つまり、DateStateProductId、およびの 4 つの列を持つ 1 つのインデックスがある場合ProductName、SQLite はインデックスから最後の 100 エントリを読み取るだけです。

SQLite がデータベース ファイルから読み取るときは常に、値やレコードではなく、ページ全体 (通常は 1 KB または 4 KB) を読み取ります。

ケース 1 では、SQLite はテーブルのすべてのページを読み取ります。
ケース 2 では、SQLite はインデックスの最後のページ (100 の日付が 1 ページに収まるため) と、テーブルの 100 ページ (レコードごとに 1 ページ、これらのレコードが 2 つ同じにならないことを想定) を読み取ります。ページ)。
ケース 3 では、SQLite はインデックスの最後の数ページを読み取ります。

ケース 2 はケース 1 よりもはるかに高速です。ケース 3 はさらに高速になりますが、おそらく気になるほどで​​はありません。

于 2013-01-23T12:39:17.897 に答える
0

古き良きデータベース正規化ルール、この場合は特に1NFに依存することをお勧めします。その説明(ProductNameについても同じ)が繰り返される場合は、データベース設計の問題があり、SQLiteなどにあることとはほとんど関係がありません。CLは彼のインデックスに正しいです、気をつけてください、適切なインデックス付けはまだ重要です。

モデルを確認し、製品用のテーブルと在庫用のテーブルを作成します。

于 2013-01-23T12:50:54.030 に答える