Performance Firebird是否进行碎片整理?如果是,像聚集索引?

Performance Firebird是否进行碎片整理?如果是,像聚集索引?,performance,firebird,clustered-index,defragmentation,mvcc,Performance,Firebird,Clustered Index,Defragmentation,Mvcc,我在文档中看到了一些(字面上说,只有一些)链接,但没有提到使用Firebird进行集群,这是可以做到的 然后,我就这个问题向月球射击,但回答者告诉我Firebird甚至没有聚集索引,所以现在我真的很困惑 Firebird是否对数据进行物理排序?如果是这样,是否可以按任何键(而不仅仅是主键)对其进行排序,是否可以打开和关闭群集/碎片整理,以便只在停机时进行 如果不是,这不是对性能的一个打击,因为将不同的行放在一起需要更长的时间,而这些行自然应该彼此相邻 (DB noob) MVCC 我发现Fire

我在文档中看到了一些(字面上说,只有一些)链接,但没有提到使用Firebird进行集群,这是可以做到的

然后,我就这个问题向月球射击,但回答者告诉我Firebird甚至没有聚集索引,所以现在我真的很困惑

Firebird是否对数据进行物理排序?如果是这样,是否可以按任何键(而不仅仅是主键)对其进行排序,是否可以打开和关闭群集/碎片整理,以便只在停机时进行

如果不是,这不是对性能的一个打击,因为将不同的行放在一起需要更长的时间,而这些行自然应该彼此相邻

(DB noob)

MVCC

我发现Firebird是基于MVCC的,所以在“扫描”之前,旧数据实际上不会被覆盖。我很喜欢

同样,我找不到太多,但数据不按照密钥进行碎片整理似乎真的很遗憾


表示数据库页已进行碎片整理,但没有提供进一步的解释。

在还原时,数据库页的创建已满约70%(我记得,除非指定gbak的-use_all_space开关),并且还原一次只执行一个表,根据需要将页写入数据库文件的末尾。您可以想象这样一种场景,页面可以压缩为更少的页面。因此,将数据汇集在一起并对其进行“碎片整理”


至于控制磁盘上的物理分组或进行在线碎片整理,Firebird中没有。请记住,仅仅因为您需要访问一个页面并不意味着您的磁盘执行读取操作——文件系统和数据库缓存可以避免它

Firebird不会对记录进行聚类。它的设计目的是避免需要聚类的问题和聚类索引带来的碎片问题。索引和数据分别存储在不同类型的页面上。每个数据页只包含一个表中的数据。记录按插入顺序存储,同时插入,通常在单独的页面上进行。当删除旧记录时,新记录将存储在原来的位置,因此新记录有时会与旧记录显示在同一页上

许多表使用人工主键,通常是升序主键,可能是数据库生成的序列或时间戳。这种做法导致记录以键顺序存储,但这种顺序并不能保证。也不是很有趣。当主键是人工的时,返回相关记录组的大多数查询都是在辅助索引上完成的。对于聚集的记录来说,这是一个性能问题,因为对二级索引的查找需要遍历两个索引,因为二级索引只提供主索引的键,必须遍历主索引才能找到数据

在更大的碎片整理和空间使用问题上,Firebird跟踪页面上的可用空间,以便在删除记录的页面上插入新记录。如果一个页面变为完全空,它将被重新分配。此空间管理在数据库运行时完成。正如您所知,Firebird使用多版本并发控制,因此当更新或删除记录时,Firebird会创建一个新的记录版本,但保留旧版本。当提交更改之前运行的所有事务都已结束时,旧记录版本将不再起任何作用,Firebird将删除它。在许多应用程序中,旧版本在正常运行数据库的过程中被删除。当事务接触到具有旧版本的记录时,Firebird会检查旧版本的状态,如果运行中的事务无法读取旧版本,则会将其删除。有一个名为“Sweep”的函数,可以系统地删除不需要的旧记录版本。扫描可以与其他数据库活动同时运行,不过最好在数据库负载较低时安排它。所以不,除非你进行扫描,否则不会删除任何内容

致以最良好的祝愿

安·哈里森

他与Firebird及其前任合作了令人尴尬的很长时间


顺便说一句——正如第一个回答的人所提到的,Firebird确实在页面上留下了空间,以便旧版本的记录与新版本的记录保持在同一页面上。这不是固定的空间百分比,而是页面上存储的每条记录16字节,因此记录非常短的表的页面有更多的可用空间,而记录较长的表的可用空间更少

我从来没有遇到过磁盘空间的问题,我每天都做一些大的事务——在一个事务中刷新一个10m行的表,等等。Firebird没有像您可能想的那样保留一个单独的事务日志——使用“小心写入”日志本质上就是数据库文件本身。您可以阅读有关自动清扫的更多信息。如果您使用的是专用服务器,我建议您关闭自动扫描,并安排每天一次gfix-sweep。你知道什么时候会发生这样的扫描。我意识到这个链接并没有包括如何设置自动扫描——你用“gfix-housing x”来设置每个数据库文件,其中x是触发它的事务间隔。如果x==0,则禁用自动扫描。