簡體   English   中英

如何在 postgresql/timescaledb 中以編程方式調用“刷新物化視圖”

[英]How can I call “Refresh Materialized View” programatically in postgresql/timescaledb

我有一個同時運行的測試套件。 在我的測試中,我有一個名為refresh_aggregrates的方法,它從根本上對我的視圖調用REFRESH MATERIALIZED VIEW

當它們並行發生時我遇到了一個問題,我收到一些奇怪的元組同時更新錯誤。

為了解決這個問題,我設想創建一個過程或一個 function ,它會獲得一個Advisory_lock ,然后調用刷新(所以調用不會自己中斷)

注意:我在 pg server 12(timescale 1.7)上:(也在 11.6、Timescale 1.6 上測試過)

但是當我嘗試這樣做時,我得到:“無法從函數執行REFRESH”。

^--- 有沒有辦法解決這個問題? 使用 sql/plpgsql?


我目前的 function...

create or replace procedure refresh_aggregates()
language plpgsql
as $$
    begin
        perform pg_advisory_lock(124);
        execute 'REFRESH MATERIALIZED VIEW daily_events_view';
        execute 'REFRESH MATERIALIZED VIEW weekly_events_view';
        execute 'REFRESH MATERIALIZED VIEW daily_customer_user_events';
        execute 'REFRESH MATERIALIZED VIEW weekly_customer_user_events';
        execute 'REFRESH MATERIALIZED VIEW daily_assessments_view';
        execute 'REFRESH MATERIALIZED VIEW weekly_assessments_view';
        execute 'REFRESH MATERIALIZED VIEW active_user_metrics_by_day';
        execute 'REFRESH MATERIALIZED VIEW wau_mau_weekly_customer_insights';
        perform pg_advisory_unlock(124);
    end;
$$;

call refresh_aggregates();

並導致...

success.public> call refresh_aggregates()
[2020-05-14 15:54:34] [25001] ERROR: REFRESH cannot be executed from a function
[2020-05-14 15:54:34] Where: SQL statement "REFRESH MATERIALIZED VIEW daily_events_view"
[2020-05-14 15:54:34] PL/pgSQL function refresh_aggregates() line 4 at EXECUTE

如果您使用 PostgreSQL 11 或 12,則可以使用存儲過程。

例如:

create or replace procedure rmv()
language plpgsql
as
$$
begin
 execute 'refresh materialized view my_mv';
end;
$$;

我還測試了以下 function:

create or replace function frmv()
returns boolean 
language plpgsql
as
$$
begin
 refresh materialized view mv;
 return true;
end;
$$;

它不會拋出任何錯誤並且可以工作:

select frmv();
 frmv 
------
 t
(1 row)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM