繁体   English   中英

SQL查询的时间太慢了

[英]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 BYLIMIT之前处理,但这是正确的功能。 实际上,分页实际上不起作用。 但一些优化的想法。

  1. 如果不是绝对必要,请不要SELECT * 觉得这可能不是因为如果你的分页结果几乎肯定不是用户正在看的两个表中的每个字段。
  2. AutoIncID, TimeStamp上创建一个覆盖索引AutoIncID, TimeStamp以防止它读取数据页面。 如果它来自Objects ,则将Name添加到该索引。
  3. 如果Name来自FTSObjectsrowid, Name上创建一个覆盖索引。
  4. 如果返回的字段可以被限制,请考虑将这些字段添加到覆盖的索引( 如果它只有几个字段) 您不希望索引变得太大,因为它会影响写入时间。

最好的方法是让一个好的DBA查看生成的计划,并确保它是最优的计划(例如,确保计划中没有表扫描,如果优化程序使用错误的统计信息,可能会发生这种情况)

这里有一些可能会有所帮助的事情:

  • Objects.Name上添加索引 - 甚至可能是NameTimeStamp上的复合索引。
  • FTSObjects rowid上添加索引它尚不存在
  • 定期更新Timestamp上的UPDATE STATISTICS信息(理想情况下,在大量更新之后,如果更新是连续的,则每天更新)
  • 重建聚集索引(如果有的话)。 如果您的聚簇索引位于无法获得顺序插入的字段上(例如,插入位于随机位置的char字段),这将有所帮助
  • 如果您不需要,请不要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM