对大型索引 table 的查询超时

Query on large, indexed table times out

我对使用 Postgres 比较陌生,但想知道这里有什么解决方法。

我有一个 table,包含大约 20 列和 2.5 亿行,以及为时间戳列 time 创建的索引(但没有分区)。

发送到 table 的查询一直失败(尽管在 PgAdmin 中使用视图 first/last 100 行功能有效),运行 无休止。即使是简单的 select * 查询。

例如,如果我想将数据选择限制为 10

SELECT * from mytable
WHERE time::timestamp < '2019-01-01'
LIMIT 10;

这样的查询挂起 - 如何优化 table 这么大的查询?当 table 的大小较小(约 1 亿行)时,查询总是会完成。这种情况应该怎么办?

"Query that doesn't complete" 通常意味着它进行磁盘交换。特别是当您提到它设法完成 100M 行的事实时。那是因为 100M 行的索引仍然适合您的记忆。但是这个大小的两倍索引不会。

Limit 在这里帮不了你,因为数据库可能决定首先读取索引,这就是它的死因。

您可以尝试增加可用内存,但分区实际上是最好的解决方案。

分区意味着更小的表。较小的表意味着较小的索引。较小的索引更有可能适合您的记忆。

如果time的数据类型是timestamp或者索引是在(time::timestamp)上创建的,查询应该快如闪电。

请显示 CREATE TABLECREATE INDEX 语句,以及查询的 EXPLAIN 输出以获取更多详细信息。