postgresql - 对于具有 3 个 values 的列,我应该在 postgresql 中使用哪种索引

我有一个 table 有 100Mil+ 记录和 237 个字段。其中一个字段是 varchar 1 字段,其中包含三个可能的 values (Y,N,I) 我需要找到所有带有 N 的记录。现在我建立了一个 b-tree 索引,下面的查询大约需要 20分钟运行。我可以使用另一个索引来获得更好的性能吗?

SELECT * FROM tableone WHERE export_value='N';

回答1

假设您的 values 大致均匀分布(例如每个 value 的至少 15%)并且在整个 table 中大致均匀分布(一些在开始,一些在中间,一些在结尾)然后不是。

如果你仔细想想,你就会明白为什么。您必须在索引中查找数千万个磁盘块,然后从磁盘中逐个获取它们。当你这样做的时候,扫描整个 table 并挑选出匹配的 values 会更快。计划者知道这一点,可能根本不会使用索引。

但是 - 如果您只有 17 行带有“N”或者它们都是最近添加到 table 并且物理上碰巧彼此靠近,那么可以,并且索引可以提供帮助。

如果您只有几行带有“N”的行,您会提到它,因此我们可以忽略该行。

但是,如果您主要插入到此 table 中,您可能会发现 https://www.postgresql.org/docs/current/brin-intro.html 很有帮助。这可以让计划者看到,例如table 的前 80% 没有任何“N”块,因此它只需要查看最后一位。

相似文章

最新文章