カラム型ストレージは、同じフィールドの値をまとめて保持することで、分析クエリが関係のないデータを読み取らずに済むようにし、家庭内センサーの分析を高速化します。
スマートホームの履歴テーブルには、数百万件の観測データにわたって、タイムスタンプ、デバイスID、部屋、温度、湿度、電力、動作状態、バッテリー残量、品質フラグ、メタデータなどが含まれることがあります。履歴に関する多くの問いでは、そのうち数個のフィールドだけを使って多数の行を集計します。これは、完全な現在レコードを繰り返し取得するアプリケーションとはほぼ正反対です。カラム型レイアウトは、読み取る必要のあるデータと、類似した値のバッチをCPUへ届ける方法の両方を変えることで、このスキャンと集計の処理経路を最適化します。
カラムレイアウトは、分析クエリが実際に必要とするフィールドを分離する
行指向のレコードでは、1件の観測データに含まれるすべてのフィールドをまとめて保持します。これは、アプリケーションがその観測データ全体を必要とする場合に便利です。一方、カラム指向の表現ではフィールドごとに値をまとめるため、6か月分の温度を調べるクエリは、ファームウェア文字列やバッテリーデータ、関係のないデバイス状態を同じスキャンに持ち込まず、タイムスタンプ、部屋、温度に集中できます。
Apache Parquetは、大量データを効率的に保存・取得するために設計されたカラム指向データ形式です。この物理的な分離が、同じ論理テーブルに対する完全な行スキャンよりも、狭い範囲の分析クエリで移動するデータ量を減らせる最初の理由です。
レコードの幅が広く、クエリが選択的であるほど、この利点は大きくなります。家庭のエネルギーレポートでは、取り込みスキーマにダッシュボードやデバイス管理に必要な多数の追加フィールドが含まれていても、タイムスタンプ、ワット数、デバイスIDだけを参照することがあります。
射影プッシュダウンとフィルタープッシュダウンが不要なデータのスキャンを防ぐ
カラムレイアウトによって未使用のフィールドをスキップできるようになりますが、ストレージ上の節約を実際のI/O削減につなげるには、クエリエンジンがその情報をファイルリーダーまでプッシュダウンしなければなりません。最初にすべてのカラムを読み込み、後から破棄するのであれば、物理形式の利点を十分に活かせていません。
DuckDBはParquetの読み取り時に射影プッシュダウンとフィルタープッシュダウンを適用できます。そのため、必要なカラムだけを読み取り、フィルターによってファイルの一部をスキップできます。たとえば、1つの部屋の平均湿度を求めるクエリでは、完全な実行に入る前に、フィールドだけでなく、メタデータが許す範囲で関連する行範囲も絞り込めます。
ローカル分析サービスでは、これによりディスク読み取り、展開処理、メモリトラフィック、オペレーター間で渡される中間データの量を削減できます。要求されたフィールドが保存スキーマのごく一部であり、長時間にわたるスキャンを行う場合に、効果は最大になります。
プッシュダウンは、すべてのパイプラインで自動的に行われるわけではありません。データを不透明な変換で包んだり、述語をストレージ層に公開できないリーダーを使用したりすると、ファイル形式が本来必要とする以上のマテリアライズが強制されることがあります。
類似した値をまとめて保存すると、エンコーダーと圧縮処理の局所性が高まる
センサーのカラムには、繰り返しや緩やかな変化を示す値のパターンがよく見られます。部屋名は繰り返し現れ、ブール状態は長時間変化せず、タイムスタンプは単調に進み、温度は狭い数値範囲に収まります。それぞれの種類の値をまとめることで、すべての観測データの全フィールドを交互に並べるよりも、エンコーダーにとって規則性の高いストリームになります。
Parquetは、エンコードされたデータページにカラムページ圧縮を適用できます。これにより、各カラムチャンクは値のエンコード後に圧縮コーデックを使用できます。圧縮率が高まると、家庭内サーバーが保持し、履歴分析の際に読み取る必要のあるバイト数を減らせます。
圧縮率はワークロードに依存し、「カラム型」という言葉だけで保証されるものではありません。カーディナリティの高い暗号化ペイロードや、すでに圧縮されたバイナリ値ではほとんど改善しない場合があります。一方、繰り返し現れるラベルや構造化された数値系列では、通常、より多くの冗長性を活用できます。
行グループのメタデータによって、条件に一致しない範囲をリーダーがスキップできる
履歴クエリには、特定の日付範囲、デバイスクラス、しきい値を超える測定値など、選択性の高い条件が含まれることがよくあります。ファイルレベルまたは行グループのメタデータによって、ある領域が述語条件を満たせないと証明できるなら、その領域を読み取ってデコードするのは無駄な処理です。
DuckDBは、フィルタープッシュダウン中にParquetの最小値・最大値メタデータをゾーンマップベースのファイルスキップに利用できます。またParquetでは、カラムチャンク内に値が存在する可能性を判断するのに役立つ、オプションのブルームフィルターも定義されています。これらの構造は、読み込んだ後に一致する行の計算を低コストにするのではなく、明らかに無関係な範囲を読み飛ばすことでクエリを高速化します。
データの並び順は、この枝刈りの効果に影響します。時間、部屋、デバイスなどでおおまかにグループ化されたファイルは、ランダムに混在したデータよりもメタデータの範囲を狭くできます。そのため、適切な書き込みレイアウトによって、カラム型ストレージの利点をさらに高められます。
メタデータによるスキップは、構造によって確率的または保守的に行われ、誤検出によって余分な読み取りが発生することもあります。重要なのは、正しい結果に一致するデータを含む可能性のある範囲を、枝刈りによって破棄してはならないという保証です。
カラム型バッチはベクトル化されたCPU実行と相性がよい
選択したカラムがメモリ上に読み込まれると、分析オペレーターは多数の値に対して同じ計算を繰り返し適用します。比較、合計、平均、グループ化キー、変換などがその例です。値が連続していれば、CPUキャッシュに適しており、複数の値を1回の操作で処理する命令も利用しやすくなります。
Apache Arrowは、局所性を高め、SIMD対応プロセッサーによるベクトル化計算を可能にするカラム型メモリレイアウトを説明しています。そのため、ローカルクエリエンジンは、異なる種類のフィールドを含む完全なレコードを1行ずつ繰り返し展開するのではなく、温度や電力の値をバッチ単位で処理できます。
この利点は、ディスク上の圧縮だけに関するものではなく、分析の実行経路にも関係します。高速なSSDであっても、CPUが直ちに無視するフィールドを送り込むために不要な帯域幅を消費することがあります。一方、カラム型パイプラインでは、演算が始まる前にそのデータ移動を削減できます。
カラム型ストレージは、頻繁に変化する現在状態より履歴スキャンに適している
広範囲のスキャンに効率的な同じレイアウトが、頻繁なポイント更新、少量のトランザクション、1件の完全なデバイス状態の取得にも最適とは限りません。そのため、ホームオートメーションの制御と長期分析では、同じセンサーを扱う場合でも、異なるストレージ経路が有効になることがあります。
Arrowは、強い分析時の局所性と引き換えに変更操作のコストが高くなることを明示しています。これは、より広い境界を示すものです。カラム型システムは多数の値をまとめてスキャンするときに力を発揮しますが、小さなレコードを継続的に書き換える処理では、別の構造が適している場合があります。
実用的なホームスタックでは、現在のデバイス状態を行指向または状態指向のデータベースに保持し、履歴観測データを定期的にカラム型ファイルへ書き出して分析できます。ZimaSpaceが制御とローカル分析を分離しているのも、同じアーキテクチャ上の考え方を反映しています。ライブイベントにすぐ反応する必要がある経路は、数か月分の振り返り分析に使う物理データレイアウトを共有する必要がありません。
したがって、重要なのはカラム型ストレージが普遍的に高速かどうかではありません。支配的なワークロードが、多数の履歴行にわたって一部のフィールドをスキャンするかどうかが重要です。そのアクセスパターンこそが、カラムの分離をI/Oの削減と、より効率的なバッチ処理へとつなげるからです。
テック&AIハブ
もっと読む

Plexの状態とは何か、どの部分を永続化する必要があるのか?
永続的なPlexの状態情報とは、再起動や再構築後もサーバー環境を維持する情報を指します。メディアデータと一時的なトランスコードデータは、それぞれ別の役割を担います。

Plexはローカルセッションとリモートセッションで認証をどのように処理しますか?
Plexの認証はサーバーとアカウントの識別から始まり、その後、ローカルまたはリモートのネットワーク経路によって到達可能性と安全な接続の動作が決まります。

ライブラリデータが増えると、Plexの検索が遅くなるのはなぜですか?
ライブラリの増加だけが原因とは限りません。データベースのサイズを問題視する前に、クエリの形状、インデックス、キャッシュの状態、ストレージのレイテンシ、書き込みアクティビティを確認してください。

