我已经看到了几个(实际上只有几个)链接,而在有关使用Firebird进行群集的文档中却没有看到可以做到的。
然后,我针对这个问题向Firebird发出了CLUSTER命令,为月球射击了吗?,但回答者告诉我,Firebird甚至根本没有聚集索引,所以现在我真的很困惑。
Firebird是否完全以物理方式订购数据?如果是这样,是否可以通过任何键(不仅是主键)对其进行排序,并且可以打开和关闭群集/碎片整理,以便仅在停机期间执行此操作?
如果不是这样,这是否会对性能造成影响,因为将磁盘花在彼此自然应该排在一起的完全不同的行上会花费更长的时间吗?
(DB新手)
MVCC
我发现Firebird是基于MVCC的,因此直到“扫描”,实际上旧数据才被覆盖。我非常喜欢那个!
再说一次,我找不到很多东西,但是看起来很遗憾,不会根据密钥对数据进行碎片整理。
这表示数据库页已进行碎片整理,但没有提供进一步的说明。
Firebird不会对记录进行聚类。它被设计为避免需要聚类的问题以及聚簇索引附带的碎片问题。索引和数据分别存储在不同类型的页面上。每个数据页仅包含来自一个表的数据。记录按插入顺序,同时插入或同时插入的顺序存储,这些插入通常在单独的页面上进行。删除旧记录后,新记录将存储在它们的位置,因此新记录有时会与旧记录出现在同一页面上。
许多表使用人工主键(通常升序),该主键可能是数据库生成的序列或时间戳。这种做法导致记录以关键顺序存储,但是绝对不能保证该顺序。也不是很有趣。当主键是人工的时,大多数返回相关记录组的查询都是在辅助索引上完成的。对于聚集的记录而言,这会降低性能,因为在二级索引上的查找需要遍历两个索引,因为二级索引仅提供主索引的键,必须遍历主键才能找到数据。
关于碎片整理和空间使用的更大问题,Firebird跟踪页面上的可用空间,因此新记录将插入已删除记录的页面上。如果页面完全变空,将对其进行重新分配。数据库运行时将完成此空间管理。如您所知,Firebird使用多版本并发控制,因此当记录被更新或删除时,Firebird会创建一个新的记录版本,但会保留旧版本。提交更改之前运行的所有事务都结束后,旧记录版本将不再具有任何用途,并且Firebird会将其删除。在许多应用程序中,在运行数据库的正常过程中会删除旧版本。当交易涉及旧版本的记录时,Firebird检查旧版本的状态,如果没有正在运行的事务可以读取它们,则将其删除。有一个名为“清除”的功能,可以系统地删除不需要的旧记录版本。Sweep可以与其他数据库活动同时运行,尽管最好在数据库负载较低时安排它。因此,在运行一次扫描之前,什么都不会删除是不正确的。
最好的祝福,
安·哈里森
与Firebird合作的人,它的前身经历了一段令人尴尬的长时间
顺便说一句-作为第一个回答的人,Firebird确实在页面上保留了空间,以便记录的旧版本与新版本保持在同一页面上。它不是固定的空间百分比,而是页面上每条记录存储16个字节,因此具有非常短记录的表的页面具有更多的可用空间,而具有长记录的表的页面具有更少的可用空间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句