この記事では、パイプラインでコピー アクティビティを使用して SQL データベースとの間でデータをコピーする方法について説明します。
サポートされている構成
コピー アクティビティの下の各タブの構成については、それぞれ次のセクションを参照してください。
全般
[全般設定] タブを構成するには、全般設定のガイダンスを参照してください。
情報源
コピー アクティビティの [ ソース ] タブの SQL データベースでは、次のプロパティがサポートされています。
次のプロパティは必須です。
接続: この記事の手順を参照する既存の SQL データベース を選択 します。
クエリを使用する: [テーブル]、[ クエリ]、または [ストアド プロシージャ] を選択できます。 次の一覧では、各設定の構成について説明します。
[詳細設定] では、次のフィールドを指定できます。
クエリ タイムアウト (分): クエリ コマンドの実行のタイムアウトを指定します。既定値は 120 分です。 このプロパティにパラメーターが設定されている場合、使用できる値は"02:00:00" (120 分) などの期間です。
分離レベル: SQL ソースのトランザクション ロック動作を指定します。 使用できる値は、 Read committed、 Read uncommitted、 Repeatable read、 Serializable、または Snapshot です。 詳細については、 IsolationLevel 列挙型 を参照してください。
パーティション オプション: SQL データベースからデータを読み込むのに使用するデータ パーティション分割オプションを指定します。 使用できる値は、 なし (既定値)、 テーブルの物理パーティション、 および動的範囲です。 パーティション オプションが有効になっている場合 ( None ではなく)、SQL データベースから同時にデータを読み込む並列処理の程度は、[コピー アクティビティの設定] タブ のコピー並列処理の次数 によって制御されます。
なし: パーティションを使用しない場合は、この設定を選択します。
テーブルの物理パーティション: 物理パーティションを使用する場合、パーティション列とメカニズムは、物理テーブルの定義に基づいて自動的に決定されます。
動的範囲: 並列が有効なクエリを使用する場合は、範囲パーティション パラメーター (
?DfDynamicRangePartitionCondition) が必要です。 サンプル クエリ:SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition。パーティション列名: 並列コピーの範囲パーティション分割で使用されるソース列の名前を 、整数型または date/datetime 型 (
int、smallint、bigint、date、smalldatetime、datetime、datetime2、またはdatetimeoffset) で指定します。 指定しない場合、テーブルのインデックスまたは主キーが自動検出され、パーティション列として使用されます。クエリを使用してソース データを取得する場合は、WHERE 句で
?DfDynamicRangePartitionConditionをフックします。 例については、「SQL データベースからの並列コピー」セクションを参照してください。パーティションの上限: パーティション範囲分割のパーティション列の最大値を指定します。 この値は、テーブル内の行をフィルター処理するためではなく、パーティションのストライドを決定するために使用されます。 テーブルまたはクエリ結果のすべての行がパーティション分割され、コピーされます。 指定されていない場合は、コピー アクティビティによって値が自動検出されます。 例については、「SQL データベースからの並列コピー」セクションを参照してください。
パーティションの下限: パーティション範囲分割のパーティション列の最小値を指定します。 この値は、テーブル内の行をフィルター処理するためではなく、パーティションのストライドを決定するために使用されます。 テーブルまたはクエリ結果のすべての行がパーティション分割され、コピーされます。 指定されていない場合は、コピー アクティビティによって値が自動検出されます。 例については、「SQL データベースからの並列コピー」セクションを参照してください。
その他の列: ソース ファイルの相対パスまたは静的な値を格納するデータ列を追加します。 エクスプレッションは後者に対応しています。 詳細については、「 コピー中に列を追加する」を参照してください。
行き先
コピー アクティビティの [ 宛先 ] タブの SQL データベースでは、次のプロパティがサポートされています。
次のプロパティは必須です。
接続: この記事の手順を参照する既存の SQL データベース を選択 します。
[テーブル] オプション: [ 既存のテーブルを使用] または [テーブルの自動作成] から選択します。
[既存のものを 使用] を選択した場合:
- テーブル: データを書き込む SQL データベースの名前を指定します。 ドロップダウン リストから既存のテーブルを選択するか、手動 で Enter キーを押してスキーマとテーブル名を入力します。
[テーブルの 自動作成] を選択した場合:
- テーブル: ソース スキーマにテーブル (存在しない場合) が自動的に作成されます。これは、ストアド プロシージャが書き込み動作として使用されている場合はサポートされません。
[詳細設定] では、次のフィールドを指定できます。
書き込み動作: ソースがファイル ベースのデータ ストアのファイルである場合の書き込み動作を定義します。 [挿入]、[アップサート]、または [ストアド プロシージャ] を選択できます。
挿入: ソース データに挿入がある場合は、このオプションを選択します。
アップサート: ソース データに挿入と更新の両方がある場合は、このオプションを選択します。
TempDB の使用: アップサートの中間テーブルとしてグローバル一時テーブルと物理テーブルのどちらを使用するかを指定します。 既定では、サービスは中間テーブルとしてグローバル一時テーブルを使用し、このチェック ボックスがオンになっています。
SQL データベースに大量のデータを書き込む場合は、このチェック ボックスをオフにして、Data Factory がステージング テーブルを作成してアップストリーム データを読み込み、完了時に自動クリーンアップするスキーマ名を指定します。 ユーザーがデータベースにテーブルの作成権限を持っていることを確認し、スキーマに対するアクセス許可を変更します。 指定しない場合は、グローバル一時テーブルがステージングとして使用されます。ユーザー DB スキーマの選択: TempDB の使用 が選択されていない場合は、Data Factory がステージング テーブルを作成してアップストリーム データを読み込み、完了時に自動的にクリーンアップするスキーマ名を指定します。 データベースにテーブルの作成権限があり、スキーマに対する変更権限があることを確認します。
注
テーブルを作成および削除するためのアクセス許可が必要です。 既定では、中間テーブルは宛先テーブルと同じスキーマを共有します。
キー列: ソースの行がコピー先の行と一致するかどうかを判断するために使用する列を選択します。
ストアド プロシージャ名: ドロップダウン リストからストアド プロシージャを選択します。
テーブルの一括挿入ロック: [はい ] または [いいえ] を選択します。 この設定を使用して、複数のクライアントからのインデックスがないテーブルに対する一括挿入操作中のコピーのパフォーマンスを向上させます。 詳細については、BULK INSERT (Transact-SQL) を参照してください。
コピー前スクリプト: 各実行のコピー先テーブルにデータを書き込む前に、コピー アクティビティを実行するスクリプトを指定します。 このプロパティを使用して、事前に読み込まれたデータをクリーンアップできます。
バッチの書き込みタイムアウト: バッチ挿入操作がタイムアウトするまでの待機時間を指定します。使用できる値は timespan です。 既定値は "00:30:00" (30 分) です。
書き込みバッチ サイズ: バッチごとに SQL テーブルに挿入する行数を指定します。 使用できる値は整数 (行数) です。 既定では行のサイズに基づいて、サービスにより適切なバッチ サイズが動的に決定されます。
最大同時接続数: アクティビティの実行中にデータ ストアに対して確立される同時接続の上限を指定します。 コンカレント接続数を制限する場合にのみ、値を指定します。
地図作成
[ マッピング ] タブの構成で、自動作成テーブルを対象として SQL データベースを適用しない場合は、[ マッピング] に移動します。
自動作成テーブルでSQLデータベースをコピー先として適用する場合、マッピングの構成を除き、変換先列の型を編集できます。 [スキーマの インポート] を選択した後、コピー先で列の種類を指定できます。
たとえば、ソースの ID 列の型は int であり、変換先列にマッピングするときに float 型に変更できます。
設定
設定 タブの構成については、設定タブのの下で他の設定を構成するに移動します。
SQL データベースからの並列コピー
コピー アクティビティの SQL データベース コネクタでは、データを並列にコピーするための組み込みのデータ パーティション分割が提供されます。 データ パーティション分割オプションは、コピー アクティビティの [ソース] タブにあります。
パーティションコピーを有効にすると、コピー アクティビティは SQL データベース ソースに対して並列クエリを実行し、パーティションごとにデータを読み込みます。 並列度は、[コピー アクティビティの設定] タブ の [コピーの並列処理の次数 ] によって制御されます。たとえば、 コピーの並列処理の次数 を 4 に設定すると、サービスは、指定したパーティション オプションと設定に基づいて 4 つのクエリを同時に生成して実行し、各クエリは SQL データベースからデータの一部を取得します。
特に SQL データベースから大量のデータを読み込む場合は、データ パーティション分割を使用して並列コピーを有効にすることをお勧めします。 さまざまなシナリオの推奨構成を以下に示します。 ファイルベースのデータ ストアにデータをコピーする場合は、複数のファイルとしてフォルダーに書き込む (フォルダー名のみを指定する) ことをお勧めします。この場合、1 つのファイルに書き込むよりもパフォーマンスが優れています。
| Scenario | 推奨設定 |
|---|---|
| 物理パーティションに分割された大きなテーブル全体から読み込む。 |
パーティション オプション: テーブルの物理パーティション。 実行中に、サービスによって物理パーティションが自動的に検出され、パーティションごとにデータがコピーされます。 テーブルに物理パーティションがあるかどうかを確認するには、こちらのクエリを参照してください。 |
| 物理パーティションがなく、データ パーティション分割用の整数または日時の列がある大きなテーブル全体から読み込む。 |
パーティション オプション: ダイナミック レンジ パーティション。 パーティション列 (省略可能): データのパーティション分割に使う列を指定します。 指定されていない場合は、インデックスまたは主キー列が使用されます。 パーティションの上限とパーティションの下限 (省略可能): パーティション ストライドを決定する場合に指定します。 これは、テーブル内の行のフィルター処理用ではなく、テーブル内のすべての行がパーティション分割されてコピーされます。 指定しない場合、コピー アクティビティは値を自動検出し、MIN 値と MAX 値によっては時間がかかる場合があります。 上限と下限を指定することをお勧めします。 たとえば、パーティション列「ID」の値の範囲が 1 ~ 100 で、下限を 20 に、上限を 80 に設定し、並列コピーを 4 にした場合、サービスによって 4 つのパーティションでデータが取得されます。ID の範囲は、それぞれ、20 以下、21 ~ 50、51 ~ 80、81 以上となります。 |
| 物理パーティションがなく、データ パーティション分割用の整数列または日付/日時列がある大量のデータを、カスタム クエリを使用して読み込む。 |
パーティション オプション: ダイナミック レンジ パーティション。 クエリ: SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>パーティション列: データのパーティション分割に使う列を指定します。 パーティションの上限とパーティションの下限 (省略可能): パーティション ストライドを決定する場合に指定します。 これは、テーブル内の行のフィルター処理用ではなく、クエリ結果のすべての行がパーティション分割されてコピーされます。 指定されていない場合は、コピー アクティビティによって値が自動検出されます。 たとえば、パーティション列「ID」の値の範囲が 1 ~ 100 で、下限を 20 に、上限を 80 に設定し、並列コピーを 4 にした場合、サービスによって 4 つのパーティションでデータが取得されます。ID の範囲は、それぞれ、20 以下、21 ~ 50、51 ~ 80、81 以上となります。 さまざまなシナリオのサンプル クエリを次に示します。 • テーブル全体に対してクエリを実行します。 SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition• 列の選択と追加の where 句フィルターを使用したテーブルからのクエリ: SELECT <column_list> FROM <TableName> WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>• サブクエリを使用したクエリ: SELECT <column_list> FROM (<your_sub_query>) AS T WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>• サブクエリ内のパーティションを使用したクエリ: SELECT <column_list> FROM (SELECT <your_sub_query_column_list> FROM <TableName> WHERE ?DfDynamicRangePartitionCondition) AS T |
パーティション オプションを使用してデータを読み込む場合のベスト プラクティス:
- データ スキューを回避するため、パーティション列 (主キーや一意キーなど) には特徴のある列を選択します。
- テーブルに組み込みのパーティションがある場合は、パフォーマンスを向上させるために、 パーティション オプションのテーブルの物理パーティション を使用します。
物理パーティションを確認するためのサンプル クエリ
SELECT DISTINCT s.name AS SchemaName, t.name AS TableName, pf.name AS PartitionFunctionName, c.name AS ColumnName, iif(pf.name is null, 'no', 'yes') AS HasPartition
FROM sys.tables AS t
LEFT JOIN sys.objects AS o ON t.object_id = o.object_id
LEFT JOIN sys.schemas AS s ON o.schema_id = s.schema_id
LEFT JOIN sys.indexes AS i ON t.object_id = i.object_id
LEFT JOIN sys.index_columns AS ic ON ic.partition_ordinal > 0 AND ic.index_id = i.index_id AND ic.object_id = t.object_id
LEFT JOIN sys.columns AS c ON c.object_id = ic.object_id AND c.column_id = ic.column_id
LEFT JOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_id
LEFT JOIN sys.partition_functions pf ON pf.function_id = ps.function_id
WHERE s.name='[your schema]' AND t.name = '[your table name]'
テーブルに物理パーティションがある場合、次のように、"HasPartition" は "yes" と表示されます。
表の概要
次の表に、SQL データベースのコピー アクティビティの詳細を示します。
情報源
| 名前 | Description | 価値 | 必須 | JSON スクリプト プロパティ |
|---|---|---|---|---|
| 接続 | ソース データ ストアへの接続。 | <接続> | イエス | 接続 |
| クエリを使用する | データを読み取る方法。 テーブルを適用して指定したテーブルからデータを読み取るか、SQL クエリを使用してデータを読み取るためにクエリを適用します。 | • テーブル • クエリ • ストアド プロシージャ |
イエス | / |
| テーブルの場合 | ||||
| スキーマ名 | スキーマの名前。 | < スキーマ名 > | いいえ | スキーマ |
| テーブル名 | テーブルの名前。 | < テーブル名 > | いいえ | テーブル |
| クエリの場合 | ||||
| クエリ | データを読み取るカスタム SQL クエリを指定します。 たとえば、 SELECT * FROM MyTableと指定します。 |
< SQL クエリ > | いいえ | sqlReaderQuery |
| ストアド プロシージャの場合 | ||||
| ストアド プロシージャ名 | ストアド プロシージャの名前。 | < ストアド プロシージャ名 > | いいえ | sqlReaderStoredProcedureName |
| クエリのタイムアウト (分) | クエリ コマンドの実行のタイムアウト。既定値は 120 分です。 このプロパティにパラメーターが設定されている場合、使用できる値は"02:00:00" (120 分) などの期間です。 | timespan | いいえ | クエリタイムアウト |
| 分離レベル | SQL ソースのトランザクション ロック動作を指定します。 | • 読み取りコミット済み • 未コミットの読み取り • 反復可能な読み取り •シリアライズ可能 •スナップショット |
いいえ | 隔離レベル (isolationLevel): • ReadCommitted • ReadUncommitted(リードアンコミット) • RepeatableRead (リピート可能な読み取り) •シリアライズ可能 •スナップショット |
| パーティション オプション | SQL データベースからデータを読み込むのに使用されるデータ パーティション分割オプション。 | •何一つ • テーブルの物理パーティション • ダイナミック レンジ |
いいえ | partitionOption: • PhysicalPartitionsOfTable (フィジカルパーティションズオブテーブル) • DynamicRange |
| ダイナミック レンジの場合 | ||||
| パーティション列名 | 並列コピーの範囲パーティション分割で使用される、 整数型または date/datetime 型 (int、 smallint、 bigint、 date、 smalldatetime、 datetime、 datetime2、または datetimeoffset) のソース列の名前。 指定しない場合、テーブルのインデックスまたは主キーが自動検出され、パーティション列として使用されます。 クエリを使用してソース データを取得する場合は、WHERE 句で ?DfDynamicRangePartitionCondition をフックします。 |
< パーティション列名 > | いいえ | パーティションカラム名 |
| パーティションの上限 | パーティション範囲分割用のパーティション列の最大値。 この値は、テーブル内の行をフィルター処理するためではなく、パーティションのストライドを決定するために使用されます。 テーブルまたはクエリ結果のすべての行がパーティション分割され、コピーされます。 指定されていない場合は、コピー アクティビティによって値が自動検出されます。 | < パーティションの上限 > | いいえ | partitionUpperBound |
| パーティションの下限 | パーティション範囲の分割のための、パーティション列の最小値。 この値は、テーブル内の行をフィルター処理するためではなく、パーティションのストライドを決定するために使用されます。 テーブルまたはクエリ結果のすべての行がパーティション分割され、コピーされます。 指定されていない場合は、コピー アクティビティによって値が自動検出されます。 | < パーティションの下限 > | いいえ | partitionLowerBound |
| 追加の列 | ソース ファイルの相対パスまたは静的値を格納するデータ列を追加します。 エクスプレッションは後者に対応しています。 | •名前 • 価値 |
いいえ | 追加列: •名前 •価値 |
行き先
| 名前 | Description | 価値 | 必須 | JSON スクリプト プロパティ |
|---|---|---|---|---|
| 接続 | コピー先データ ストアへの接続。 | <あなたの接続 > | イエス | 接続 |
| テーブル オプション | コピー先のデータ テーブル。 [ 既存のテーブルを使用する] または [テーブルの自動作成] から選択します。 | • 既存のものを使用する • テーブルの自動作成 |
イエス | schema テーブル |
| 書き込み動作 | ソースがファイル ベースのデータ ストアのファイルである場合の書き込み動作を定義します。 | •挿入する ・アップサート(更新挿入) • ストアド プロシージャ |
いいえ | 書き込み動作 •挿入する • アップサート (upsert) • sqlWriterStoredProcedureName |
| テーブルの一括挿入ロック | この設定を使用して、複数のクライアントからのインデックスがないテーブルに対する一括挿入操作中のコピーのパフォーマンスを向上させます。 | [はい] または [いいえ] (既定値) | いいえ | sqlWriterUseTableLock: true または false (既定値) |
| Upsert の場合 | ||||
| TempDB を使用する | アップサートの中間テーブルとしてグローバル一時テーブルと物理テーブルのどちらを使用するか。 | 選択済み(デフォルト)または未選択 | いいえ | useTempDB: true (既定値) または false |
| キー列 | ソースの行がコピー先の行と一致するかどうかを判断するために使用する列を選択します。 | < キー列> | いいえ | keys |
| ストアド プロシージャの場合 | ||||
| ストアド プロシージャ名 | このプロパティは、ソース テーブルからデータを読み取るストアド プロシージャの名前です。 最後の SQL ステートメントはストアド プロシージャの SELECT ステートメントにする必要があります。 | < ストアド プロシージャ名 > | いいえ | sqlWriterStoredProcedureName |
| コピー前スクリプト | 各実行のコピー先テーブルにデータを書き込む前に実行するコピー アクティビティのスクリプト。 このプロパティを使用して、事前に読み込まれたデータをクリーンアップできます。 |
<事前コピー スクリプト> (文字列) |
いいえ | preCopyScript |
| バッチ タイムアウト を書き込む | タイムアウトするまでに一括挿入操作の完了を待つ時間です。許容される値は期間です。 既定値は "00:30:00" (30 分) です。 | timespan | いいえ | writeBatchTimeout |
| 書き込みバッチ サイズ | バッチごとに SQL テーブルに挿入する行数。 既定では行のサイズに基づいて、サービスにより適切なバッチ サイズが動的に決定されます。 |
<行数> (整数) |
いいえ | 書き込みバッチサイズ |
| 最大同時接続数 | アクティビティの実行中にデータ ストアに対して確立されるコンカレント接続数の上限。 コンカレント接続数を制限する場合にのみ、値を指定します。 |
<コンカレント接続の上限> (整数) |
いいえ | maxConcurrentConnections |