2017-04-24 26 views
0

我正在開發使用multicorn的外部數據包裝的集合,我遇到了批處理數據的問題。Postgres中的FDW:外部請求的批處理ID?

所以,我有兩個外國表,searchdata,每個表都由我寫的外部數據包裝支持。

我需要做一個基本的加入對這些表:

SELECT data.* 
FROM search, data 
WHERE search.data_id = data.id 
AND search.term = 'search for this pls' 

這工作,但有一個順利的data外籍家政工人能夠批量查詢服務器。如果search表爲給定的搜索返回5個ID,則對於每個ID都會執行一次data fdw。支持data fdw的API能夠在一個請求中處理多個ID。

以下工作:

SELECT data.* 
FROM data 
WHERE id in ('2244', '31895') 

在這種情況下data FDW同時接收的ID的陣列,並且是能夠執行一個請求。

有什麼辦法可以讓聯合工作在data fdw有機會爲請求批量ID?

謝謝!

+0

什麼是您的PostgreSQL版本? –

+0

9.6.2,使用postgres 9.6 docker容器 – MatthewGriffith

+0

'search'和'data'是外部表,而不是FDW本身。我不確定我是否完全理解:您是在開發一些實際的FDW(並希望將它們寫入更好的表現),還是僅僅使用一些(並且想要微調您的查詢)? – pozs

回答

0

你應該看看EXPLAIN輸出爲您查詢,然後你可能會看到PostgreSQL的正在執行嵌套循環連接,也就是說,它會掃描search匹配行,併爲每個結果行掃描data爲匹配行。

PostgreSQL有其他連接策略就像散列連接,但它必須讀整個data表,這可能不是一個雙贏。 您可能需要將enable_nestloop設置爲off並測試查詢性能。如果這是一項改進,則可能需要調整data上的外部表掃描的成本值,以反映啓動成本爲的高「,以便規劃人員更不願意選擇嵌套循環聯接。

有沒有這樣的加入策略,你建議–,雖然它可能是一個贏得FDW加入,它不提供常規連接的優勢。因此,如果您設想的連接策略確實是最優連接策略,那麼您必須首先從search中獲取data_id,構建data的查詢並在應用程序中實施連接。

+0

謝謝!它肯定是使用嵌套循環,我已經調整了成本,以避免「讀整個表」的事情,這不幸的是不適用於這種情況。很高興知道沒有這樣的連接策略(很容易看出爲什麼它對其他情況沒有意義)。 – MatthewGriffith