以下は、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;
すばらしいアプローチ。 DBlinkの実装がなければ、すべてのカウントジョブが完了した後にコミットするように、table_countsを動的にクエリできないということですか? – Sigularity
私の外部アプリケーションは、10秒ごとにtable_countsテーブルを照会できたので、DBlinkを実装する必要はありませんか? – Sigularity
私はこの機能で「自律的なトランザクション」について質問しているかもしれません。関数が動作している間はテーブルを照会できません。 – Sigularity