メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012年12月1日)

ソート形式の比較

このセクションでは、単一列ソートキー、複合ソートキー、およびインターリーブソートキーを異なる形式のクエリで使用した場合のパフォーマンスの違いを比較します。

この例では、CUSTOMER および LINEORDER テーブルのデータを使用して、CUST_SALES という名前の非正規化されたテーブルを作成します。CUSTOMER および LINEORDER は SSB データセットの一部であり、チュートリアル: テーブル設計のチューニング で使用されています。

新しく作成した CUST_SALES テーブルには 480,000,000 万行あります。Amazon Redshift の基準では大きくありませんが、パフォーマンスの差異を示すには十分です。テーブルが大きいほど、特にインターリーブソートで、差異も大きくなる傾向にあります。

3 つのソート方法を比較するには、以下の手順を実行します。

  1. SSB データセットを作成します。

  2. CUST_SALES_DATE テーブルを作成します。

  3. ソート形式を比較する 3 つのテーブルを作成します。

  4. クエリを実行し、結果を比較します。

SSB データセットの作成

まだチュートリアルを実行していない場合は、テーブル設計のチューニングチュートリアルの「ステップ 1: テストデータセットを作成する」の手順に従って SSB データセットでテーブルを作成し、データをロードします。データのロードは約 10~15 分かかります。

テーブル設計のチューニングチュートリアルのサンプルは、4 つのノードクラスターを使用します。この例の比較では、2 ノードのクラスターを使用します。結果はクラスターの設定に応じて変わります。

CUST_SALES_DATE テーブルの作成

CUST_SALES_DATE のテーブルは、お客様および収益に関するデータを含む非正規化されたテーブルです。CUST_SALES_DATE テーブルを作成するには、次のステートメントを実行します。

Copy
create table cust_sales_date as (select c_custkey, c_nation, c_region, c_mktsegment, d_date::date, lo_revenue from customer, lineorder, dwdate where lo_custkey = c_custkey and lo_orderdate = dwdate.d_datekey and lo_revenue > 0);

次のクエリでは、CUST_SALES の行数を表示しています。

Copy
select count(*) from cust_sales_date; count ----------- 480027069 (1 row)

CUST_SALES テーブルの最初の行を表示するには、以下のクエリを実行します。

Copy
select * from cust_sales_date limit 1; c_custkey | c_nation | c_region | c_mktsegment | d_date | lo_revenue ----------+----------+----------+--------------+------------+----------- 1 | MOROCCO | AFRICA | BUILDING | 1994-10-28 | 1924330

ソート形式を比較するテーブルの作成

ソート形式を比較するために、3 つのテーブルを作成します。1 つ目は単一列のソートキーを使用します。2 つ目は複合ソートキーを使用し、3 つ目はインターリーブソートキーを使用します。単一列ソートには c_custkey 列が使用されます。複合ソートおよびインターリーブソートは、どちらも c_custkeyc_nation および c_region 列を使用します。

比較用のテーブルを作成するには、次の CREATE TABLE ステートメントを実行します。

Copy
create table cust_sales_date_single sortkey (c_custkey) as select * from cust_sales_date; create table cust_sales_date_compound compound sortkey (c_custkey, c_region, c_mktsegment, d_date) as select * from cust_sales_date; create table cust_sales_date_interleaved interleaved sortkey (c_custkey, c_region, c_mktsegment, d_date) as select * from cust_sales_date;

クエリの実行と結果の比較

各テーブルに対して同じクエリを実行して、各テーブルの実行時間を比較します。コンパイル時間による違いを排除するために、各クエリを 2 回実行し、2 番目の時間を記録します。

  1. 各テーブルのソートキーの最初の列である c_custkey 列を制限するクエリをテストします。次のクエリを実行します。

    Copy
    -- Query 1 select max(lo_revenue), min(lo_revenue) from cust_sales_date_single where c_custkey < 100000; select max(lo_revenue), min(lo_revenue) from cust_sales_date_compound where c_custkey < 100000; select max(lo_revenue), min(lo_revenue) from cust_sales_date_interleaved where c_custkey < 100000;
  2. 複合キーおよびインターリーブキーのソートキーの 2 番目の列である c_region 列を制限するクエリをテストします。次のクエリを実行します。

    Copy
    -- Query 2 select max(lo_revenue), min(lo_revenue) from cust_sales_date_single where c_region = 'ASIA' and c_mktsegment = 'FURNITURE'; select max(lo_revenue), min(lo_revenue) from cust_sales_date_compound where c_region = 'ASIA' and c_mktsegment = 'FURNITURE'; select max(lo_revenue), min(lo_revenue) from cust_sales_date_interleaved where c_region = 'ASIA' and c_mktsegment = 'FURNITURE';
  3. c_region 列と c_mktsegment 列の両方を制限するクエリをテストします。次のクエリを実行します。

    Copy
    -- Query 3 select max(lo_revenue), min(lo_revenue) from cust_sales_date_single where d_date between '01/01/1996' and '01/14/1996' and c_mktsegment = 'FURNITURE' and c_region = 'ASIA'; select max(lo_revenue), min(lo_revenue) from cust_sales_date_compound where d_date between '01/01/1996' and '01/14/1996' and c_mktsegment = 'FURNITURE' and c_region = 'ASIA'; select max(lo_revenue), min(lo_revenue) from cust_sales_date_interleaved where d_date between '01/01/1996' and '01/14/1996' and c_mktsegment = 'FURNITURE' and c_region = 'ASIA';
  4. 結果を評価します。

    次の表に、3 つのソート形式のパフォーマンスの要約を示します。

    重要

    この結果は、これらの例で使用した 2 ノードクラスターの相対的なパフォーマンスを示します。結果は、ノードタイプ、ノード数、リソースに対しての同時操作など、複数の要因によって異なります。

    ソート形式 Query 1 Query 2 Query 3
    単一 0.25 s 18.37 s 30.04 s
    複合 0.27 s 18.24 s 30.14 s
    インターリーブ 0.94 s 1.46 s 0.80 s

    クエリ 1 では、3 つのソート形式の結果はすべて似通っています。これは WHERE 句が最初の列のみで制限しているためです。インターリーブテーブルにアクセスするオーバーヘッドコストは小さいものです。

    クエリ 2 では、単一列のソートキーに利点はありません。その列が WHERE 句で使用されないためです。複合キーでパフォーマンスの向上は見られません。クエリがソートキーの 2 番目と 3 番目の列の使用を制限されたためです。インターリーブテーブルに対するクエリは最高のパフォーマンスを示しています。インターリーブソートはソートキーのセカンダリ列で効果的にフィルタリングできるためです。

    クエリ 3 では、インターリーブソートは他の形式よりも格段に高速です。d_datec_mktsegment、および c_region 列の組み合わせでフィルタリングできるためです。

この例は、Amazon Redshift の基準では比較的小さな 480,000,000 行のテーブルを使用しています。何十億以上の列が含まれるより大きなテーブルでは、インターリーブソートで、特定のタイプのクエリのパフォーマンスが 10 倍以上向上します。