我有一个巨大的整数数组列表(300,000,000 条记录)存储在 Postgres 9.2 DB 中。我想有效地搜索这些记录以获得完全匹配(仅相等)。我听说过 intarray 模块和相应的 gist-gin 索引。我想问以下问题:
- PostgreSQL 是否使用哈希函数来检查整数数组的相等性,还是执行暴力算法逐一比较数组的元素?
- 如果 PostgreSQL 使用散列函数,是否有一些 PostgreSQL 函数代码可以实际获取特定数组的散列函数结果?
- 哪个索引最适合这样的任务?B-tree,还是 intarray 模块提供的 gist - gin 索引?数据集将是静态的,即,一旦插入所有记录,就不会再插入了。所以,建立索引/更新索引时间对我来说并不重要。
问:PostgreSQL 是否使用散列函数来检查整数数组的相等性,还是执行蛮力算法逐一比较数组元素?
不根据文档中的数组函数和运算符:
没有提到哈希。
intarray提供了其他运算符,但不替换之间的相等运算符
int[]
。它公开的最接近的函数_int_same()在语义上是不同的(元素的顺序无关紧要),并且实现为排序+顺序比较,而不是散列。幸运的是,在 SQL 级别实现基于散列的快速搜索并不难,在您的情况下(大型数组、无更新、完全匹配),它甚至可能是最有效的方法。
脚步:
1)选择一个哈希函数。我建议
md5
数组的文本表示:该功能
digest(text,text)
是pgcrypto
扩展的一部分。与之相比,md5
它具有生成二进制(16 字节)而不是十六进制(32 字节)的优势,以实现更精简的索引。2)创建功能索引:
对于您拥有的数据集类型,它将比 GIN 索引快几个数量级(实际上我会担心创建 GIN 索引会花费非常不合理的时间,但请尝试一下)。
3)像这样使用它:
1)正如您已经发现的那样,您不能使用 b-tree,因为索引大小大于页面大小
2)给定:
您将不得不使用 GIN。不,GIN 不使用散列函数,也不使用蛮力算法。这是一个反向索引: