firebird 索引维护:重启后变慢
firebird index maintence: slows after reboot
我在数据库中有一些 table 超过 40 M 的记录。
在计算机重新启动时,在第一个 set statistics index id
(对于每个索引),我花了大约一分钟。
第一次命令滑行后只有几毫秒。
在服务重新启动或程序重新启动时我没有这个问题:我只在重新启动时看到这个行为,并且只在第一次执行索引重新计算时看到。
Set statistics index index_dummy;
所以问题是:
如何避免这个'feature'?
解决方案很简单:不要在每次重新启动后都执行 set statistics
(或者考虑不要经常重新启动,以免一分钟的延迟变得明显)。
Firebird 计算的索引统计数据相对简单,因此除非您的数据量(行数)经常发生数量级变化,或者选择性('uniqueness' 的索引值)在 "very unique" 之间变化很大和 "very identical",重新计算可能对优化器没有可测量的影响,因为计算的统计数据只会有一点点变化,这使得重新计算它的价值变得很小none。
重新启动后第一次花费很长时间的原因可能是因为您的数据库(或至少索引页面)可以完全放入文件系统缓存中。启动后立即对所有索引执行 set statistics
将开始将所有索引页读入缓存。
set statistics
的后续重新执行将能够从缓存中读取页面,这避免了对磁盘的访问,从而显着提高速度。
请注意,set statistics
的使用完全有可能是有意为之并用于(滥用)文件系统缓存。这样,在启动时出现初始性能下降后,数据库的所有其他用户都可以获得将所有索引加载到文件系统缓存中的好处。
如果这是你公司的操作程序,你可能想问问周围为什么你需要在每次重启后做set statistics
(因为真的:除了这个技巧,如果索引值的数量和唯一性比较稳定,就不需要经常这样做了。
我在数据库中有一些 table 超过 40 M 的记录。
在计算机重新启动时,在第一个 set statistics index id
(对于每个索引),我花了大约一分钟。
第一次命令滑行后只有几毫秒。 在服务重新启动或程序重新启动时我没有这个问题:我只在重新启动时看到这个行为,并且只在第一次执行索引重新计算时看到。
Set statistics index index_dummy;
所以问题是: 如何避免这个'feature'?
解决方案很简单:不要在每次重新启动后都执行 set statistics
(或者考虑不要经常重新启动,以免一分钟的延迟变得明显)。
Firebird 计算的索引统计数据相对简单,因此除非您的数据量(行数)经常发生数量级变化,或者选择性('uniqueness' 的索引值)在 "very unique" 之间变化很大和 "very identical",重新计算可能对优化器没有可测量的影响,因为计算的统计数据只会有一点点变化,这使得重新计算它的价值变得很小none。
重新启动后第一次花费很长时间的原因可能是因为您的数据库(或至少索引页面)可以完全放入文件系统缓存中。启动后立即对所有索引执行 set statistics
将开始将所有索引页读入缓存。
set statistics
的后续重新执行将能够从缓存中读取页面,这避免了对磁盘的访问,从而显着提高速度。
请注意,set statistics
的使用完全有可能是有意为之并用于(滥用)文件系统缓存。这样,在启动时出现初始性能下降后,数据库的所有其他用户都可以获得将所有索引加载到文件系统缓存中的好处。
如果这是你公司的操作程序,你可能想问问周围为什么你需要在每次重启后做set statistics
(因为真的:除了这个技巧,如果索引值的数量和唯一性比较稳定,就不需要经常这样做了。