1. ホーム
  2. データベース
  3. ポストグレスキュー

Postgresql データベース timescaledb timescaledb 問題 大容量データテーブルをスーパーテーブルに変換すること

2022-01-10 03:14:08

前書き

ここ数日、timescaledbライブラリのテーブルの一部がsupertablesでないことが判明し、ライブラリを構築する際に変更していなかったようで、挿入やクエリの効率に影響が出ています。
業務上の都合により、内容の一部を非公開とさせていただきます。

I 新しいテーブルを作成する

まず、timescaledbライブラリでsupertableを作成するには、データのないテーブルでなければならないので
そこで、最初のステップは、元のテーブルと全く同じテーブルを作成することです(テーブル名の後に_csが付きます) テーブル構築文をコピーするか、ツールで直接テーブル構造をコピーすることができます

2 新しいテーブルをsupertableに変更する

新しいテーブルを7日パーティションでスーパーテーブルに変更する

--I am partitioning on a 7-day basis
SELECT create_hypertable('table_name_cs', 'alarm_time', chunk_time_interval => INTERVAL '7 day');
-- Add an index
CREATE INDEX "table_name_cs_create_time_idx" ON "hrmw". "table_name_cs" USING btree (
 "create_time" "code". "column_name" DESC NULLS FIRST
);

III データを挿入する

1. データ量が少ない場合は直接挿入できます

INSERT into table_cs SELECT * from table_name;

2. データ量が多い場合、1日ずつ、1ヶ月ずつ、数ヶ月ずつ挿入することができます。

INSERT into table_cs SELECT * from table_name where alarm_time >= '2020-9-1';
INSERT into table_name_cs SELECT * from table_name where alarm_time >= '2020-10-1' and alarm_time < '2020-11-1' ;

3. 関数(ストアドプロシージャ)の使用

テーブルのデータ量が大きすぎるため、一日一回の挿入は、ストアドプロシージャ(Postgresqlのデータベースは関数と呼ばれる)を使用することができます。

以下は、私が書いた関数です。を参考にしてください。

CREATE 
	OR REPLACE PROCEDURE "hrmw". "sp_into_table_name_pt" ( ) AS $BODY$ BEGIN
	-- Generally build functions by table name
	DECLARE -- I declare a bit too many variables, so let's go by the actual ones
		target_text TEXT;
	sqltext TEXT;
	sqltext1 TEXT;
	sqltext2 TEXT;
	rd record;
	nloop INT;
	isexist TEXT;
	datestr TEXT;
	begindate TEXT;
	n INT;
	BEGIN
			--query the time of the earliest day
			sqltext := 'select to_char(min(alarm_time),''yyyy-mm-dd'') datestr from tb_hrmw_moni_target';    
		EXECUTE sqltext INTO begindate;
		n := date_part( 'day', now( ) - begindate :: DATE );
--enddate:=(to_char(now(),'yyyy-mm-dd'))::text;
		FOR nloop IN 0..n
		LOOP
		datestr := ( begindate :: DATE + nloop ) :: TEXT;
		sqltext2 := '
		insert into table name_cs 
		select
		column_name1,
		code,
		column_name2,
		alarm_time,
		column_name3,
		column_name4
		from table name
		where alarm_time >= ''' || datestr || ' 00:00:00''
		and alarm_time <= ''' || datestr || ' 23:59:59''
		'; 
		EXECUTE sqltext2;
		COMMIT;
		
	END loop;
RETURN;

END;

END $BODY$ LANGUAGE plpgsql

IV 結果を見る

以下のパターン _timescaledb_internal はパーティションです。

この記事postgresqlデータベースtimescaledbのtimescaledbライブラリ変換大きなデータテーブルをsupertablesについてすべてです、より関連postgresqlデータベースtimescaledb timescaledbライブラリコンテンツは、スクリプト家の前の記事を検索するか、次の関連記事を閲覧し続けるあなたは、今後、よりスクリプト家をサポートします願っています!.