3

我正在创建一个 Postgresql 数据库,其中我们有许多(10-40)个具有布尔值的变量。考虑到适度的更新数量和大量的多列搜索,我想弄清楚存储这些数据的最佳方式是什么。

仅创建 30 个左右的布尔列并在必要时创建多列索引似乎非常简单。或者,有人建议创建一个组合所有布尔值的位字符串。似乎第二种选择应该更快,但其他人在网上给出的答案似乎是矛盾的(见下文)。

任何建议或解释都会有所帮助。数据有数千万行,但不会更大,我希望选择返回的数据介于 1/100 到 1/4 之间。

https://stackoverflow.com/questions/14067969/optimized-sql-using-bitwise-operator

替代 postgresql 中的位图索引

更新:

如果您有多个变量(您应该在其中使用单独的列)并且少于 33 个左右(您切换到位串),我发现了一个建议使用整数或大整数的资源。这似乎更多地是由存储大小而不是易于搜索引起的。

https://dba.stackexchange.com/questions/25073/should-i-use-the-postgresql-bit-string

4

1 回答 1

1

我在数据库管理员站点上找到了相关讨论。

首先,我将定义/分析在您的上下文中什么是“最佳”。你只是在寻找速度吗?你的搜索模式是什么?数据/磁盘量是否有问题?

你有什么选择?除了位串之外,还可以使用普通的文本字符串、整数数组和单独的列。为了快速获取数据,您必须考虑索引。您提到了多列索引。在多个索引中存储/索引相同的位变量是否有意义?

没有太多重复记录的 40 位意味着最多 2^20 = 1.1E12 条记录。这使得全表扫描成为一件冗长的事情。另一方面,如果您有很多重复的键,则索引并没有真正的帮助。

如果您期望大约 25% 的结果集,则必须在数据库和应用程序之间传输 2.7E11(部分)记录。假设 10,000 条记录/秒,这将需要 7,736 小时或 10 个月。

我的结论是,您应该考虑将数据存储在大 BLOB 中(1.1E12 x 40 位仅为 40 GByte)。您可以对数据进行分区,将有趣的部分读入内存并在那里进行搜索。这或多或少是大数据或数据仓库系统正在做的事情。

于 2013-01-05T00:47:10.223 回答