sql - 具有许多 boolean 变量的模式的最佳实践

标签 sql indexing boolean bit-manipulation multiple-columns

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

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

任何建议或解释都会有所帮助。数据有数千万行,但不会更大,我希望选择返回数据的 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

最佳答案

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

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

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

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

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

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

关于sql - 具有许多 boolean 变量的模式的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14162305/

相关文章:

mysql - 迭代 JOIN

c# - 如何解决 SQL 在代码优先迁移部署 Azure 期间找不到数据类型 BLOB

python - 处理 Tkinter 文本小部件索引系统。

java - 一个循环完美运行,而下一个相同的循环失败

java - 为什么我在这里得到不同的结果?

c# - 将 Sql 中的位值转换为 C# 中的 Int 的正确方法是什么

将数据从 SQL Server 数据库移动到 Oracle 数据库的 Python 脚本不断给出 'ORA-01036: illegal variable name/number'

php:将索引二维数组转换为按包含值关联索引的二维数组的最简单方法?

sql - Oracle - 像文本宏一样使用WITH子句

java - 包装 boolean 值 VS 原始 boolean 值