1

サイズが約 3 GB の SQLite3 DB があります。特定の製品の最新の注文を 2 つの日付の間に表示するためにクエリを実行しようとしています。

テーブルの作成に使用されるクエリは次のとおりです。

CREATE TABLE "ProductOrders" (
    "ID" INTEGER NOT NULL  UNIQUE,
    "ProductID" INTEGER NOT NULL,
    "AdditionalInfo" TEXT,
    "OrderDateTime" DOUBLE NOT NULL,
    PRIMARY KEY ("ProductID", "OrderDateTime")
)

テーブルに重複がないことを確認するために、ProductIDとにインデックスを作成しました。OrderDateTime

これを行うために現在使用しているクエリは次のとおりです。

Select ProductID, AdditionalInfo, OrderDateTime
  From ProductOrders a
  Where a.OrderDateTime = ( Select max(OrderDateTime)
                              From ProductOrders b
                              Where a.ProductID = b.ProductID
                                AND b.OrderDateTime < 40544.5
                                AND b.OrderDateTime > 40539.5
                          )

そのクエリは正常に機能し、まさに私が望むことを行いますが、クエリの「a」部分についてテーブル全体をスキャンしているようです。私のトレースは次のとおりです。

0|0|0|SCAN TABLE ProductOrders AS a
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 1
1|0|0|SEARCH TABLE ProductOrders AS b USING COVERING INDEX sqlite_autoindex_ProductOrders_2 (ProductID=? AND OrderDateTime>? AND OrderDateTime<?)

実行に少なくとも 2 分かかるため、操作できません。構造でProductIDが主キー 1 としてOrderDateTime表示され、 が主キー 2 として表示されていることに気付きましたが、これが理由でしょうか?

4

1 に答える 1