多列 BRIN 列顺序是不是重要?

Posted

技术标签:

【中文标题】多列 BRIN 列顺序是不是重要?【英文标题】:Does multi-column BRIN column order matter?多列 BRIN 列顺序是否重要? 【发布时间】:2020-04-30 14:41:56 【问题描述】:

我的表中有大量数据(500 多万行),我需要实时过滤/查询。我无法使用常规 b-tree 索引获得令人满意的性能或可预测的查询计划。我认为使用 BRIN 会有很大帮助,但是因为我们的数据无法插入到我需要查询的任何受控物理顺序中,所以我设置了一个 MATERIALIZED VIEW 来选择数据(包括连接数据)并对其进行排序以特定的顺序。类似的东西......

CREATE MATERIALIZED VIEW my_view AS
    SELECT a.one, b.two, b.three, c.four, c.five, c.six
    FROM a, b, c WHERE ...joins
    ORDER BY b.three, b.two, a.one, c.four;

然后我基于多个列创建了索引,因为 所有 指定的列将始终用于此视图的单个查询。

CREATE INDEX my_view_idx ON my_view
    USING BRIN (three, two, one, four) WITH (pages_per_range = 64);

我根据选择性对列(在表中的列)进行排序,这意味着b.three 将过滤掉 80% 的记录(即只有 20% 的记录会匹配),b.two 将过滤掉 70%,等等。

BRIN 列的排序是否与表的物理排序相同?我找不到任何描述这一点的资源。我能找到的最接近的东西来自:https://www.postgresql.org/docs/10/indexes-multicolumn.html ...

多列 BRIN 索引可用于涉及索引列的任何子集的查询条件。与 GIN 一样,与 B-tree 或 GiST 不同,无论查询条件使用哪个索引列,索引搜索的有效性都是相同的。

...但这并没有描述列排序,只是包含在查询中

我可以进行试验(并且一直在试验,结果出奇地好),但这是一个缓慢的过程,因为需要 2 多个小时才能实现视图并构建索引,所以我希望为我的猜测以避免浪费大量时间。

【问题讨论】:

这里有同样的问题...您是否尝试过使用不同的列顺序并比较它们的性能? 不幸的是,我的测试非常有限,因为实现视图需要多长时间。我们已经重构并且不再使用这种方法,所以我真的不确定性能差异仍然:( 【参考方案1】:

我认为 BRIN 索引中的列顺序无关紧要 - 根据同一个文档:https://www.postgresql.org/docs/10/indexes-multicolumn.html

与 GIN 一样,与 B-tree 或 GiST 不同,无论查询条件使用哪个索引列,索引搜索的有效性都是相同的。

看起来顺序只对 B-tree 和 GiST 很重要。

【讨论】:

这正是 OP 引用的部分,并说“但这并未描述列顺序,仅包含在查询中”。

以上是关于多列 BRIN 列顺序是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中多列索引的字段顺序是不是重要

具有列顺序的响应式多列列表

Oracle:索引中的列顺序重要吗?

多列索引列顺序

如何用EXCEL函数把多行多列按顺序转为多行一列

列存储索引中列的顺序在 SQL Server 2012 中是不是重要