gpt4 book ai didi

firebird - Firebird 是否需要手动重新索引?

转载 作者:行者123 更新时间:2023-12-03 23:16:22 25 4
gpt4 key购买 nike

我同时使用 Firebird 嵌入式和 Firebird 服务器,有时我需要使用如下程序重新索引表:

CREATE PROCEDURE MAINTENANCE_SELECTIVITY 
ASDECLARE VARIABLE S VARCHAR(200);
BEGIN
FOR select RDB$INDEX_NAME FROM RDB$INDICES INTO :S DO
BEGIN
S = 'SET statistics INDEX ' || s || ';';
EXECUTE STATEMENT :s;
END
SUSPEND;
END

我想这是使用嵌入式是正常的,但是使用服务器真的需要吗?有没有办法将服务器配置为在需要时或定期自动执行?

最佳答案

首先,让我指出我不是 Firebird 专家,所以我是根据 SQL Server 的工作原理来回答的。

在这种情况下,答案是肯定的,也不是。

索引当然会在 SQL Server 上更新,从某种意义上说,如果插入新行,该表的所有索引都将包含该行,因此会被找到。所以基本上,您不需要为该部分的工作不断重新索引表。那是“不”的部分。

然而,问题不在于索引,而在于统计。您是说您需要重新索引表,但随后您显示了操作统计信息的代码,这就是我要回答的原因。

简短的回答是,随着时间的推移,统计数据会慢慢失控。它们可能不会恶化到无法使用的程度,但是当您重新创建/重新计算它们时,它们会从它们所处的完美水平下降。这就是"is"的部分。

陈旧统计信息的主要问题是,如果索引中键的分布发生剧烈变化,统计信息可能不会立即获取,因此查询优化器将根据旧的陈旧统计数据选择错误的索引它在手。

例如,假设您的一个索引的统计信息表明键聚集在值空间的一端(例如,具有许多 0 和 1 的 int 列)。然后插入大量行,其值使该索引包含分布在整个范围内的值。

如果您现在执行一个查询,该查询使用来自另一个表的连接,针对具有您的此索引的表的具有低选择性(还有很多 0 和 1)的列,查询优化器可能会推断出该索引是好的,因为它将获取将同时使用的许多行(它们位于同一数据页上)。

但是,由于数据发生了变化,它会跳过索引以找到相关部分,因此毕竟不是那么好。

重新计算统计信息后,查询优化器可能会发现此索引对于此查询不是最佳的,并会选择另一个更合适的索引。

基本上,如果您的数据不断变化,您需要定期重新计算统计数据。如果您的数据很少更改,您可能不需要经常这样做,但我仍然会添加一个定期执行此操作的维护作业。

至于是否有可能让 Firebird 自己做,再一次,我如履薄冰,但我怀疑有。在 SQL Server 中,您可以按计划设置执行此操作的维护作业,并且至少您应该能够从 Windows 调度程序启动批处理文件来执行类似操作。

关于firebird - Firebird 是否需要手动重新索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/882223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com