Firebird数据类型 - BLOB Sub Type 1或VARCHAR(8000)

时间:2018-04-27 15:36:50

标签: firebird

我正在创建一个需要保存可能非常冗长的数据的列。它不应该达到8000个字符,因此我正在考虑使用Firebird VARCHAR(8000)数据类型 - 但是我想以正确的方式执行此操作。

使用varchar(8000)或BLOB sub_type 1会更有效吗? varchar(8000)不会预分配内存以容纳完整的8000个字符吗?

哪个更好?

1 个答案:

答案 0 :(得分:2)

在任何情况下,这两种选择都不是更好,所以在这方面,你的问题是基于意见的,而不是真正的回答。

VARCHAR(8000)的选择具有以下优点:值与记录的其余部分一起存储,减少了插入和查询所涉及数据的开销。作为缺点,它可能确实在某些缓冲区中分配了更多内存(我实际上并不认为这应该被认为是一个缺点,而且我不确定那里的所有实现细节),并且考虑到行的限制大小为32768字节,VARCHAR(8000)将 - 取决于字符集 - 从该最大值获取+/- 8000 - 32000字节。由于记录的RLE压缩,实际存储大小会更小。

blob sub_type text存储在带外,并且行本身只占用8个字节,但实际大小可以达到32GB,但需要在行本身单独创建或读取blob ,因此插入和检索值会产生额外的开销。此外,由于blob在页面中分配,因此可能会产生额外的存储效率低下(例如,数据库中的大小为8000字符,页面大小为16384,将使用16384字节)。

简而言之,您需要权衡您的选择,甚至可能执行一些测试,然后做出选择(并且可能在情况发生变化时重新选择该选项)。

例如,如果对此表的大多数访问不需要此字段的内容,那么使用blob可能是更好的选择(您只需在真正需要时读取数据)另一方面,如果对该表的每次访问也需要这些数据,那么使用varchar可能是更好的选择,因为数据将被内联加载而无需单独读取blob。