具有许多布尔变量的模式的最佳实践

时间:2013-01-04 17:55:40

标签: sql indexing boolean bit-manipulation multiple-columns

我正在创建一个Postgresql数据库,其中我们有许多(10-40)个具有布尔值的变量。我想知道存储这些数据的最佳方法是什么,给定适量的更新和大量的多列搜索。

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

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

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

alternative to bitmap index in postgresql

更新:

我找到了一个建议使用整数或大整数的资源,如果你有多个变量(你应该使用单独的列),少于33个左右(你切换到位串)。这似乎更多地受到存储大小的推动,而不是搜索的简易性。

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

1 个答案:

答案 0 :(得分:1)

我在Database Administrators网站上找到了相关的讨论。

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

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

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

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

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