Firebird 2.1 在某些数据库表中存储大量行是不是有效?
Posted
技术标签:
【中文标题】Firebird 2.1 在某些数据库表中存储大量行是不是有效?【英文标题】:Is Firebird 2.1 efficient to store a massive number of rows in some DB's table?Firebird 2.1 在某些数据库表中存储大量行是否有效? 【发布时间】:2011-11-17 10:21:28 【问题描述】:我的应用程序不断收到一个需要存储的非常小的事件,我在想这是处理它的最佳方式。这个事件的表格应该是这样的:
EVENT
id
timestamp
some_data (integer)
fk_to_some_holder_table
如果我继续将每个事件存储为一行,那么对于使用某种 blob 压缩/处理的实现会不会有一些缺点?还是我在这里太过分了?
我使用的是 Firebird 2.1。如果需要,我可以升级到 Firebird 2.5。
提前致谢。
【问题讨论】:
你的问题不是很清楚。数据库旨在存储大量数据,您提供的定义绝对不需要使用 blob 或压缩,并且不必要地使用它们中的任何一个都会增加完全不必要的开销。你能澄清一下你在问什么吗? 你的做法是正确的。数据库系统专为存储大量行而设计。不要担心压缩,你会浪费你的时间。并且在任何情况下都不要错误地尝试使用 blob! 你是对的。我的问题是关于 Firebird 2.1 实现的。我编辑了这个问题。谢谢 当我第一次在我目前的工作中接管数据库时,它最初设置了一些字段作为 BLOBS,你必须做的只是回显 blob(在 php 中)是荒谬的,所以我切换了它们都只是普通的行,没有任何人注意到的区别,而且我们数据库中的一些表有 600,000 + 行。 【参考方案1】:我相信你最好使用“传统的基于行的记录”:
您想查询记录,对吗?查询 BLOB 既困难又缓慢; 由于您的记录太小,您无法对其进行压缩,因此使用大多数压缩算法,结果可能会比单独字段所需的大;根据“What are the technical limits of Firebird?”文章,一张表的最大大小为 32TB 或 16G 行。
在这种特定情况下,我认为 2.1 和 2.5 之间没有任何区别,但由于其他/一般改进,我会使用 2.5。
【讨论】:
但是如果我得到很多小记录,我可以把它们放在一个 BLOB 中并压缩那个 BLOB。我会做一些测试并在这里发布结果。 好吧,看起来你只是喜欢它带来的额外作品id
和 fk_to_some_holder_table
是 64 位整数,您的记录是 224 位或 28 字节。所以 32TB / 28 = 1.1T 行,即行限制更重要。但是,如果您每秒获得 1 行,那么 16G 行适用于 16G / 86400 = 185185 天或大约 500 年。由于已经提到的原因,作为一行存储比 blob 更有意义
我现在坚持使用 2.1,2.5 有太多我喜欢的错误
【讨论】:
以上是关于Firebird 2.1 在某些数据库表中存储大量行是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章
IBExpert 中的 Firebird 在访问某些存储过程时抛出错误
IBExpert中的Firebird在访问某些存储过程时会引发错误