【问题标题】:How to efficiently index PostgreSQL array columns for "ALL" operator?如何有效地为“ALL”运算符索引 PostgreSQL 数组列?
【发布时间】:2021-09-04 02:32:59
【问题描述】:

我的问题是基于这个问题:SQLAlchemy: how to filter on PgArray column types?

但我确实需要使用“ALL”运算符。就我而言,我有一系列日期。我需要找到日期数组中每个元素大于或等于给定日期的所有行。例如:'2021-06-20'

我应该为我的案例选择哪种类型的索引?

【问题讨论】:

  • 我不是postgre专家,但你能先找到最少的日期并与之比较吗? '2021-06-20' <= MIN(dates_arr) 之类的东西?
  • @PavelSmirnov 嗯,这是个好建议,我会检查一下
  • 为什么你真的需要使用 ALL?
  • @PavelSmirnov 非常感谢,您的建议有效。斯帕西博 :)

标签: sql postgresql indexing


【解决方案1】:

小于数组的每个成员就等于小于最小成员。

在 PostgreSQL 中,“min”用于聚合行,“least”用于“聚合”其参数列表。但我认为没有内置任何东西来确定数组的最小成员。您始终可以定义自己的函数来执行此操作。

create or replace function least_arr(anyarray) returns anyelement immutable parallel safe language sql as 
    $$ select min(x) from unnest($1) f(x) $$;

create index ON foo (least_arr(dates_arr));

explain analyze select * from foo where '2021-06-15'::date < least_arr(dates_arr);

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 2019-08-21
    • 2011-06-20
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多