【发布时间】:2017-10-23 10:01:33
【问题描述】:
我有一个存储连续数据的应用程序。然后根据两列(timestamp 和 integer)选择行。
为了保持性能尽可能好,我必须重新计算索引的统计信息,但是根据时间间隔重新计算有两个问题:
- 每天插入的行数可能非常不同。一次安装可能有十行,另一次安装可能有数百万行。
- 无法保证应用程序 24/7 全天候运行。例如,它可以每天只运行一小时,甚至每周运行一次。
我读到最好在负载最小的时间内每天重新计算一次索引统计信息,这对于某些网络或公司数据库来说是很好的建议,但这是完全不同的情况,所以我想添加一些“智能” "进入自动重新计算。
每个表是否有一些行数(42;1,000;1,000,000?),之后应该重新计算统计信息?是否还取决于表中当前的总行数?
【问题讨论】:
-
如果有空的话,最好销毁索引,从头开始重建。它要么是
drop和create,要么是alter index NAME inactive,然后是alter ... active -
还要考虑批量插入。如果您不需要实时反应,那么创建临时的非索引文件(可能作为外部表)并按计划(如每 5 分钟一次)一个特殊的守护进程确保每个人都停止从数据表中读取可能是有意义的,然后停用索引,然后从临时累加器批量插入数据,然后重新激活索引,然后清除这些累加器,然后让其他程序再次读取表。 SQL 不太适合直接插入硬件传感器等定期生成的数据,最好将其解耦
-
@Arioch'谢谢,我已经有某种队列,我可以从其中一次在
execute block中插入许多行。但我这样做没有停用索引。 -
那么你的索引树每行都被改变了,并且树在“快速改变功能失调的一侧倾斜”和“重新平衡,部分重建到功能失调较少的状态之间摇摆,与投入了很多时间”然后你一次又一次地这样做。如果您确实必须进行大规模的“批量插入” - 那么有时将工作暂停、终止索引、插入大量数据并重新构建索引会总体上更快。
-
此外,如果您的数据库变慢 - 那么可能还有其他原因,例如糟糕的事务管理。您查看一些关于 firebird 变慢的一般原因的常见问题解答,例如 OIT/OAT/NT 间隙失控失控等。
标签: indexing firebird indices table-statistics