最佳Firebird blob大小页面大小关系

时间:2016-06-09 17:06:55

标签: blob firebird database-performance

我有一个小的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字段的更好的段大小以及您认为的最佳数据库页面大小(我知道这取决于其他信息,但我仍然不知道如何计算它出)。

1 个答案:

答案 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。

来自Binary Data Types

  

段大小:指定BLOB段是回溯到过去的时间,   当使用BLOB数据的应用程序是用C语言编写的   (嵌入式SQL)在 gpre 预编译器的帮助下。如今,它是   实际上无关紧要。确定BLOB数据的段大小   客户端通常大于数据页面大小,在   无论如何。