2017-12-27 309 views
1

我有一个大的Postgres表(150GB +),它在两个变量val1和val2之间存储一个大的相关矩阵。例如:查询一个大的Postgres相关表

val1 | val2 | distance 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    0 | 1 |  10 
    0 | 2 |  21 
    0 | 3 |  13 
    1 | 2 |  65 
    1 | 3 |  43 
    2 | 3 |  56 

对(val1,val2)是表的复合主键。我发现当我在下面运行查询时,查询在35ms以下执行。

SELECT * 
FROM sliding_window_distances 
WHERE (val1 = 10000) 

但是,当我使用val2进行搜索时,它不会执行并超时。

SELECT * 
FROM sliding_window_distances 
WHERE (val2 = 10000) 

理想我想运行下面的查询,让我对特定值的所有记录(10000在我的例子)

SELECT * 
FROM sliding_window_distances 
WHERE (val1 = 10000) 
OR (val2 = 10000) 

我不知道如何加快查询。

+0

添加额外的UNIQUE约束(val2,val1)。 (这将创建一个索引) – wildplasser

回答

1

在执行导致超时的任何其他操作之前,您可能需要清理陈旧的缓存数据。

第一式:

VACUUM ANALYZE sliding_window_distances; 

而且你应该在你的表使用二级索引。显着创建索引加速的查询操作。

要没有锁定了创建索引写入表:

CREATE INDEX CONCURRENTLY windows_dist_index ON sliding_window_distances (val2); 

您也可以定义附加UNIQUE约束象下面这样:

ALTER TABLE sliding_window_distances ADD UNIQUE (val2, val1); 

PostgreSQL Documentation on Indexes

+0

嗨GökcanD,谢谢..创建索引似乎超时...表是非常大的。 – kPow989

+0

@ kPow989是否有任何我们可以看到的错误日志?另外,请尝试“真空”解决方案。 – gokcand

+0

谢谢..组合键(val1,val2)已经是唯一的......创建索引时我只是得到一个超时值。我读过它们也可能需要几小时才能完成。 – kPow989