データ指向とは、ディスク内やメモリ内などの線形メモリモデルで表形式データがどのように表現されるかを指します。最も一般的な2つの表現は、列指向(列形式)と行指向(行形式)です。[1] [2]
データ指向の選択は、データベース、クエリエンジン、数値シミュレーションにおけるトレードオフであり、アーキテクチャ上の決定です。 [1] これらのトレードオフの結果、行指向形式はオンライントランザクション処理(OLTP)でより一般的に使用され、列指向形式はオンライン分析処理(OLAP)でより一般的に使用されます。[2]
列指向形式の例としては、Apache ORC [3] 、Apache Parquet [ 4] 、Apache Arrow [5] 、BigQuery、Amazon Redshift、Snowflakeで使用される形式などがあります。行指向形式の代表的な例としては、CSV、ほとんどのリレーショナルデータベースで使用される形式、 Apache Sparkのインメモリ形式、Apache Avro [6]などがあります。
説明
表形式のデータは本質的に2次元であり、データは行と列で表されます。しかし、現代のオペレーティングシステムは、ディスク内とメモリ内の両方で、データを線形メモリモデルで論理的に表します。 [7] [8] [9] したがって、線形メモリモデルのテーブルでは、2次元の項目を1次元空間に投影する必要があります。データの方向とは、この投影で行われる決定を指します。方向の選択肢には、行方向と列方向の2つがあります。[1] [2]
行指向
行指向では、表の要素は
次のように線形に格納されます
つまり、テーブルの各行は次々に配置されます。この方向では、同じ行の値は空間的に近くなります (例: アドレス指定可能な空間内の類似のアドレス)。
例
- CSVファイル
- Postgres のディスク内およびメモリ内フォーマット
- Apache Sparkインメモリ形式
- アパッチアブロ
列指向
列指向では、表の要素は
次のように線形に格納されます
つまり、テーブルの各列は次々に配置されます。この配置では、同じ列の値は空間的に近くなります (例: アドレス指定可能な空間内の同様のアドレス)。
例
詳細な例については、列指向 DBMS のリストを参照してください。
トレード・オフ
データの方向性は、パフォーマンスとストレージの重要なトレードオフをもたらすため、データを扱うシステムにとって重要なアーキテクチャ上の決定です。[8] 以下は、このトレードオフの選択された側面です。
ランダムアクセス
行指向は行の高速ランダムアクセスから恩恵を受けます。列指向は列の高速ランダムアクセスから恩恵を受けます。どちらの場合も、データにアクセスする際のページミスやキャッシュミスが少なくなるという結果です。[8]
入れる
行指向では、新しい行を高速に挿入できるという利点があります。列指向では、新しい列を高速に挿入できるという利点があります。
この次元は、行指向形式がオンライントランザクション処理(OLTP)でより一般的に使用される重要な理由であり、列指向形式と比較してトランザクションが高速化されるためです。[2]
条件付きアクセス
行指向はフィルターによる高速アクセスの恩恵を受ける。列指向は投影による高速アクセスの恩恵を受ける。[4] [3]
コンピューティングパフォーマンス
列指向は高速な分析操作の恩恵を受けます。これはSIMD命令を活用できる結果です。[5]
非圧縮サイズ
列指向は、圧縮されていないサイズが小さいという利点があります。これは、この指向が特定のデータ型を専用のエンコーディングで表現する可能性を提供していることによる結果です。[4] [3]
たとえば、ブール列を持つ 128 行のテーブルでは、行指向形式では 128 バイト (ブール値ごとに 1 バイト) が必要ですが、列指向形式 (ビットマップ経由) では 128 ビット (16 バイト) が必要です。別の例としては、ランレングス エンコーディングを使用して列をエンコードする方法があります。
圧縮サイズ
列指向は圧縮サイズが小さいという利点があります。これは、複数の行内よりも列内の均一性が高いためです。[4] [3]
変換と交換
どちらの方向でも同じデータを表すため、計算コストを犠牲にして行指向データセットを列指向データセットに変換したり、その逆を行ったりすることが可能です。特に、高度なクエリエンジンは、それぞれの方向の利点を活用し、実行の一環として一方の方向からもう一方の方向に変換することがよくあります。たとえば、Apache Sparkクエリでは 、
- Apache Parquetからデータを読み取る(列指向)
- Sparkの内部メモリ形式(行指向)にロードする
- 特定の計算(列指向)のためにApache Arrowに変換する
- ストリーミング用にApache Avroに書き込む(行指向)
参考文献
- ^ abc Abadi, Daniel J.; Madden, Samuel R.; Hachem, Nabil (2008). 「列ストアと行ストア: 実際のところ、どれほど異なるのか?」2008 ACM SIGMOD 国際データ管理会議議事録。pp. 967–980。doi : 10.1145 /1376616.1376712。ISBN 978-1-60558-102-6。
- ^ abcd Funke, Florian; Kemper, Alfons; Neumann, Thomas (2012). 「ハイブリッド OLTP および OLAP データベースにおけるトランザクション データの圧縮」。VLDB基金の議事録。5 (11): 1424–1435。doi : 10.14778 /2350229.2350258。
- ^ abcd "Apache ORC" . 2024年5月21日閲覧。
- ^ abcd "Apache Parquet" . 2024年5月21日閲覧。
- ^ ab "Apache Arrow" . 2024年5月21日閲覧。
- ^ 「Apache Avro」 。 2024年5月21日閲覧。
- ^ Richard, Golden G.; Case, Andrew (2014). 「スワップの代わりに: Mac OS X および Linux の圧縮 RAM を分析する」Digital Investigation . 11 : S3–S12. doi : 10.1016/j.diin.2014.05.011 .
- ^ abc M. Frans Kaashoek、Jerome H. Saltzer (2009)。コンピュータシステム設計の原則。Morgan Kaufmann。ISBN 978-0-12-374957-4。
- ^ 「第4章 プロセスアドレス空間 (Linuxカーネルドキュメント)」 。 2024年5月21日閲覧。
