2016-10-10 48 views
1

如上所述herepostgres_fdw無權訪問索引。遠程查詢使用postgres_fdw執行,使用索引

解決方法是在遠程服務器上創建視圖,然後在本地視圖上創建外部表包裝。

但是如果我想將參數傳遞給我的視圖呢?通常我會創建一個function(myparam)RETURNS TABLE()。但是如何通過postgres_fdw調用它?

解決這種情況的任何想法(如果不需要,不要使用dblink)?

我有這樣的查詢到我的遠程數據庫執行:

select count(f.id_foo) 
from foo f 
where f.date < _my_date 

正如你可以看到有一個PARAM _my_date內。

所以我創建外部表my_remote_server_public.my_remote_server_public_foo和本地數據庫一樣運行:

select count(f.id_foo) 
from my_remote_server_public.my_remote_server_public_foo f 
where f.date < _my_date 

但是當我這樣做 - 它持續2-3分鐘becouse postgres_fdwfoo指標無訪問。

我想過一個遠程數據庫上創建一個功能get_foo_by_date(_my_date date),並通過postgres_fdw從當地一個稱呼它,但不知道是它甚至有可能...

UPDATE

假設我會處理作爲一個具有固定日期的外部表的普通視圖。

該視圖將返回一個來自遠程表的ID列表。

我想從遠程表中刪除列出的行並將它們歸檔到本地。

當我這樣稱呼它:

EXECUTE 
'WITH rows_to_delete 
AS (DELETE from my_remote_server_public_foo 
    WHERE id_foo 
    IN 
    (SELECT * FROM my_remote_server_public_view_of_rows_to_delete) RETURNING *) 
INSERT INTO my_local_table 
SELECT * FROM rows_to_delete'; 

它持續5分鐘...再次becouse DELETE查詢有沒有索引訪問......我需要使用dblink這裏調用一個函數嗎?任何其他解決方法?

+1

你能舉一個你想做的例子嗎? –

+0

@LaurenzAlbe問題更新 – ilovkatie

回答

1

的問題不在於postgres_fdw 「有指標」用不上,那就是聚合函數不「下推」到遠程服務器。

儘管彙總下推顯然是PostgreSQL想要添加的東西,但還沒有好的方法可以做到這一點。

最好的方法是使用dblink來滿足這樣的要求。

在PostgreSQL 9.6中,postgres_fdw中有一個新功能,您可能會濫用該功能來下推某個功能。
您必須創建一個包含該函數的擴展並將其安裝在本地和遠程數據庫上。然後,您可以將該擴展名添加到外部服務器上的extensions屬性。如果功能是IMMUTABLE,並且您在本地調用它,它將被下推到遠程服務器。
但這是醜陋的無法描述,我不會推薦它。

提出的問題爲「更新」與問題無關,應該作爲單獨的問題提出。

這裏的問題是,在PostgreSQL 9.5或更低

  • 加入外國表之間不推送到遠程端

  • 更新和刪除的行操作行,因此需要一個往返每刪除一行

兩者都使用PostgreSQL 9.6進行了改進(並非如此聚合)。