すべてのプロダクト
Search
ドキュメントセンター

Hologres:テスト計画

最終更新日:Jan 11, 2025

このトピックでは、TPC ベンチマーク H(TPC-H)を使用して、オンライン分析処理(OLAP)クエリとキーと値のペアのポイントクエリの パフォーマンス をテストする方法について説明します。

TPC-Hについて

次の説明は、TPC Benchmark™ H (TPC-H) の仕様からの引用です。

TPC-Hは、ビジネス指向のアドホッククエリと同時データ変更のスイートで構成される意思決定支援ベンチマークです。データベースにデータを入力するクエリは、業界全体に関連するものとして選択されています。このベンチマークは、大量のデータを調べ、高度に複雑なクエリを実行し、重要なビジネス上の質問に回答する意思決定支援システムを示しています。

詳細については、「TPC Benchmark™ H 標準仕様」をご参照ください。

説明

このトピックで説明されているTPC-H パフォーマンス テストは、TPC-Hベンチマークテストに基づいて実装されていますが、TPC-Hベンチマークテストのすべての要件を満たしているわけではありません。したがって、このトピックで説明されているテスト結果は、公開されているTPC-Hベンチマークテストの結果と比較することはできません。

データセット

TPC-Hは、意思決定支援システムをシミュレートするためにトランザクション処理 パフォーマンス 評議会(TPC)によって開発されたテストセットです。TPC-Hは、学術界や産業界で意思決定支援システムの パフォーマンス を評価するために使用されます。

TPC-Hは、本番環境のデータをモデル化して、販売システムのデータウェアハウスをシミュレートします。データウェアハウスは8つのテーブルで構成されています。各テーブルのサイズは 1 GB から 3 TB の範囲です。TPC-Hベンチマークテストには、22のクエリステートメントが含まれています。テストは、各クエリの応答時間、つまりクエリを送信してから返された結果を受信するまでに必要な時間に焦点を当てています。テスト結果は、システムのクエリ処理能力を包括的に反映できます。詳細については、「TPC BENCHMARK H 標準仕様」をご参照ください。

シナリオ

このトピックでは、次のテストが実行されます。

テストデータの量はテスト結果に影響します。TPC-Hのデータ生成ツールを使用すると、スケールファクター(SF)を変更して、生成されるデータの量を調整できます。1 SF は 1 GB のデータを示します。

説明

上記のデータ量は、[未加工データ] の量を指します。テスト環境を準備するときは、インデックスが占有するスペースなど、他の要因も考慮する必要があります。

注意事項

テスト結果に影響を与える可能性のある変数を減らすために、テスト要件を満たすために、既存のインスタンスの仕様をアップグレードまたはダウングレードする代わりに、このトピックで説明されているテストを実行するたびに新しいインスタンスを使用することをお勧めします。

OLAPクエリの パフォーマンス テスト

  1. 準備を行います。

    OLAPクエリのテストの基本環境を準備します。

    1. Hologresインスタンスを購入します。詳細については、「Hologresインスタンスの購入」をご参照ください。この例では、専用の従量課金制インスタンスが使用されます。インスタンスはテストのみに使用され、96個のCPUコアと 384 GB のメモリで構成されています。ビジネス要件に基づいてコンピューティングリソースを構成することもできます。

    2. Elastic Compute Service(ECS)インスタンスを作成します。詳細については、「作成方法」をご参照ください。次の表に、このトピックで使用されているECSインスタンスの仕様を示します。

      項目

      仕様

      [インスタンスタイプ]

      ecs.g6.4xlarge

      [イメージ]

      Alibaba Cloud Linux 3.2104 LTS 64ビット

      [データディスク]

      エンタープライズSSD(ESSD)が使用されます。テストで使用されるデータ量に基づいて容量を決定できます。

  2. Hologresのベンチマークテストパッケージをダウンロードして構成します。

    1. ECSインスタンスにログオンします。詳細については、「コンソールでECSインスタンスを作成および管理する(エクスプレスバージョン)」の「インスタンスに接続する」セクションをご参照ください。

    2. PostgreSQLクライアントをインストールします。

      yum update -y
      yum install postgresql-server -y
      yum install postgresql-contrib -y
    3. Hologresのベンチマークテストパッケージをダウンロードして解凍します。

      wget https://oss-tpch.oss-cn-hangzhou.aliyuncs.com/hologres_benchmark.tar.gz
      tar xvf hologres_benchmark.tar.gz
    4. Hologresベンチマークディレクトリに移動します。

      cd hologres_benchmark
    5. vim group_vars/all コマンドを実行し、ベンチマークテストに必要なパラメータを構成します。

      # db config
      login_host: ""
      login_user: ""
      login_password: "" 
      login_port: ""
      
      # benchmark run cluster: hologres
      cluster: "hologres"
      RUN_MODE: "HOTRUN"
      
      # benchmark config
      scale_factor: 1
      work_dir_root: /your/working_dir/benchmark/workdirs
      dataset_generate_root_path: /your/working_dir/benchmark/datasets

      次の表に、パラメータを示します。

      タイプ

      パラメータ

      説明

      Hologres接続パラメータ

      login_host

      Hologresインスタンスの仮想プライベートクラウド(VPC)エンドポイント。

      Hologres コンソール にログオンし、[インスタンスの詳細] ページに移動して、[ネットワーク情報] セクションの [エンドポイント] 列で VPC エンドポイントを取得できます。

      説明

      エンドポイントにはポート番号は含まれていません。例: hgpostcn-cn-nwy364b5v009-cn-shanghai-vpc-st.hologres.aliyuncs.com

      login_port

      Hologresインスタンスが存在するVPCのポート番号。

      Hologresコンソール にログインし、インスタンス詳細ページに移動して、[ネットワーク情報] セクションの [エンドポイント] 列で VPC エンドポイントのポート番号を取得できます。

      login_user

      Alibaba CloudアカウントのAccessKey ID。

      [アクセスキーペア] ページからAccessKey IDを取得できます。

      login_password

      Alibaba CloudアカウントのAccessKeyシークレット。

      ベンチマークテスト構成パラメータ

      scale_factor

      データセットのSF。生成されるデータの量を制御します。デフォルト値: 1。単位: GB。

      work_dir_root

      作業ディレクトリのルートディレクトリ。ルートディレクトリは、テーブル作成ステートメントやTPC-Hテストのその他のSQLステートメントなどのデータを格納するために使用されます。デフォルトのディレクトリは /your/working_dir/benchmark/workdirs です。

      dataset_generate_root_path

      生成されたテストデータセットが格納されるパス。デフォルトのパスは /your/working_dir/benchmark/datasets です。

  3. 次のコマンドを実行して、エンドツーエンドの自動TPC-Hテストを有効にします。

    エンドツーエンドのTPC-Hテストには、データの生成、テストデータベースの作成、テーブルの作成、テーブルへのデータのインポートが含まれます。テストデータベースには、tpc_h_sf<scale_factor> 形式の名前が付けられます(例: tpc_h_sf1000)。

    bin/run_tpch.sh

    次のコマンドを実行して、TPC-Hクエリテストを実行することもできます。

    bin/run_tpch.sh query
  4. テスト結果を表示します。

    • テスト結果の概要を確認します。

      bin/run_tpch.sh コマンドを実行すると、テスト結果が表示されます。テスト結果の例:

      /* コマンド出力とディレクトリ構造は英語のままです */
    • テスト結果の詳細を表示します。

      bin/run_tpch.sh コマンドが正常に実行されると、システムはTPC-Hベンチマークテスト全体の作業ディレクトリを構築し、<work_dir> ディレクトリのパスを返します。このパスに切り替えて、クエリステートメント、テーブル作成ステートメント、ランタイムログなどの関連情報を表示できます。次の図は例を示しています。

      image

      cd <work_dir>/logs コマンドを実行して、作業ディレクトリ内のlogsディレクトリに移動し、テスト結果とSQLステートメントの詳細な実行結果を表示することもできます。

      次のコードは、<work_dir> ディレクトリの構造を示しています。

      /* ディレクトリ構造は英語のままです */

キーと値のペアのポイントクエリの パフォーマンス テスト

OLAPクエリの パフォーマンス テスト用に作成されたデータベース hologres_tpch とテーブルORDERSを使用して、キーと値のペアのポイントクエリの パフォーマンス テストを実行できます。手順:

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

    キーと値のペアのポイントクエリの パフォーマンス テストには、行指向テーブルが必要です。したがって、OLAPクエリの パフォーマンス テスト用に作成されたテーブルを直接使用することはできません。行指向テーブルを作成する必要があります。PostgreSQLクライアントを使用してHologresインスタンスに接続し、次のコマンドを実行してpublic.orders_rowという名前のテーブルを作成できます。

    説明

    PostgreSQLクライアントを使用してHologresインスタンスに接続する方法の詳細については、「PostgreSQLクライアントを使用してHologresに接続する」の「データ開発のためにHologresインスタンスに接続する」セクションをご参照ください。

    /* SQL code remains untranslated */
  2. データをインポートします。

    INSERT INTOステートメントを実行して、TPC-HデータセットのORDERSテーブルからpublic.orders_rowテーブルにデータをインポートできます。

    説明

    Hologres V2.1.17以降では、サーバーレスコンピューティング機能がサポートされています。サーバーレスコンピューティング機能は、大量のデータをオフラインでインポートしたり、大規模な抽出、変換、読み込み(ETL)ジョブを実行したり、外部テーブルから大量のデータをクエリしたりするシナリオに適しています。サーバーレスコンピューティング機能を使用して、追加のサーバーレスコンピューティングリソースに基づいて前述の操作を実行できます。これにより、インスタンスに追加のコンピューティングリソースを予約する必要がなくなります。これにより、インスタンスの安定性が向上し、メモリ不足(OOM)エラーの発生が減少します。タスクで使用される追加のサーバーレスコンピューティングリソースに対してのみ課金されます。サーバーレスコンピューティング機能の詳細については、「サーバーレスコンピューティング」をご参照ください。サーバーレスコンピューティング機能の使用方法の詳細については、「サーバーレスコンピューティングのユーザーガイド」をご参照ください。

    /* SQL code remains untranslated */
  3. クエリを実行します。

    1. クエリステートメントを生成します。

      次の表に、キーと値のペアのポイントクエリの パフォーマンス テストに含まれる2種類のクエリを示します。

      クエリタイプ

      クエリステートメント

      説明

      単一値フィルタリング

      /* SQL code remains untranslated */

      このクエリステートメントは、WHERE 句に主キー値が 1 つだけ指定されている単一値フィルタリングに適用されます。

      複数値フィルタリング

      /* SQL code remains untranslated */

      このクエリステートメントは、WHERE 句で複数の主キー値が指定されている複数値フィルタリングに適用されます。

      次のスクリプトを実行して、必要なSQLステートメントを生成できます。

      /* Shell script remains untranslated */

      2つのSQLファイルが生成されます。

      • kv_query_single.sql: 単一値のフィルタリングに適用される SQL ステートメントは、このファイルに保存されます。

      • kv_query_in.sql: このファイルには、複数値のフィルタリングに適用される SQL ステートメントが保存されています。WHERE 句には 10 個のランダムな主キー値が指定されています。

    2. クエリに関する統計収集を容易にするpgbenchをインストールします。次のコマンドを実行してpgbenchをインストールできます。

      yum install postgresql-contrib -y

      非互換性の問題を防ぐために、pgbench V13以降をインストールすることをお勧めします。pgbenchをローカルにインストールしている場合は、バージョンが V9.6以降であることを確認してください。pgbenchのバージョンを表示するには、次のコマンドを実行します。

      pgbench --version
    3. クエリステートメントを実行します。

      説明

      SQLファイルが存在するディレクトリで次のコマンドを実行する必要があります。

      • pgbenchを使用して、単一値フィルタリングに適用されるクエリステートメントを実行します。

        /* Shell script remains untranslated */
      • pgbenchを使用して、複数値フィルタリングに適用されるクエリステートメントを実行します。

        /* Shell script remains untranslated */

      次の表に、前述のコマンドのパラメータを示します。

      パラメータ

      説明

      AccessKey_ID

      Alibaba CloudアカウントのAccessKey ID。

      [アクセスキーペア] ページからAccessKey IDを取得できます。

      AccessKey_Secret

      Alibaba CloudアカウントのAccessKeyシークレット。

      [アクセスキーペア] ページからAccessKeyシークレットを取得できます。

      Database

      • Hologresデータベースの名前。

      • Hologresインスタンスを購入すると、デフォルトでpostgresという名前のデータベースが作成されます。

      • postgresデータベースをHologresインスタンスに接続できます。ただし、このデータベースに割り当てられるリソースは限られています。ビジネスに十分なリソースを確保するために、データベースを作成することをお勧めします。詳細については、「データベースを作成する」をご参照ください。

      Endpoint

      Hologresインスタンスのエンドポイント。

      Hologresインスタンスのエンドポイントは、Hologresコンソール のインスタンス詳細ページの [ネットワーク情報] セクションから取得できます。

      Port

      Hologresインスタンスのポート番号。

      Hologresインスタンスのポート番号は、Hologresコンソール[インスタンスの詳細] ページで取得できます。

      Client_Num

      テスト対象のクライアント数。

      この例では、クエリ パフォーマンス のみテストする必要があるため、同時実行性はテストしません。したがって、このパラメータは 1 に設定されています。

      Query_Seconds

      各クライアントが実行する各クエリのストレステスト期間。単位: 秒。この例では、このパラメータは 300 に設定されています。

データ更新テスト

OLAPエンジンのプライマリキーに基づくデータ更新の パフォーマンス をテストできます。この例では、1行のデータが挿入されます。プライマリキーの競合が発生した場合は、1行のデータが更新されます。

  • クエリステートメントを生成します。

    /* Shell script remains untranslated */
  • データを挿入または更新します。パラメータの詳細については、このトピックのパラメータをご参照ください。

    /* Shell script remains untranslated */
  • 結果の例:

    /* Example result remains untranslated */

Realtime Compute for Apache Flinkを使用してHologresにリアルタイムでデータを書き込む パフォーマンス テスト

このテストを実行して、Realtime Compute for Apache Flinkを使用してHologresにリアルタイムでデータを書き込む パフォーマンス を評価できます。

  • Hologres DDLステートメント

    この例では、10 個の列を含む Hologres テーブルを使用します。key 列はプライマリキー列として構成されています。この Hologres テーブルを作成するには、次の DDL ステートメントを実行します。

    /* SQL code remains untranslated */
  • Realtime Compute for Apache Flinkデプロイメントのスクリプト

    フルマネージドFlinkによって提供される乱数ジェネレータを使用して、Hologresにデータを書き込むことができます。プライマリキーの競合が発生した場合は、データの行全体が更新されます。各行には 512 バイトを超えるデータが含まれています。次のスクリプトを実行して、Realtime Compute for Apache Flinkジョブを実行できます。

    /* SQL code remains untranslated */

    パラメータの詳細については、「Hologres結果テーブル」をご参照ください。

  • 結果の例:

    HologresコンソールのHologresインスタンスの [監視情報] ページで、1秒あたりのレコード数(RPS)を表示できます。RPS

22のTPC-Hクエリステートメント

次の表に、22のTPC-Hクエリステートメントへのリンクを示します。特定のクエリステートメントを表示するには、表のリンクをクリックします。

/* ... Rest of the table remains untranslated */

項目

クエリステートメント

22 件の TPC-H クエリステートメント

Q1

Q2

Q3

Q4

Q5

Q6

Q7

Q8

Q9

Q10

Q11

Q12

Q13

Q14

Q15

Q16

Q17

Q18

Q19

Q20

Q21

Q22

-

-

  • Q1

    select
            l_returnflag,
            l_linestatus,
            sum(l_quantity) as sum_qty,
            sum(l_extendedprice) as sum_base_price,
            sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
            sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
            avg(l_quantity) as avg_qty,
            avg(l_extendedprice) as avg_price,
            avg(l_discount) as avg_disc,
            count(*) as count_order
    from
            lineitem
    where
            l_shipdate <= date '1998-12-01' - interval '120' day  // 1998年12月1日から120日前までの出荷日
    group by
            l_returnflag,
            l_linestatus
    order by
            l_returnflag,
            l_linestatus;
  • Q2

    select
            s_acctbal,
            s_name,
            n_name,
            p_partkey,
            p_mfgr,
            s_address,
            s_phone,
            s_comment
    from
            part,
            supplier,
            partsupp,
            nation,
            region
    where
            p_partkey = ps_partkey
            and s_suppkey = ps_suppkey
            and p_size = 48
            and p_type like '%STEEL'
            and s_nationkey = n_nationkey
            and n_regionkey = r_regionkey
            and r_name = 'EUROPE'
            and ps_supplycost = (
                    select
                            min(ps_supplycost)
                    from
                            partsupp,
                            supplier,
                            nation,
                            region
                    where
                            p_partkey = ps_partkey
                            and s_suppkey = ps_suppkey
                            and s_nationkey = n_nationkey
                            and n_regionkey = r_regionkey
                            and r_name = 'EUROPE'
            )
    order by
            s_acctbal desc,
            n_name,
            s_name,
            p_partkey
    limit 100;
  • Q3

    select
            l_orderkey,
            sum(l_extendedprice * (1 - l_discount)) as revenue,
            o_orderdate,
            o_shippriority
    from
            customer,
            orders,
            lineitem
    where
            c_mktsegment = 'MACHINERY'
            and c_custkey = o_custkey
            and l_orderkey = o_orderkey
            and o_orderdate < date '1995-03-23'
            and l_shipdate > date '1995-03-23'
    group by
            l_orderkey,
            o_orderdate,
            o_shippriority
    order by
            revenue desc,
            o_orderdate
    limit 10;
  • Q4

    select
            o_orderpriority,
            count(*) as order_count
    from
            orders
    where
            o_orderdate >= date '1996-07-01'
            and o_orderdate < date '1996-07-01' + interval '3' month
            /* 1996年7月1日から3ヶ月間の注文を取得 */
            and exists (
                    select
                            *
                    from
                            lineitem
                    where
                            l_orderkey = o_orderkey
                            /* 受領日より確定日が前の注文明細行を取得 */
                            and l_commitdate < l_receiptdate
            )
    group by
            o_orderpriority
    order by
            o_orderpriority;
  • Q5

    select
            n_name,
            sum(l_extendedprice * (1 - l_discount)) as revenue
    from
            customer,
            orders,
            lineitem,
            supplier,
            nation,
            region
    where
            c_custkey = o_custkey
            and l_orderkey = o_orderkey
            and l_suppkey = s_suppkey
            and c_nationkey = s_nationkey
            and s_nationkey = n_nationkey
            and n_regionkey = r_regionkey
            and r_name = 'EUROPE'
            and o_orderdate >= date '1996-01-01'
            and o_orderdate < date '1996-01-01' + interval '1' year
    group by
            n_name
    order by
            revenue desc;
  • Q6

    select
            sum(l_extendedprice * l_discount) as revenue
    from
            lineitem
    where
            l_shipdate >= date '1996-01-01'
            and l_shipdate < date '1996-01-01' + interval '1' year
            and l_discount between 0.02 - 0.01 and 0.02 + 0.01
            and l_quantity < 24;
  • Q7

    select
            supp_nation,
            cust_nation,
            l_year,
            sum(volume) as revenue
    from
            (
                    select
                            n1.n_name as supp_nation,  /* サプライヤーの国 */
                            n2.n_name as cust_nation,  /* 顧客の国 */
                            extract(year from l_shipdate) as l_year, /* 出荷年 */
                            l_extendedprice * (1 - l_discount) as volume /* 売上高 */
                    from
                            supplier,
                            lineitem,
                            orders,
                            customer,
                            nation n1,
                            nation n2
                    where
                            s_suppkey = l_suppkey
                            and o_orderkey = l_orderkey
                            and c_custkey = o_custkey
                            and s_nationkey = n1.n_nationkey
                            and c_nationkey = n2.n_nationkey
                            and (
                                    (n1.n_name = 'CANADA' and n2.n_name = 'BRAZIL')
                                    or (n1.n_name = 'BRAZIL' and n2.n_name = 'CANADA')
                            )
                            and l_shipdate between date '1995-01-01' and date '1996-12-31'
            ) as shipping
    group by
            supp_nation,
            cust_nation,
            l_year
    order by
            supp_nation,
            cust_nation,
            l_year;
  • Q8

    select
            o_year,
            sum(case
                    when nation = 'BRAZIL' then volume  /* ブラジルにおける売上高 */
                    else 0
            end) / sum(volume) as mkt_share /* 市場シェア */
    from
            (
                    select
                            extract(year from o_orderdate) as o_year, /* 注文年 */
                            l_extendedprice * (1 - l_discount) as volume, /* 売上高 */
                            n2.n_name as nation /* 国 */
                    from
                            part,
                            supplier,
                            lineitem,
                            orders,
                            customer,
                            nation n1,
                            nation n2,
                            region
                    where
                            p_partkey = l_partkey
                            and s_suppkey = l_suppkey
                            and l_orderkey = o_orderkey
                            and o_custkey = c_custkey
                            and c_nationkey = n1.n_nationkey
                            and n1.n_regionkey = r_regionkey
                            and r_name = 'AMERICA' /* アメリカ地域 */
                            and s_nationkey = n2.n_nationkey
                            and o_orderdate between date '1995-01-01' and date '1996-12-31' /* 1995年から1996年の間 */
                            and p_type = 'LARGE ANODIZED COPPER' /* 大きな陽極酸化銅 */
            ) as all_nations /* 全国の売上 */
    group by
            o_year
    order by
            o_year;
  • Q9

    select
            nation,
            o_year,
            sum(amount) as sum_profit
    from
            (
                    select
                            n_name as nation,  // 国名を選択
                            extract(year from o_orderdate) as o_year, // 注文日から年を抽出
                            l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount // 利益を計算
                    from
                            part,
                            supplier,
                            lineitem,
                            partsupp,
                            orders,
                            nation
                    where
                            s_suppkey = l_suppkey
                            and ps_suppkey = l_suppkey
                            and ps_partkey = l_partkey
                            and p_partkey = l_partkey
                            and o_orderkey = l_orderkey
                            and s_nationkey = n_nationkey
                            and p_name like '%maroon%'
            ) as profit
    group by
            nation,
            o_year
    order by
            nation,
            o_year desc;
  • Q10

    select
            c_custkey,
            c_name,
            sum(l_extendedprice * (1 - l_discount)) as revenue,
            c_acctbal,
            n_name,
            c_address,
            c_phone,
            c_comment
    from
            customer,
            orders,
            lineitem,
            nation
    where
            c_custkey = o_custkey
            and l_orderkey = o_orderkey
            and o_orderdate >= date '1993-02-01'
            and o_orderdate < date '1993-02-01' + interval '3' month
            and l_returnflag = 'R'  // 返品フラグが 'R'
            and c_nationkey = n_nationkey
    group by
            c_custkey,
            c_name,
            c_acctbal,
            c_phone,
            n_name,
            c_address,
            c_comment
    order by
            revenue desc // 売上高の降順
    limit 20;
  • Q11

    select
            ps_partkey,
            sum(ps_supplycost * ps_availqty) as value
    from
            partsupp,
            supplier,
            nation
    where
            ps_suppkey = s_suppkey
            and s_nationkey = n_nationkey
            and n_name = 'EGYPT'  // エジプトのサプライヤー
    group by
            ps_partkey having
                    sum(ps_supplycost * ps_availqty) > (
                            select
                                    sum(ps_supplycost * ps_availqty) * 0.0001000000
                            from
                                    partsupp,
                                    supplier,
                                    nation
                            where
                                    ps_suppkey = s_suppkey
                                    and s_nationkey = n_nationkey
                                    and n_name = 'EGYPT' // エジプトのサプライヤー
                    )
    order by
            value desc;
  • Q12

    select
            l_shipmode,
            sum(case
                    when o_orderpriority = '1-URGENT'
                            or o_orderpriority = '2-HIGH'
                            then 1  -- 優先度が高い場合
                    else 0
            end) as high_line_count, -- 優先度の高い行数
            sum(case
                    when o_orderpriority <> '1-URGENT'
                            and o_orderpriority <> '2-HIGH'
                            then 1 -- 優先度が低い場合
                    else 0
            end) as low_line_count -- 優先度の低い行数
    from
            orders,
            lineitem
    where
            o_orderkey = l_orderkey
            and l_shipmode in ('FOB', 'AIR')
            and l_commitdate < l_receiptdate
            and l_shipdate < l_commitdate
            and l_receiptdate >= date '1997-01-01'
            and l_receiptdate < date '1997-01-01' + interval '1' year
    group by
            l_shipmode
    order by
            l_shipmode;
  • Q13

    select
            c_count,
            count(*) as custdist
    from
            (
                    select
                            c_custkey,
                            count(o_orderkey) as c_count
                    from
                            customer left outer join orders on
                                    c_custkey = o_custkey
                                    and o_comment not like '%special%deposits%'  /*特別な預金を含まない*/
                    group by
                            c_custkey
            ) c_orders
    group by
            c_count
    order by
            custdist desc,
            c_count desc;
  • Q14

    select
            100.00 * sum(case
                    when p_type like 'PROMO%'
                            then l_extendedprice * (1 - l_discount) /* 売上合計に対するプロモーションによる売上の割合を計算 */
                    else 0
            end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue
    from
            lineitem,
            part
    where
            l_partkey = p_partkey
            and l_shipdate >= date '1997-06-01'
            and l_shipdate < date '1997-06-01' + interval '1' month;
  • Q15

    with revenue0(SUPPLIER_NO, TOTAL_REVENUE)  as
        (
        select
            l_suppkey,
            sum(l_extendedprice * (1 - l_discount))
        from
            lineitem
        where
            l_shipdate >= date '1995-02-01'
            and l_shipdate < date '1995-02-01' + interval '3' month
        group by
            l_suppkey
        )
    select
        s_suppkey,
        s_name,
        s_address,
        s_phone,
        total_revenue
    from
        supplier,
        revenue0
    where
        s_suppkey = supplier_no
        and total_revenue = (
            select
                max(total_revenue)
            from
                revenue0
        )
    order by
        s_suppkey;
  • Q16

    select
            p_brand,
            p_type,
            p_size,
            count(distinct ps_suppkey) as supplier_cnt
    from
            partsupp,
            part
    where
            p_partkey = ps_partkey
            and p_brand <> 'Brand#45'
            and p_type not like 'SMALL ANODIZED%'
            and p_size in (47, 15, 37, 30, 46, 16, 18, 6)
            and ps_suppkey not in (
                    select
                            s_suppkey
                    from
                            supplier
                    where
                            s_comment like '%Customer%Complaints%'
            )
    group by
            p_brand,
            p_type,
            p_size
    order by
            supplier_cnt desc,
            p_brand,
            p_type,
            p_size;
  • Q17

    select
            sum(l_extendedprice) / 7.0 as avg_yearly
    from
            lineitem,
            part
    where
            p_partkey = l_partkey
            and p_brand = 'Brand#51'
            and p_container = 'WRAP PACK'
            and l_quantity < (
                    select
                            0.2 * avg(l_quantity)  /* 数量の平均の 0.2 倍 */
                    from
                            lineitem
                    where
                            l_partkey = p_partkey
            );
  • Q18

    select
            c_name,
            c_custkey,
            o_orderkey,
            o_orderdate,
            o_totalprice,
            sum(l_quantity)
    from
            customer,
            orders,
            lineitem
    where
            o_orderkey in (
                    select
                            l_orderkey
                    from
                            lineitem
                    group by
                            l_orderkey having
                                    sum(l_quantity) > 312  /*数量の合計が312を超える*/
            )
            and c_custkey = o_custkey
            and o_orderkey = l_orderkey
    group by
            c_name,
            c_custkey,
            o_orderkey,
            o_orderdate,
            o_totalprice
    order by
            o_totalprice desc,
            o_orderdate
    limit 100;
  • Q19

    select
            sum(l_extendedprice* (1 - l_discount)) as revenue
    from
            lineitem,
            part
    where
            (
                    p_partkey = l_partkey
                    and p_brand = 'Brand#52'
                    and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
                    and l_quantity >= 3 and l_quantity <= 3 + 10
                    and p_size between 1 and 5
                    and l_shipmode in ('AIR', 'AIR REG')
                    and l_shipinstruct = 'DELIVER IN PERSON'
            )
            or
            (
                    p_partkey = l_partkey
                    and p_brand = 'Brand#43'
                    and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
                    and l_quantity >= 12 and l_quantity <= 12 + 10
                    and p_size between 1 and 10
                    and l_shipmode in ('AIR', 'AIR REG')
                    and l_shipinstruct = 'DELIVER IN PERSON'
            )
            or
            (
                    p_partkey = l_partkey
                    and p_brand = 'Brand#52'
                    and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
                    and l_quantity >= 21 and l_quantity <= 21 + 10
                    and p_size between 1 and 15
                    and l_shipmode in ('AIR', 'AIR REG')
                    and l_shipinstruct = 'DELIVER IN PERSON'
            );
  • Q20

    select
            s_name,
            s_address
    from
            supplier,
            nation
    where
            s_suppkey in (
                    select
                            ps_suppkey
                    from
                            partsupp
                    where
                            ps_partkey in (
                                    select
                                            p_partkey
                                    from
                                            part
                                    where
                                            p_name like 'drab%'
                            )
                            and ps_availqty > (
                                    select
                                            0.5 * sum(l_quantity)
                                    from
                                            lineitem
                                    where
                                            l_partkey = ps_partkey
                                            and l_suppkey = ps_suppkey
                                            and l_shipdate >= date '1996-01-01'
                                            and l_shipdate < date '1996-01-01' + interval '1' year
                            )
            )
            and s_nationkey = n_nationkey
            and n_name = 'KENYA'
    order by
            s_name;
  • Q1

    select
            s_name,
            count(*) as numwait
    from
            supplier,
            lineitem l1,
            orders,
            nation
    where
            s_suppkey = l1.l_suppkey
            and o_orderkey = l1.l_orderkey
            and o_orderstatus = 'F'
            and l1.l_receiptdate > l1.l_commitdate
            and exists (
                    select
                            *
                    from
                            lineitem l2
                    where
                            l2.l_orderkey = l1.l_orderkey
                            and l2.l_suppkey <> l1.l_suppkey
            )
            and not exists (
                    select
                            *
                    from
                            lineitem l3
                    where
                            l3.l_orderkey = l1.l_orderkey
                            and l3.l_suppkey <> l1.l_suppkey
                            and l3.l_receiptdate > l3.l_commitdate
            )
            and s_nationkey = n_nationkey
            and n_name = 'PERU'
    group by
            s_name
    order by
            numwait desc,
            s_name
    limit 100;
  • Q2

    select
            cntrycode,
            count(*) as numcust,
            sum(c_acctbal) as totacctbal
    from
            (
                    select
                            substring(c_phone from 1 for 2) as cntrycode,
                            c_acctbal
                    from
                            customer
                    where
                            substring(c_phone from 1 for 2) in
                                    ('24', '32', '17', '18', '12', '14', '22')
                            and c_acctbal > (
                                    select
                                            avg(c_acctbal)
                                    from
                                            customer
                                    where
                                            c_acctbal > 0.00
                                            and substring(c_phone from 1 for 2) in
                                                    ('24', '32', '17', '18', '12', '14', '22')
                            )
                            and not exists (
                                    select
                                            *
                                    from
                                            orders
                                    where
                                            o_custkey = c_custkey
                            )
            ) as custsale
    group by
            cntrycode
    order by
            cntrycode;