我有一个大的Postgres表(150gb +),它存储两个变量val1和val2之间的大相关矩阵。例如:
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)
我不确定如何加快查询速度。
在执行导致超时的任何其他操作之前,您可能需要清理过时的缓存数据。
第一种:
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);