ClickHouse/docs/ja/engines/table-engines/special/buffer.md
2024-11-18 11:58:58 +09:00

8.0 KiB
Raw Blame History

slug sidebar_position sidebar_label
/ja/engines/table-engines/special/buffer 120 Buffer

Buffer テーブルエンジン

データをRAMにバッファし、定期的に別のテーブルにフラッシュして書き込みます。読み取り操作中は、データはバッファともう一方のテーブルから同時に読み取られます。

:::note Buffer テーブルエンジンの推奨される代替手段は、非同期インサートを有効にすることです。 :::

Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes [,flush_time [,flush_rows [,flush_bytes]]])

エンジンパラメータ:

database

database - データベース名。currentDatabase() または文字列を返す他の定数式を使用できます。

table

table - データを書き込むテーブル。

num_layers

num_layers - パラレル層。物理的には、テーブルは独立したバッファの num_layers によって表されます。

min_time, max_time, min_rows, max_rows, min_bytes, and max_bytes

バッファからデータをフラッシュする条件。

オプションのエンジンパラメータ:

flush_time, flush_rows, and flush_bytes

バックグラウンドでバッファからデータをフラッシュする条件(省略またはゼロは flush* パラメータがないことを意味します)。

バッファからデータがフラッシュされ、すべての min* 条件または少なくとも1つの max* 条件が満たされると、宛先テーブルに書き込まれます。

また、少なくとも1つの flush* 条件が満たされると、バックグラウンドでフラッシュが開始されます。これは max* とは異なり、flush* により、INSERT クエリへの遅延を避けてバッファテーブルへのバックグラウンドフラッシュを個別に設定できます。

min_time, max_time, and flush_time

バッファへの最初の書き込みからの秒数条件。

min_rows, max_rows, and flush_rows

バッファ内の行数条件。

min_bytes, max_bytes, and flush_bytes

バッファ内のバイト数条件。

書き込み操作中、データは1つ以上のランダムなバッファに挿入されますnum_layers で設定)。または、挿入するデータ部分が大きすぎる場合(max_rows または max_bytes より大きい場合)、バッファを省略して宛先テーブルに直接書き込まれます。

データをフラッシュする条件は、それぞれの num_layers バッファに対して個別に計算されます。たとえば、num_layers = 16 および max_bytes = 100000000 の場合、最大RAM消費量は1.6 GBです。

例:

CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 1, 10, 100, 10000, 1000000, 10000000, 100000000)

merge.hits_buffer テーブルを作成し、その構造は merge.hits と同じで、Buffer エンジンを使用します。このテーブルに書き込むと、データはRAMにバッファされ、その後 merge.hits テーブルに書き込まれます。単一のバッファが作成され、データは以下の場合にフラッシュされます:

  • 最後のフラッシュから100秒が経過した場合max_time)または
  • 100万行が書き込まれた場合max_rows)または
  • 100 MBのデータが書き込まれた場合max_bytes)または
  • 10秒が経過した場合min_timeかつ10,000行min_rowsと10 MBmin_bytes)のデータが書き込まれた場合

たとえば、1行だけが書き込まれた場合であっても、100秒後には必ずフラッシュされます。しかし、多くの行が書き込まれた場合、データはより早くフラッシュされます。

サーバが停止された場合、DROP TABLE または DETACH TABLE により、バッファされたデータも宛先テーブルにフラッシュされます。

データベース名とテーブル名にシングルクォートで空文字列を設定できます。これは、宛先テーブルがないことを示します。この場合、データフラッシュ条件が満たされると、バッファは単にクリアされます。これは、メモリ内にデータのウィンドウを保持するのに役立つ場合があります。

Buffer テーブルから読み取るとき、データはバッファからと、もしあれば宛先テーブルから処理されます。 Buffer テーブルはインデックスをサポートしていないことに注意してください。つまり、バッファ内のデータは完全にスキャンされます。これにより、大規模なバッファには時間がかかる可能性があります。(サブテーブル内のデータについては、サポートするインデックスが使用されます。)

Buffer テーブルのカラムセットがサブテーブルのカラムセットと一致しない場合、両方のテーブルに存在するカラムのサブセットが挿入されます。

Buffer テーブルのカラムとサブテーブルとの間で型が一致しない場合、エラーメッセージがサーバーログに記録され、バッファがクリアされます。バッファがフラッシュされるときにサブテーブルが存在しない場合も同様です。

:::note 2021年10月26日以前のリリースで Buffer テーブルにALTERを実行すると Block structure mismatch エラーが発生します(#15117 および #30565を参照。Buffer テーブルを削除し、再作成することが唯一の選択です。ALTERをBufferテーブルに実行する前に、リリースでこのエラーが修正されていることを確認してください。 :::

サーバが異常終了すると、バッファ内のデータは失われます。

FINAL および SAMPLE は Buffer テーブルでは正しく動作しません。これらの条件は宛先テーブルには渡されますが、バッファ内のデータ処理には使用されません。これらの機能が必要な場合は、Buffer テーブルは書き込み専用にし、読み取りは宛先テーブルから行うことをお勧めします。

Buffer テーブルにデータを追加すると、一部のバッファはロックされます。これにより、同時にテーブルから読み取り操作が行われている場合に遅延が発生します。

Buffer テーブルに挿入されたデータは、サブテーブルに異なる順番で異なるブロックに収まる可能性があります。このため、Buffer テーブルは正しく CollapsingMergeTree に書き込むには困難です。問題を避けるには、num_layers を1に設定することができます。

宛先テーブルがレプリケートされている場合、Buffer テーブルに書き込むとレプリケートテーブルの予期した特徴が失われます。行の順番やデータ部分のサイズがランダムに変わるため、データの重複除去が動作しなくなり、レプリケートテーブルへの確実な「正確に一度」書き込みができなくなります。

これらの欠点から、Buffer テーブルを使用するのは稀なケースに限定することをお勧めします。

Buffer テーブルは、短時間に多くのサーバから非常に多くのINSERTを受信し、データを挿入前にバッファできず、INSERTが十分高速に実行できない場合に使用されます。

Buffer テーブルでも、1行ずつデータを挿入することは意味がありません。これにより、1秒あたり数千行の速度しか出せませんが、より大きなデータブロックを挿入することで、1秒あたり100万行以上の速度が期待できます。