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

ソート形式の比較

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

この例では、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. Test a query that restricts on the c_custkey column, which is the first column in the sort key for each table. Execute the following queries.

    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. Test a query that restricts on the c_region column, which is the second column in the sort key for the compound and interleaved keys. Execute the following queries.

    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. Test a query that restricts on both the c_region column and the c_mktsegment column. Execute the following queries.

    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. Evaluate the results.

    The following table summarizes the performance of the three sort styles.

    重要

    These results show relative performance for the two-node cluster that was used for these examples. Your results will vary, depending on multiple factors, such as your node type, number of nodes, and other concurrent operations contending for resources.

    Sort Style Query 1 Query 2 Query 3
    Single 0.25 s 18.37 s 30.04 s
    Compound 0.27 s 18.24 s 30.14 s
    Interleaved 0.94 s 1.46 s 0.80 s

    In Query 1, the results for all three sort styles are very similar, because the WHERE clause restricts only on the first column. There is a small overhead cost for accessing an interleaved table.

    In Query 2, there is no benefit to the single-column sort key because that column is not used in the WHERE clause. There is no performance improvement for the compound sort key, because the query was restricted using the second and third columns in the sort key. The query against the interleaved table shows the best performance because interleaved sorting is able to efficiently filter on secondary columns in the sort key.

    In Query 3, the interleaved sort is much faster than the other styles because it is able to filter on the combination of the d_date, c_mktsegment, and c_region columns.

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