PostgreSQL 是否支持基于某个键仅对表中的第一个和最后一个值进行索引的任何类型的稀疏索引?
考虑以下数据:
CREATE TABLE samples (
device_id int not null;
ts timestamp not null;
value real not null;
);
现在,假设我有数百万台设备,每台设备都可以有数十亿个样本。我想访问所有这些数据——如果访问速度很慢,我不介意。但是我特别有兴趣通过ts
时间戳访问第一个和最后一个值:(device_id, value) 非常非常快。这可以知道特定设备的样本范围是多少。
我可以构建一个触发器/应用程序逻辑来管理存储信息的单独表:
CREATE TABLE first_last_samples (
device_id int not null;
first_ts timestamp not null;
first_value real not null;
last_ts timestamp not null;
last_value real not null;
);
但是,自己管理缓存第一个/最后一个项目的逻辑感觉有点笨拙。我在问 PostgreSQL 是否会管理任何特殊的索引类型,也许是通过扩展,这可以让我在表/视图/索引定义级别解决这个问题?
因为有数十亿个数据点,如果您只对第一个和最后一个感兴趣,将它们全部放入索引似乎没有意义。
如果您未公开的访问模式和/或其他限制不允许使用
MATERIALIZED VIEW
或触发器解决方案来保持表的最小值/最大值device_id
为最新,那么最接近的标准工具可能是BRIN 索引,它比相应的要小得多B-tree 索引,通常是几个数量级。但它的效率还取决于表中未公开的数据分布。看: