【发布时间】:2013-07-10 06:22:47
【问题描述】:
我有一个包含 700,000 个条目的数据库和一个快速文本搜索表。每行都有一个与之关联的时间。我需要一次有效地分页记录 100 行。我通过跟踪一天的结束来做到这一点。
执行时间太长(15 秒)
这是一个示例查询:
SELECT *
FROM Objects o, FTSObjects f
WHERE f.rowid = o.AutoIncID AND
o.TimeStamp > '2012-07-11 14:24:16.582' AND
o.TimeStamp <= '2012-07-12 04:00:00.000' AND
o.Name='GPSHistory'
ORDER BY o.TimeStamp
LIMIT 100
时间戳字段已编入索引。
我认为这是因为Order By 语句正在对所有返回的记录进行排序,然后进行限制但我不确定。
建议?
【问题讨论】:
-
Timestamp上的索引是我的建议。 -
时间戳被索引@Matthew
-
连接语法在这里
JOIN FTSObjects f ON f.rowid = o.AutoIncID也可能有所帮助,但我认为优化器已经为您做到了。 -
我想知道在与 FTSObjects 隔离时提取 100 个对象行需要多长时间 - 即在该连接发生之前。
select o.autoincid from Objects o where o.timestamp....<snip> and o.name='GPSHistory' order by o.timestamp limit 100当您在(timestamp,name)上有一个复合索引并且timestamp上的原始简单索引已被删除。 -
另外,您的日期时间范围通常会获取多少条记录?您是在获取超过 100 条记录还是数千条记录?另外,反过来说,你能保证通过这种时间范围方法找到至少 100 条 GPSHistory 记录吗?
标签: c# sql database sqlite optimization