[英]SQL query by time too slow
我有一个包含快速文本搜索表的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
语句正在对返回的所有记录进行排序,然后进行限制,但我不确定。
建议?
是的, ORDER BY
在LIMIT
之前处理,但这是正确的功能。 实际上,分页实际上不起作用。 但一些优化的想法。
SELECT *
。 我觉得这可能不是因为如果你的分页结果几乎肯定不是用户正在看的两个表中的每个字段。 AutoIncID, TimeStamp
上创建一个覆盖索引AutoIncID, TimeStamp
以防止它读取数据页面。 如果它来自Objects
,则将Name
添加到该索引。 Name
来自FTSObjects
, 则在rowid, Name
上创建一个覆盖索引。 最好的方法是让一个好的DBA查看生成的计划,并确保它是最优的计划(例如,确保计划中没有表扫描,如果优化程序使用错误的统计信息,可能会发生这种情况)
这里有一些可能会有所帮助的事情:
Objects.Name
上添加索引 - 甚至可能是Name
和TimeStamp
上的复合索引。 FTSObjects
rowid
上添加索引它尚不存在 Timestamp
上的UPDATE STATISTICS
信息(理想情况下,在大量更新之后,如果更新是连续的,则每天更新) select *
- 这会增加I / O时间 您也可以尝试将字符串转换为DATETIME
,尽管我认为SQL会隐式执行此操作而不是将数据转换为字符串(在datetime上不使用索引)
SELECT *
FROM Objects o, FTSObjects f
WHERE f.rowid = o.AutoIncID AND
o.TimeStamp > CONVERT(DATETIME,'2012-07-11 14:24:16.582') AND
o.TimeStamp <= CONVERT(DATETIME,'2012-07-12 04:00:00.000') AND
o.Name='GPSHistory'
ORDER BY o.TimeStamp
LIMIT 100
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.