我有一个非常简单的查询,大约需要 4 秒才能完成:
SELECT MAX(Date), Bond_Id, Sell_Price FROM Quotes GROUP BY Bond_Id;
该表也很简单,只有大约 31K 条记录。这是架构:
创建表行情( _id 整数主键自动增量, Bond_Id 整数非空, 日期文本不为空, Buy_Yield REAL NOT NULL, Sell_Yield REAL NOT NULL, Buy_Price REAL NOT NULL, Sell_Price REAL NOT NULL, Base_Price REAL NOT NULL, FOREIGN KEY (Bond_Id) REFERENCES Bonds(_id)); CREATE INDEX QuotesNdx ON Quotes(Bond_Id);
我研究了 SQLite 文档,并设法将查询时间从 7s 减少到 4s,这仍然是不可接受的。这几天我一直在绞尽脑汁,没有运气。我已经尝试过 ANALYZE,一些额外的复合索引,并且还尝试删除外键。没有什么。
这是解释输出:
0 Trace 0 0 0 解释 select max(date),bond_id,sell_price 从报价组按bond_id;00 1 午饭 0 0 0 00 2 整数 0 6 0 00 3 整数 0 5 0 00 4 转到 0 20 0 00 5 整数 1 6 0 00 6 返回 0 0 0 00 7 IfPos 5 9 0 00 8 返回 0 0 0 00 9 AggFinal 1 1 0 最大(1) 00 10 复印 1 9 0 00 11 复制 2 10 0 00 12 复印 3 11 0 00 13 结果行 9 3 0 00 14 返回 0 0 0 00 15 空 0 2 0 00 16 空 0 3 0 00 17 空 0 4 0 00 18 空 0 1 0 00 19 返回 0 0 0 00 20 戈苏 0 15 0 00 21 转到 0 48 0 00 22 组数列 0 7 0 00 23 打开读取 0 6 0 00 24 组数列 0 2 0 00 25 打开读取 2 7 0 密钥信息(1,二进制) 00 26 倒带 2 44 13 0 00 27 午饭 2 -7 13 0 01 28 IdxRowid 2 16 0 00 29 移动锗 0 0 16 00 30 列 2 0 8 00 31 等式 7 36 8 collseq(BINARY) 10 32 移动 8 7 0 00 33 戈苏 0 7 0 00 34 IfPos 6 47 0 00 35 戈苏 0 15 0 00 36 列 0 2 17 00 37 CollSeq 0 0 0 collseq(BINARY) 00 38 AggStep 0 17 1 最大(1) 01 39 复印 7 2 0 00 40 列 0 6 3 00 41 真实亲和 3 0 0 00 42 整数 1 5 0 00 43 下一个 2 27 0 00 44 关闭 0 0 0 00 45 关闭 2 0 0 00 46 戈苏 0 7 0 00 47 暂停 0 0 0 00 48 交易 0 0 0 00 49 验证Cookie 0 9 0 00 50 表锁 0 6 0 行情 00 51 转到 0 22 0 00
有小费吗?