このトピックでは、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 標準仕様」をご参照ください。
シナリオ
このトピックでは、次のテストが実行されます。
OLAPクエリの パフォーマンス テスト: 列指向テーブルを作成し、テーブルにデータをインポートしてから、TPC-Hベンチマークテストの22のクエリステートメントを実行します。
キーと値のペアのポイントクエリの パフォーマンス テスト: ORDERSテーブルに定義されたスキーマに基づいて行指向テーブルを作成し、プライマリキーに基づいてポイントクエリを実行します。
データ更新テスト: OLAPエンジンのプライマリキーに基づくデータ更新の パフォーマンス をテストします。
テストデータの量はテスト結果に影響します。TPC-Hのデータ生成ツールを使用すると、スケールファクター(SF)を変更して、生成されるデータの量を調整できます。1 SF は 1 GB のデータを示します。
上記のデータ量は、[未加工データ] の量を指します。テスト環境を準備するときは、インデックスが占有するスペースなど、他の要因も考慮する必要があります。
注意事項
テスト結果に影響を与える可能性のある変数を減らすために、テスト要件を満たすために、既存のインスタンスの仕様をアップグレードまたはダウングレードする代わりに、このトピックで説明されているテストを実行するたびに新しいインスタンスを使用することをお勧めします。
OLAPクエリの パフォーマンス テスト
準備を行います。
OLAPクエリのテストの基本環境を準備します。
Hologresインスタンスを購入します。詳細については、「Hologresインスタンスの購入」をご参照ください。この例では、専用の従量課金制インスタンスが使用されます。インスタンスはテストのみに使用され、96個のCPUコアと 384 GB のメモリで構成されています。ビジネス要件に基づいてコンピューティングリソースを構成することもできます。
Elastic Compute Service(ECS)インスタンスを作成します。詳細については、「作成方法」をご参照ください。次の表に、このトピックで使用されているECSインスタンスの仕様を示します。
項目
仕様
[インスタンスタイプ]
ecs.g6.4xlarge
[イメージ]
Alibaba Cloud Linux 3.2104 LTS 64ビット
[データディスク]
エンタープライズSSD(ESSD)が使用されます。テストで使用されるデータ量に基づいて容量を決定できます。
Hologresのベンチマークテストパッケージをダウンロードして構成します。
ECSインスタンスにログオンします。詳細については、「コンソールでECSインスタンスを作成および管理する(エクスプレスバージョン)」の「インスタンスに接続する」セクションをご参照ください。
PostgreSQLクライアントをインストールします。
yum update -y yum install postgresql-server -y yum install postgresql-contrib -yHologresのベンチマークテストパッケージをダウンロードして解凍します。
wget https://oss-tpch.oss-cn-hangzhou.aliyuncs.com/hologres_benchmark.tar.gz tar xvf hologres_benchmark.tar.gzHologresベンチマークディレクトリに移動します。
cd hologres_benchmarkvim 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。
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です。
次のコマンドを実行して、エンドツーエンドの自動TPC-Hテストを有効にします。
エンドツーエンドのTPC-Hテストには、データの生成、テストデータベースの作成、テーブルの作成、テーブルへのデータのインポートが含まれます。テストデータベースには、tpc_h_sf<scale_factor> 形式の名前が付けられます(例: tpc_h_sf1000)。
bin/run_tpch.sh次のコマンドを実行して、TPC-Hクエリテストを実行することもできます。
bin/run_tpch.sh queryテスト結果を表示します。
テスト結果の概要を確認します。
bin/run_tpch.shコマンドを実行すると、テスト結果が表示されます。テスト結果の例:/* コマンド出力とディレクトリ構造は英語のままです */テスト結果の詳細を表示します。
bin/run_tpch.shコマンドが正常に実行されると、システムはTPC-Hベンチマークテスト全体の作業ディレクトリを構築し、<work_dir>ディレクトリのパスを返します。このパスに切り替えて、クエリステートメント、テーブル作成ステートメント、ランタイムログなどの関連情報を表示できます。次の図は例を示しています。
cd <work_dir>/logsコマンドを実行して、作業ディレクトリ内のlogsディレクトリに移動し、テスト結果とSQLステートメントの詳細な実行結果を表示することもできます。次のコードは、
<work_dir>ディレクトリの構造を示しています。/* ディレクトリ構造は英語のままです */
キーと値のペアのポイントクエリの パフォーマンス テスト
OLAPクエリの パフォーマンス テスト用に作成されたデータベース hologres_tpch とテーブルORDERSを使用して、キーと値のペアのポイントクエリの パフォーマンス テストを実行できます。手順:
テーブルを作成します。
キーと値のペアのポイントクエリの パフォーマンス テストには、行指向テーブルが必要です。したがって、OLAPクエリの パフォーマンス テスト用に作成されたテーブルを直接使用することはできません。行指向テーブルを作成する必要があります。PostgreSQLクライアントを使用してHologresインスタンスに接続し、次のコマンドを実行してpublic.orders_rowという名前のテーブルを作成できます。
説明PostgreSQLクライアントを使用してHologresインスタンスに接続する方法の詳細については、「PostgreSQLクライアントを使用してHologresに接続する」の「データ開発のためにHologresインスタンスに接続する」セクションをご参照ください。
/* SQL code remains untranslated */データをインポートします。
INSERT INTOステートメントを実行して、TPC-HデータセットのORDERSテーブルからpublic.orders_rowテーブルにデータをインポートできます。
説明Hologres V2.1.17以降では、サーバーレスコンピューティング機能がサポートされています。サーバーレスコンピューティング機能は、大量のデータをオフラインでインポートしたり、大規模な抽出、変換、読み込み(ETL)ジョブを実行したり、外部テーブルから大量のデータをクエリしたりするシナリオに適しています。サーバーレスコンピューティング機能を使用して、追加のサーバーレスコンピューティングリソースに基づいて前述の操作を実行できます。これにより、インスタンスに追加のコンピューティングリソースを予約する必要がなくなります。これにより、インスタンスの安定性が向上し、メモリ不足(OOM)エラーの発生が減少します。タスクで使用される追加のサーバーレスコンピューティングリソースに対してのみ課金されます。サーバーレスコンピューティング機能の詳細については、「サーバーレスコンピューティング」をご参照ください。サーバーレスコンピューティング機能の使用方法の詳細については、「サーバーレスコンピューティングのユーザーガイド」をご参照ください。
/* SQL code remains untranslated */クエリを実行します。
クエリステートメントを生成します。
次の表に、キーと値のペアのポイントクエリの パフォーマンス テストに含まれる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 個のランダムな主キー値が指定されています。
クエリに関する統計収集を容易にするpgbenchをインストールします。次のコマンドを実行してpgbenchをインストールできます。
yum install postgresql-contrib -y非互換性の問題を防ぐために、pgbench V13以降をインストールすることをお勧めします。pgbenchをローカルにインストールしている場合は、バージョンが V9.6以降であることを確認してください。pgbenchのバージョンを表示するには、次のコマンドを実行します。
pgbench --versionクエリステートメントを実行します。
説明SQLファイルが存在するディレクトリで次のコマンドを実行する必要があります。
pgbenchを使用して、単一値フィルタリングに適用されるクエリステートメントを実行します。
/* Shell script remains untranslated */pgbenchを使用して、複数値フィルタリングに適用されるクエリステートメントを実行します。
/* Shell script remains untranslated */
次の表に、前述のコマンドのパラメータを示します。
パラメータ
説明
AccessKey_ID
Alibaba CloudアカウントのAccessKey ID。
AccessKey_Secret
Alibaba Cloudアカウントの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)を表示できます。

22のTPC-Hクエリステートメント
次の表に、22のTPC-Hクエリステートメントへのリンクを示します。特定のクエリステートメントを表示するには、表のリンクをクリックします。
項目 | クエリステートメント | |||
22 件の TPC-H クエリステートメント | ||||
- | - | |||
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;