.../articles/

TimesclaeDBのデータ圧縮に関して

TimescaleDBはデータベース内の一部のテーブルを時系列データとして扱えるPostgreSQLの拡張です。PostgreSQLの機能拡張なので非常に手軽に導入できます。今回はこのTimesaceDBの圧縮について調べたので備忘録として書き綴りました。

環境

PotgreSQL 13
TimescaleDB 2.4.2

対象のテーブルの圧縮を有効にする

まずはじめにhypertable化している対象のテーブルの圧縮を有効化します。ちなみに、hypertable可というのは、PostgreSQLのテーブルを時系列テーブルとして扱う場合にhypertableという形式に変換して利用します。圧縮の有効化は ALTER TABLE で行います。

ALTER TABLE iot_data SET (timescaledb.compress,timescaledb.compress_segmentby = 'sensor_id');
> Query 1 OK: ALTER TABLE

手動での圧縮

圧縮するチャンクの絞り込み

次に、show_chunks()使い、圧縮対象のチャンクを絞り込みを行います。チャンクに関して詳しく説明はしませんが、時系列データを詰め込む箱のようなもので1hypertalbeにつき複数存在します。クエリを実行すると以下のようにチャンク名が返るので控えてしてください。

-- 14日以前のデータが入ったチャンク名を取得する
SELECT show_chunks('iot_data', older_than => INTERVAL '14 days');
> _timescaledb_internal._hyper_19_210_chunk
> _timescaledb_internal._hyper_19_211_chunk
> ...
> ...

圧縮クエリの実行

前工程で控えたチャンク名を元に以下のクエリを発行すると圧縮が行われます。ある程度データが溜まっている状態で圧縮する場合、時間がかかるので気長に待ちましょう。圧縮が行われたかどうかは chunk_compression_stats() で確認できます。

-- 圧縮を行うクエリ
SELECT compress_chunk('_timescaledb_internal._hyper_19_210_chunk');

-- チャンクが圧縮されているか確認するクエリ
SELECT * FROM chunk_compression_stats('iot_data')

ポリシーによる圧縮の自動化

ポリシーを定めて、一定時間経過したデータを自動で圧縮する機能も存在します。

-- 14日以前のデータを自動圧縮するポリシーの登録
SELECT add_compression_policy('iot_data', INTERVAL '14 days');

-- 設定された圧縮ポリシーの削除
SELECT remove_compression_policy('iot_data');

圧縮で何が変わるのか

メリット

  • ディスク容量が節約できる
    hypertable_compression_stats() で テーブル単位の圧縮情報が確認できます。手元のデータでは 73.1GB → 1.93GB のディスク容量変化を確認できた。

  • 検索の速度の向上?
    ドキュメントによるとクエリによっては速度改善が望めるとあり期待していましたが、手元で試したクエリでは、恩恵を受けることはなく、改善も劣化も見られませんでした。どのようなクエリの場合に恩恵を受けるのか知りたいところです。

デメリット

  • 更新・削除が困難
    圧縮した状態では更新と削除が実行できず、更新するためにはチャンク単位で圧縮を解除する必要があり、これには多大にコストがかかります。テストで更新クエリを投げてみましたが cannot update/delete rows from chunk "_hyper_19_210_chunk" as it is compressed となり失敗しました。

    また、追加も一部のみサポートとドキュメントにあり、テストでクエリを実行しましたが insert into a compressed chunk that has primary or unique constraint is not supported となって失敗しました。このバージョンではプライマリーキーもしくはユニークキーが設定されたテーブルは挿入もできないようです。

    このあたりは次期バージョンでできるようになっていって欲しいところです。

参考

Compression
https://docs.timescale.com/api/latest/compression/
Hypertable & Chunks
https://docs.timescale.com/api/latest/hypertable/

.../articles/

Articles

記事

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

monorepo管理しているNext.jsをAmplifyにデプロイしようとした際にいくつか躓く内容があったのでまとめておきます。

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

コロナ禍の影響により、リモートワークの導入をおこなっている制作会社も多く、実際に弊社でも導入しています。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトのデザインは、「この形式」という決まりはありません。ECサイトで売り上げを上げるなら、しっかりとしたコンセプトと、コンセプトを決定するまでのリサーチが必要です。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

新型コロナウイルス感染拡大の影響で、リモートワークが主流になり、弊社でも週のほとんどは各自宅で作業をしています。

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaを利用するWebデザイナーの助けになれると嬉しいです。使い方は本記事をご覧ください。

ECの構築方法、おすすめのECサービス。

ECの構築方法、おすすめのECサービス。

ファッションや家電、スーパーの買い物でさえもECサイトを利用することが当たり前になりました。加えて新型コロナウイルスの影響もあり、弊社にも「どんなプラットフォームを利用したら良いか」「どれくらいコストがかかるのか」などECに関するさまざまなご相談を頂きます。

FastAPIのスキーマクラスをOpenAPIから生成する方法

FastAPIのスキーマクラスをOpenAPIから生成する方法

PythonでAPIを構築する要件があり、フレームワークに比較的モダンなFastAPIを採用しました。FastAPIはバックエンドの開発を行えば自動でOepnApi定義を生成する機能が備わっていますが、今回はこれを使わず、事前に用意したOepnApi定義からFastAPIで利用するスキーマクラスを生成する方法を紹介します。

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel + MySQLで全文検索を実装する

GiFT1号目新卒デザイナーの2021年振り返り

GiFT1号目新卒デザイナーの2021年振り返り

いつの間に、年末ですね。入社してもう、9ヶ月も立っていたようです。2021年の振り返りを記事にしました。

TimesclaeDBのデータ圧縮に関して

TimesclaeDBのデータ圧縮に関して

TimescaleDBはデータベース内の一部のテーブルを時系列データとして扱えるPostgreSQLの拡張です。PostgreSQLの機能拡張なので非常に手軽に導入できます。今回はこのTimesaceDBの圧縮について調べたので備忘録として書き綴りました。

すべての記事

お問い合わせ