对大型索引 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 TABLE
和 CREATE INDEX
语句,以及查询的 EXPLAIN
输出以获取更多详细信息。
我对使用 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 TABLE
和 CREATE INDEX
语句,以及查询的 EXPLAIN
输出以获取更多详细信息。