我对使用Postgres还是比较陌生,但是我想知道这里的解决方法是什么。
我有一个约有20列和2.5亿行的表,以及一个为时间戳列time
创建的索引(但没有分区)。
发送到表的查询已失败(尽管使用了PgAdmin中的“查看前100行”功能),该查询不断运行。甚至是简单的select *
查询。
例如,如果我想将选择的数据限制为10个
SELECT * from mytable
WHERE time::timestamp < '2019-01-01'
LIMIT 10;
这样的查询挂起了-如何优化如此大的表中的查询?当表的大小较小(〜1亿行)时,查询将始终完成。在这种情况下应该怎么办?
答案 0 :(得分:1)
如果timestamp
的数据类型为(time::timestamp)
或在CREATE TABLE
上创建了索引,则查询应像闪电一样快。
请显示CREATE INDEX
和EXPLAIN
语句,以及查询的class A {
public:
A(Data data) : handle(aquire_resource(data)) {}
A(A &&temp) : handle(temp.handle) { temp.handle = 0; }
~A() { lib_destroy(handle); }
A &operator=(A &&temp);
private:
int handle;
};
输出,以获取更多详细信息。
答案 1 :(得分:0)
“未完成的查询”通常表示它进行磁盘交换。特别是当您提到一个事实时,它有100M行就可以完成。那是因为1亿行的索引仍然适合您的内存。但是索引不是这个大小的两倍。
在数据库中,Limit不会帮到您,因为数据库可能会决定首先读取索引,而这正是杀死它的原因。
您可以尝试增加可用内存,但是分区实际上是此处的最佳解决方案。
分区意味着较小的表。较小的表意味着较小的索引。较小的索引有更大的机会适合您的内存。