我有一个小的Firebird 2.5数据库,其中一个名为“note”的blob字段声明为:
BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UTF8
数据库页面大小为:
16.384 (That I'm suspecting is too high)
我已运行此选择以发现可用blob字段的平均大小:
select avg(octet_length(items.note)) from items
并获得此信息:
2.671
作为初学者,我想知道这个blob字段的更好的段大小以及您认为的最佳数据库页面大小(我知道这取决于其他信息,但我仍然不知道如何计算它出)。
答案 0 :(得分:1)
Firebird中的Blob存储在数据库的单独页面中。确切的存储格式取决于blob的大小。如Blob Internal Storage:
中所述Blob是作为数据行的一部分创建的,但因为blob可能是 无限长度,实际与数据行存储的是a blobid,blob的数据分别存储在特殊blob上 数据库中其他地方的页面。
[..]
blob页面存储blob的数据。对于大blob,blob页面 实际上可以是一个blob指针页面,即用于存储指针 到其他blob页面。对于创建的每个blob,blob记录是 定义后,blob记录包含blob数据的位置,以及 有关blob内容的一些信息对于有用 尝试检索blob时的引擎。 blob数据可能是 以三种略有不同的方式存储。存储机制是 由blob的大小决定,并由其级别确定 数字(0,1或2)。所有blob最初都创建为0级,但是 随着尺寸的增加,它将转变为1级或2级。
0级blob是一个blob,可以与blob放在同一页面上 标题记录,对于4096字节的数据页,这将是一个blob 大约4052个字节(页面开销 - 插槽 - blob记录头)。
换句话说,如果blob的平均大小是2671字节(并且大多数大小仍然小于+/- 4000字节),那么页面大小4096可能是最佳的,因为它将减少平均浪费的空间16340 - 2671 = 13669字节到4052 - 2671 = 1381字节。
然而,对于性能本身而言,这可能几乎不重要,较小的页面大小还有其他影响,您需要考虑这些影响。例如,较小的页面大小也会减少CHAR
/ VARCHAR
索引键的最大大小,索引可能会变得更深(更多级别),并且更少的记录适合单个页面(或更宽的记录变为分成多页)。
如果没有测量和测试,很难说使用4096页面大小是否适合您的数据库。
关于分段大小:它是一个历史性的工件,最好被忽略(并且不再使用)。有时,应用程序或驱动程序错误地认为需要以指定的段大小写入或读取blob。在极少数情况下,指定较大的段大小可能会提高性能。如果您将其关闭,Firebird将默认值为80。
段大小:指定BLOB段是回溯到过去的时间, 当使用BLOB数据的应用程序是用C语言编写的 (嵌入式SQL)在 gpre 预编译器的帮助下。如今,它是 实际上无关紧要。确定BLOB数据的段大小 客户端通常大于数据页面大小,在 无论如何。