サイズが約 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 として表示されていることに気付きましたが、これが理由でしょうか?