概要
この記事では、データシップ最適化機能の基本的な設定方法について説明します。
データシップ最適化について
データシップ最適化は、複数のデータソースにまたがるフェデレーテッド・クエリを、ローカルで実行するSQL操作に変換することで、効率的な実行を行うものです。
SQLに、非常に大きなテーブル (数百万行または数十万行) と、行数が大幅に少ない小さなテーブルが含まれる場合、TDV は、小さなテーブルのコピーを、大きなテーブルのデータソースに送信することで、クエリのパフォーマンスを向上します。この最適化により、従来のフェデレーテッド・クエリよりも大幅に高速な結果が得られます。
次のSQL操作で、データシップ最適化を利用できます。
• JOIN
• UNION
• INTERSECT
• EXCEPT
設定例
ここでは、それぞれ異なるデータソース上に存在するテーブルをJOINするViewを例に、設定方法を説明します。
サンプルビューとして、PostgreSQL上のproductsテーブルと、SQLServer上のcategoriesテーブルをJOINしています。
設定手順
データシップ最適化を有効化するには、各データソース定義の詳細タブにある、データシップ関連プロパティを有効にします。
まず、データソース毎にデータシップのソース、ターゲットとなることを指定します。
- Is dataship source(データシップソースです)
このデータソース上のテーブルを、別のデータシップ対応データソースへ転送する対象とする - Is dataship target(データシップターゲットです)
このデータソースに、別のデータシップ対応データソースから転送されたテーブルを受信できるようにする
データシップの下限、上限の調整、一時テーブルに関する指定を、適宜行います。
■ 設定例:PostgreSQL側データソース
■ 設定例:SQLServer側データソース
■ 主なプロパティ
プロパティ名 | 説明 |
データシップソースです Is dataship source |
このデータソース上のテーブルを、別のデータシップ対応データソースへ転送する対象とする |
データシップターゲットです Is dataship target |
このデータソースに、別のデータシップ対応データソースから転送されたテーブルを受信できるようにする |
データシップの下限 Lower bound for data ship |
ノードからデータを送信するコストの数値見積もりを算出します。フェデレーテッドクエリノードの送信コストが |
データシップの上限 Upper bound for data ship |
|
一時テーブルのスキーマパス Schema path for Temp Tables |
データソース上の一時テーブルの場所を設定する相対パス |
一時テーブルのプレフィックス Temp Table Prefix |
一時テーブルを作成する際に、一時テーブル名に追加される文字列 |
一括インポート/エクスポートの有効化 Enable Bulk Import/Export |
データのバルク転送を有効にするチェック ボックス (転送方法はDBにより異なります) |
実行計画(設定前)
データシップ設定前の実行計画では、ノード4、5で双方のテーブルから全件取得し、ノード3でTDV上でJOINしています。
[ 1] Request # 500276
[ 2] + SELECT (25)
[ 3] + JOIN (25)
[ 4] + FETCH (25)
[ 5] + FETCH (10)
■ ノード3(JOIN)
[3]
Path: Request # 500276/SELECT (25)/JOIN (25)
Name: JOIN
Rows Returned: 25
[・・・省略・・・]
Criteria: products.categoryid = categories.categoryid
Algorithm: Inner join/Sort merge
Algorithm Notes:
■ ノード4(PostgreSQLからのFETCH)
[4]
Path: Request # 500276/SELECT (25)/JOIN (25)/FETCH (25)
Name: FETCH
Rows Returned: 25
[・・・省略・・・]
Data source path: /shared/support/DataShip/postgresql14
Data source type: PostgreSQL
Data source driver name : PostgreSQL 12.0
Connection ID: 2104294090
Data Ship Notes: Cannot ship since PostgreSQL 12.0 (/shared/support/DataShip/postgresql14) does not support data ship source/target functionality
SQL: SELECT
"products"."productid",
"products"."productname",
"products"."unitprice",
"products"."categoryid"
FROM "public"."products" "products"
ORDER BY "products"."categoryid"
■ ノード5(SQLServerからのFETCH)
[5]
Path: Request # 500276/SELECT (25)/JOIN (25)/FETCH (10)
Name: FETCH
Rows Returned: 10
[・・・省略・・・]
Data source path: /shared/support/DataShip/sqlserver2019
Data source type: SqlServer
Data source driver name : Microsoft SQL Server 2019
Connection ID: 1794870263
Data Ship Notes: Cannot ship since Microsoft SQL Server 2019 (/shared/support/DataShip/sqlserver2019) does not support data ship source/target functionality
SQL: SELECT
[categories].[categoryname],
[categories].[categoryid]
FROM [tdv].[dbo].[categories] [categories]
ORDER BY [categories].[categoryid]
実行計画(設定後)
この例では、SQLServerのcategoriesテーブルが、PostgreSQL側に転送され、PostgreSQL上でJOINが行われました。
データシップ最適化が実施されると、Pre Data Ship Planノードが現れ、最適化前の実行計画がその下に表示されます。
下例では、ノード3のFETCHが最適化後のSQL操作です。
[ 1] Request # 500299
[ 2] + SELECT (25)
[ 3] + FETCH (25)
[ 4] + Pre Data Ship Plan (-1)
[ 5] + SELECT (0)
[ 6] + JOIN (0)
[ 7] + FETCH (0)
[ 8] + FETCH (0)
■ ノード3(最適化の結果、実行されたFETCH)
PostgreSQL側へ転送されたcategoriesテーブルを使用して、PostgreSQL側でJOINが実行されるよう最適化されています。(下例では、T_77707945_6D8A_40CE_9A5C_183249E8A78A_2テーブルが転送されたcategoriesテーブル名です)
[3]
Path: Request # 500299/SELECT (25)/FETCH (25)
Name: FETCH
Rows Returned: 25
Estimated Rows Returned: Unknown (at least 0 rows)
Total execute time which include children time and wait time.: 0 sec
Foreground Data Source Read Time: 0 sec
Peak memory reserved: 0
Data source path: /shared/support/DataShip/postgresql14
Data source type: PostgreSQL
Data source driver name : PostgreSQL 12.0
Connection ID: 639537386
SQL: SELECT
"products"."productid",
"products"."productname",
"categories"."CATEGORYNAME" AS "categoryname",
"products"."unitprice"
FROM "public"."products" "products" INNER JOIN
"public"."T_77707945_6D8A_40CE_9A5C_183249E8A78A_2" "categories"
ON "products"."categoryid" = "categories"."CATEGORYID"
■ ノード7(PostgreSQLからのFETCH)
Execution Statusに NOT EXECUTED と表示されており、最適化の結果、このFETCHが実行されなかったことを示しています。
[7]
Path: Request # 500299/SELECT (25)/Pre Data Ship Plan (-1)/SELECT (0)/JOIN (0)/FETCH (0)
Name: FETCH
Execution Status: NOT EXECUTED. This operation was determined unnecessary or was cancelled before any rows were retrieved.
Rows Returned: 0
Estimated Rows Returned: Unknown (at least 0 rows)
Total execute time which include children time and wait time.: 0 sec
Foreground Data Source Read Time: 0 sec
Peak memory reserved: 0
Data source path: /shared/support/DataShip/postgresql14
Data source type: PostgreSQL
Data source driver name : PostgreSQL 12.0
Connection ID: 639537386
Data Ship Notes: Cost is 25 (274ms)
Data Ship SQL: SELECT
"products"."productid",
"products"."productname",
"products"."unitprice",
"products"."categoryid"
FROM "public"."products" "products"
SQL: SELECT
"products"."productid",
"products"."productname",
"products"."unitprice",
"products"."categoryid"
FROM "public"."products" "products"
ORDER BY "products"."categoryid"
■ ノード8(SQLServerからのFETCH)
Execution Statusに NOT EXECUTED と表示されており、最適化の結果、このFETCHが実行されなかったことを示しています。
Data Ship targetは、このSQLの内容が転送された先を表しており、これがノード3で使用している一時テーブルとなります。
[8]
Path: Request # 500299/SELECT (25)/Pre Data Ship Plan (-1)/SELECT (0)/JOIN (0)/FETCH (0)
Name: FETCH
Execution Status: NOT EXECUTED. This operation was determined unnecessary or was cancelled before any rows were retrieved.
Rows Returned: 0
Estimated Rows Returned: Unknown (at least 0 rows)
Total execute time which include children time and wait time.: 0 sec
Foreground Data Source Read Time: 0 sec
Peak memory reserved: 0
Data source path: /shared/support/DataShip/sqlserver2019
Data source type: SqlServer
Data source driver name : Microsoft SQL Server 2019
Connection ID: 1522430463
Data Ship target: /shared/support/DataShip/postgresql14/public/T_77707945_6D8A_40CE_9A5C_183249E8A78A_2
Data Ship Notes: Cost is 10 (59ms)
Data Ship Data Transfer Time: 62.2 msecs
Data Ship SQL: SELECT
[categories].[categoryname],
[categories].[categoryid]
FROM [tdv].[dbo].[categories] [categories]
SQL: SELECT
[categories].[categoryname],
[categories].[categoryid]
FROM [tdv].[dbo].[categories] [categories]
ORDER BY [categories].[categoryid]
補足
記事「ターゲットデータソースに実際に送信されたSQL文をログ出力する」の設定を行うと、一時テーブルのCREATE、DROP等の動きを確認することができます。
DEBUG [DSQ-0(jetty thread pool-419)] 2024-01-30 15:32:00.531 +0900 DDLEngine - Composite DDL statement submitted is USE SOURCE /shared/support/DataShip/postgresql14;
CREATE OR REPLACE TABLE "public".T_39D0A543_843A_4F3A_A3C4_0716DF1E1F80_0 (
CATEGORYNAME VARCHAR(50),
CATEGORYID BIGINT
);
DEBUG [DSQ-0(jetty thread pool-419)] 2024-01-30 15:32:00.551 +0900 DDLEngine - Printing post resolver DDL object
DEBUG [DSQ-0(jetty thread pool-419)] 2024-01-30 15:32:00.551 +0900 DDLEngine - com.compositesw.cdms.services.parser.UseSource@1c4d238a
[・・・省略・・・]
DEBUG [DSQ-0(jetty thread pool-419)] 2024-01-30 15:32:00.636 +0900 DDLEngine - Composite DDL statement submitted is USE SOURCE /shared/support/DataShip/postgresql14;
DROP TABLE "public".T_39D0A543_843A_4F3A_A3C4_0716DF1E1F80_0;
DEBUG [DSQ-0(jetty thread pool-419)] 2024-01-30 15:32:00.641 +0900 DDLEngine - Printing post resolver DDL object
データシップ最適化の詳細については、以下の製品ガイドをご参照ください。