【发布时间】:2018-11-20 17:28:01
【问题描述】:
假设我有键/值/时间范围元组,例如:
CREATE TABLE historical_values(
key TEXT,
value NUMERIC,
from_time TIMESTAMPTZ,
to_time TIMESTAMPTZ
)
并且希望能够有效地查询特定键和时间的值(降序排序),例如:
SELECT value
FROM historical_values
WHERE
key = [KEY]
AND from_time <= [TIME]
AND to_time >= [TIME]
ORDER BY value DESC
我应该使用哪种索引/类型来获得最佳查找性能?我怀疑我的解决方案将涉及 tstzrange 和 gist 索引,但我
不知道如何使其与键匹配和值排序要求相得益彰。
编辑:这里有更多关于使用的信息。
理想情况下使用 Postgres v9.6 中可用的功能。
关系将包含大约。每个键有 1k 个键和 5m 个值。值是大整数(最多 32 个字节),大多是唯一的。时间从几个小时到几年不等。时间跨度为 5 年。不允许使用
NULL值,但某些时间范围是开放式的(可以使用NULL或to_time的未来时间)。主键是键和时间范围(因为每个键只有一个时间范围的历史值)。
常见操作是 a) 更新
to_time以“关闭”历史值,以及 b) 使用from_time = NOW插入新值。可以查询所有值。分区是一种选择。
【问题讨论】:
-
Postgres 版本?基数?粗略的值频率? (多少个 dist. 键,每个键有多少个值?)查询中的典型时间范围(与总时间范围相比)?考虑tag info of [postgresql-performance] 中的说明。什么是PK?是否有 NULL 值?
-
是的,当然。使用 Postgres v9.6。大约 1k 键。大约。每个键 5m 个值。值是大整数,大多是唯一的。时间从几个小时到几年不等。
-
请edit问题:所有定义信息都应该在问题中。 “大整数” - 数据类型不能为
integer(或bigint)的任何原因都会更有效。可以将键列替换为引用表history_keys的整数 FK 列吗? (同样,更高效。)NOT NULL约束/NULL 值呢?表是只读的吗?还是只添加后来的时间戳?旧行是只读的吗?分区是一种选择吗?是否可以选择升级到 pg 10(或 pg 11,目前是测试版)?是否有任何从不查询的大范围值?
标签: postgresql indexing database-design postgresql-performance