2017-12-27 508 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