列指向ストレージ - Amazon Redshift

列指向ストレージ

データベーステーブルの列指向ストレージは、ディスク全体の必要な I/O を大幅に減らすため、分析クエリのパフォーマンスの最適化の重要な要因となっています。これにより、ディスクからロードする必要のあるデータの量が減ります。

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

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

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

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

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

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

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

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

データベースでの一般的なブロックサイズは、2 KB~32 KB の範囲です。Amazon Redshift では、より効率的な 1 MB のブロックサイズを使用しているため、クエリの実行に伴うデータベースの負荷や、他の操作の実行に必要な I/O 要求の数はさらに減少しています。