查询大的索引表超时

时间:2019-01-16 20:00:52

标签: postgresql database-performance database-indexes

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

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

发送到表的查询已失败(尽管使用了PgAdmin中的“查看前100行”功能),该查询不断运行。甚至是简单的select *查询。

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

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

这样的查询挂起了-如何优化如此大的表中的查询?当表的大小较小(〜1亿行)时,查询将始终完成。在这种情况下应该怎么办?

2 个答案:

答案 0 :(得分:1)

如果timestamp的数据类型为(time::timestamp)或在CREATE TABLE上创建了索引,则查询应像闪电一样快。

请显示CREATE INDEXEXPLAIN语句,以及查询的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不会帮到您,因为数据库可能会决定首先读取索引,而这正是杀死它的原因。

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

分区意味着较小的表。较小的表意味着较小的索引。较小的索引有更大的机会适合您的内存。