我有一个大小约为 3GB 的 SQLite3 数据库,我正在尝试查询它,以便在 2 个日期之间调出特定产品的最新订单。
这是用于创建表的查询:
CREATE TABLE "ProductOrders" (
"ID" INTEGER NOT NULL UNIQUE,
"ProductID" INTEGER NOT NULL,
"AdditionalInfo" TEXT,
"OrderDateTime" DOUBLE NOT NULL,
PRIMARY KEY ("ProductID", "OrderDateTime")
)
ProductID
我在and上创建了索引,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,这可能是原因吗?