下面是檢查PostgreSQL數據庫中所有表的真實數量的一個很好的函數。我發現它here。如何更新函數中的EXECUTE格式塊的結果(PostgreSQL)
從我的本地測試看來,函數只有在完成100個表的所有計數後才返回所有結果。
我想讓它更實用。如果我們可以在表格結束後立即保存每個表格的計數結果,那麼我們可以檢查所有計數作業的進度而不是等待結束。
我想如果我可以在完成第一個表格後立即更新這個函數的結果,那對我的需求來說是非常好的。
你能告訴我如何在該函數完成第一個表的計數後將結果更新到表中嗎?
CREATE FUNCTION rowcount_all(schema_name text default 'public')
RETURNS table(table_name text, cnt bigint) as
$$
declare
table_name text;
begin
for table_name in SELECT c.relname FROM pg_class c
JOIN pg_namespace s ON (c.relnamespace=s.oid)
WHERE c.relkind = 'r' AND s.nspname=schema_name
ORDER BY c.relname
LOOP
RETURN QUERY EXECUTE format('select count(*) from %I.%I',
table_name, schema_name, table_name);
END LOOP;
end
$$ language plpgsql;
-- Query
WITH rc(schema_name,tbl) AS (
select s.n,rowcount_all(s.n) from (values ('schema1'),('schema2')) as s(n)
)
SELECT schema_name,(tbl).* FROM rc;
更新
我決定用一個shell腳本下面作爲後臺進程運行的功能。該函數將生成一個處理日誌文件,以便我可以檢查當前進程。
精彩的方法。你的意思是沒有DBlink實現,我不能動態查詢table_counts,因爲它會在所有計數作業完成後提交。 – Sigularity
我的外部應用程序可以每10秒查詢table_counts表,所以我想不需要實現DBlink? – Sigularity
我可能會問函數中的'自主事務'。功能正在工作時,我無法查詢表格。 – Sigularity