メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

列指向ストレージ

データベーステーブルの列指向ストレージは、必要な総ディスク I/O と、ディスクからロードする必要のあるデータ量が大幅に減少するので、分析クエリのパフォーマンスの最適化において重要な要因です。

以下の一連の図では、列指向データストレージにおいて効率性がどのように実装され、データがメモリに読み込まれるときの効率性にどのように変換されるのかについて説明します。

この最初の図では、データベーステーブルのレコードが行ごとにディスクブロックに格納される一般的な方法を示します。

標準的なリレーショナルデータベーステーブルでは、各行には 1 つのレコードのフィールド値が含まれます。行対応のデータベースストレージでは、データブロックには、行全体を構成する連続した各列の値がシーケンシャルに格納されます。ブロックサイズがレコードのサイズより小さい場合、1 レコード全体のストレージに複数のブロックが使用される場合があります。ブロックサイズがレコードのサイズより大きい場合、1 レコード全体のストレージが 1 ブロックより小さくなり、ディスク容量の使用効率が悪くなる場合があります。オンライントランザクション処理 (OLTP) アプリケーションでは、ほとんどのトランザクションに、通常は一度に 1 レコードまたは少数のレコードの、レコード全体の値の頻繁な読み取りおよび書き込みが含まれます。その結果、行対応のストレージは OLTP データベースに最適です。

次の図は、列指向ストレージにおいて、各列の値がディスクブロックにシーケンシャルに格納されることを示しています。

列指向ストレージを使用すると、各データブロックには複数の行の 1 つの列の値が格納されます。レコードがシステムに入ってくると、Amazon Redshift は各列のデータを列指向ストレージに透過的に変換します。

この単純化した例では、列指向ストレージを使用することで、行ベースのストレージと比較して 3 倍の数のレコードの列フィールド値を各データブロックに保持しています。つまり、同じ数のレコードの同じ数の列フィールド値を読み取るのに必要な I/O 操作は、行対応ストレージの 3 分の 1 です。実際には、列数と行数が非常に多いテーブルでは、ストレージ効率がいっそう向上します。

利点としては、各ブロックが同じ型のデータを保持するので、ブロックデータは列のデータ型に対して特に選択された圧縮方式を使用でき、ディスク容量と I/O がさらに減ります。データ型に基づく圧縮エンコーディングの詳細については、「圧縮エンコード」を参照してください。

ディスクでのデータ保存容量の減少は、データの取得そしてメモリへのデータの格納にも引き継がれます。多くのデータベース操作では一度に 1 つまたは少数の列にのみアクセスして処理する必要があるだけであるため、クエリに実際に必要な列のブロックだけを取得することでメモリ容量を節約できます。OLTP トランザクションでは、通常、少数のレコードの行の大部分または全部の列が関係するのに対し、データウェアハウスクエリでは、一般に、非常に多数の行のほんの数列だけが読み取られます。つまり、同じ数の行の同じ数の列フィールド値を読み取るのに必要な I/O 操作および使用されるメモリは、行対応ブロックを処理する必要がある場合の数分の 1 です。実際には、列数と行数が非常に多いテーブルでは、効率が比例的に向上します。例えば、100 列のテーブルがあるとします。5 列を使用するクエリは、テーブルに含まれるデータの約 5 パーセントだけを読み取る必要があります。大きいデータベースの場合、この節約は数十億または数兆のレコードに対して行われます。一方、行対応のデータベースでは、必要のない 95 列も含まれるブロックを読み取ります。

通常、データベースブロックのサイズは 2~32 KB です。Amazon Redshift が使用するブロックサイズは 1 MB なので、いっそう効率的であり、クエリ実行の一部であるデータベースのロードまたは他の操作の実行に必要な I/O 要求の数はさらに減少します。