2016-05-17 67 views
3

我通過一組FDW表從鍵/值存儲中公開數據。這一切都工作正常,除了Postgres經常被迫掃描整個表,當我只需要一個小子集。在外部數據包裝中訪問WHERE子句條件

例如:

SELECT * FROM人WHERE爲person_id = 'WLW001';

除非我將LIMIT 1添加到最後,它將搜索所有人行。

在我的鍵/值存儲中,我只需要將「WLW001」作爲鍵的一部分直接找到正確的記錄。

換句話說,我需要找到WHERE子句的條件來優化我的查詢到鍵/值存儲。我瀏覽了許多FDW和文檔的示例,並且找不到描述使用RelOptInfo或scan_clauses列表或幫助程序函數來獲取此信息的任何內容。

此外,如果SELECT語句包含參數標記,則看起來我需要替換標記的值。我在哪裏可以找到價值?

+0

您使用哪個鍵/值存儲數據包裝?一些數據包裝器可以在遠程服務器上處理WHERE條件以減少發送的行數。如果它是文件存儲的fdw,那麼它可能會檢索整個文件並完全掃描它;另一種方法是創建自己的存儲過程,通過'plperlu'用適合您需求的邏輯來檢索數據。 –

+0

關鍵/值存儲是我們自己的,用於訪問千兆字節的數據。關鍵是多部分。所以如果我可以將WHERE條件插入密鑰中,我可以直接找到感興趣的記錄。 –

+0

數據存儲的格式是什麼?您使用哪種外部數據包裝? –

回答

0

我在名爲deparse.c的文件中找到了我需要的mysql_fdw項目(https://github.com/EnterpriseDB/mysql_fdw)。 PostgreSQL將解析一個查詢並將其轉換爲單獨的表查詢。然後它會爲每個不同的表調用FDW回調函數,每個表都有自己的一組WHERE條件。可以在PostgreSQL數據結構中遍歷一棵樹,以獲取它在該表內搜索的確切條件。