次の方法で共有


企業での SSIS パッケージ データ フローのチューニング (SQL Server ビデオ)

適用対象 : Microsoft SQL Server Integration Services

作成者 : デイビッド ノーア、Microsoft Corporation

再生時間 : 00:15:50

サイズ : 68.1 MB

種類 : WMV ファイル

このビデオを見る

関連ヘルプ トピック :

CAST および CONVERT (Transact-SQL)

参照変換用のキャッシュを作成および配置する方法

キャッシュ接続マネージャを使用してフル キャッシュ モードの参照変換を実装する方法

データ フローのパフォーマンスの向上

テーブル ヒント (Transact-SQL)

TRUNCATE TABLE (Transact-SQL)

同期および非同期変換について

関連記事およびブログの投稿 :

Windows での過剰なネットワーク トラフィック発生時のスケーラビリティ向上

SQL Server Integration Services に関するベスト プラクティス トップ 10

データ読み込みパフォーマンス ガイド

その他のビデオ :

企業における SSIS パッケージのパフォーマンスの測定と理解 (SQL Server ビデオ)

SSIS データ フロー バッファについて (SQL Server ビデオ)

並列処理のための SSIS パッケージのデザイン (SQL Server ビデオ)

ビデオの概要

このビデオでは、Integration Services パッケージでデータ フローのパフォーマンスを向上させる方法を説明します。このビデオでは、データ フローの次の各フェーズをチューニングする方法を学習します。

  • 抽出
  • 変換
  • 読み込み

データ フローのデザイン、開発、および実行の際に、これらのパフォーマンス チューニング ヒントを適用できます。

謝辞

SSIS : パフォーマンス向上のためのデザインとチューニングに関する SQL Server ビデオ シリーズ」の資料提供においては、トマス カイザー氏にご協力いただきました。これは、当シリーズの 2 番目のビデオです。

カルラ サボータ氏とダグラス ラウデンシュラーガー氏からは、アドバイスと貴重なフィードバックを頂きました。ありがとうございました。

ビデオの内容

ビデオのタイムスタンプ 音声

00:00

こんにちは。デイビッド ノーアです。ここ Microsoft で SQL Server Integration Services のシニア ディベロップメント リードをしています。当ビデオ、「企業での SSIS パッケージ データ フローのチューニング」をご覧くださいましてありがとうございます。

これは、「SSIS : パフォーマンス向上のためのデザインとチューニング」という 4 部構成シリーズの 2 番目のビデオです。シリーズの第 1 回では、デニーが SSIS パッケージのパフォーマンスを適切に測定して理解する方法を説明しました。この回では、それを基に、SSIS パッケージ データ フローのパフォーマンスを向上させる方法を見ていきます。まず、すべてのデータ フローに共通のテーマを特定し、パフォーマンスを向上させるために最初に調整する必要があるデータ フロー部分を選択する方法を確認します。パフォーマンスの問題が発生している箇所を特定できると、データ フローをより速く効率的に実行するために、さまざまな対策を講じることができます。ここでは、データ フローのデザイン、開発、さらには実行に際して適用できる、一連の具体的なヒントを確認します。

それでは見ていきましょう。

ほとんどのパッケージ データ フローでは、ETL とも呼ばれる、抽出、変換、読み込みの処理を重要なデータに対して行います。データ フローのチューニングでは、このようなデータ フローの抽出、変換、読み込みという各フェーズをチューニングします。

抽出では、SSIS ソース コンポーネントとそれらによって実行されるクエリをチューニングすることによって、ソース システムに対する影響を最小限に抑えながらパフォーマンスを最大化する方法を説明します。

データ フローにおける変換のチューニングでは、行う必要がある作業を確認し、その作業を行う最適な方法を選択します。ここでは、不要な手順を排除すると共に、自動で変換が行われるように元のソース クエリを適宜変更します。

最後に、データ フローの読み込み処理のチューニングとして、SSIS 変換先コンポーネント、ネットワーク、ロックなど、データを変換先に読み込む際にデータ フロー処理の妨げとなる可能性がある要素をチューニングします。

このビデオでは、データ フローの 3 つのフェーズすべてを対象に、チューニングが必要な箇所を探すために役立つ、実用的なヒントを説明します。

これらのヒントを確認する前に、1 つ理解しておくことがあります。それは、通常、パフォーマンスの問題に対処するときに確実な方法はないということです。ここで説明するヒントをどれか使用して、データ フローで発生するパフォーマンスの問題をすべて修正できるわけではありません。一般的なケースでは、ここで説明するヒントが役立ちますが、個々の問題は、単に多数のヒントを使用するだけでは解決しません。最も確実なのは、常にデータ フローの意図を理解し、その目的に合うようにデータ フローを適切にデザインすることです。この場合、現在のパフォーマンスを測定した後で、データ フローに対して何度も変更を加えながら、その変更によってパフォーマンスが向上したかどうかを測定します。

また、パフォーマンスの問題を確認する際、よく知っているテクノロジやコードがある場合などに、そうした特定のテクノロジやコンポーネントにばかり目を向けがちです。しかし、どんな理由があるにせよ、生態系全体、つまり、一般的には複数のリレーショナル データベース、ネットワーク、オペレーティング システム、ファイル システムといった多数の要素を含んだコンテキストを念頭に置いて、データ フローを検討するようにします。この生態系全体を詳しく知れば知るほど、いずれかの要素が直面している実際のパフォーマンスの問題に関して、より完全な状況を把握できるようになり、より効率的かつ安全な変更を行えるようになります。

03:38

それでは、データ フローの開始点である抽出から見ていきましょう。ソースとして SQL Server または他のデータベースをバルク インターフェイスで使用する場合は、パケット サイズを大きくしてみてください。通常は、SQL Server の既定値 "4096" で問題なく動作しますが、抽出により大量のデータを移動するため、この値を増やす方が賢明です。これを有効にするには、ネットワーク管理者に依頼してネットワークで "特大のフレーム" を有効にする必要があります。ただし、パッケージでこの効果をテストすることが必要です。OLE DB ソースのような一括操作と (OLE DB コマンドのような) 単一行操作で同じ接続マネージャを使用している場合は、OLE DB コマンド操作用として 2 つ目の接続マネージャを作成し、こちらでは小さいパケット サイズを扱うことを検討します。

お気付きのように、ETL を Windows 2008 で実行しており、複数の NIC が備わったマルチコア コンピュータを使用している場合は、ネットワーク カードを個々のコアに関連付けることによってネットワーク パフォーマンスを少し向上させることができます。詳細については、MSDN サイトにあるブログの投稿「Windows での過剰なネットワーク トラフィック発生時のスケーラビリティ向上」を参照してください。

抽出のチューニングで最も簡単に行えることの 1 つは、使用するクエリのチューニングです。単に抽出元のテーブルを選択する方が簡単なので、その方法ですべての列を取得してしまいがちですが、実際に必要な列のみを選択した方が、はるかに良い結果が得られます。この場合、ネットワーク トラフィックとメモリの使用量が減るだけでなく、データベース サーバーがクエリの要求を満たすために必要とする I/O も大幅に減る可能性があります。

ご覧いただいているように、SQL Server ではヒントを使用して、選択の実行中に共有ロックが発行されないことを示すこともできます。この場合、コミットされていないデータやダーティ データをクエリが読み取る可能性もあります。この操作を行うのは、どうしてもパフォーマンスを最優先させる必要があり、かつ、ETL ジョブでダーティ データを読み取ってもまったく問題がないことがわかっている場合に限定してください。

参照は、抽出とも変換とも考えられますが、どちらにせよ、前のスライドで示したのと同じ考え方を一部当てはめる必要があります。ここでは、ネットワークの最適化のためだけでなくインメモリ キャッシュの最適化のためにも、必要な列のみを選択することがいっそう重要です。

SQL Server 2008 を使用している場合、パフォーマンスの向上に最適な機能の 1 つとして、新しい共有参照キャッシュの追加が挙げられます。参照キャッシュを共有すると、参照データを一度フェッチした後、パッケージ内の複数の参照操作で再利用することも、キャッシュをファイルに保存することによって複数のパッケージで再利用することもできます。同じテーブルを参照する参照コンポーネントが複数ある場合は、パッケージの速度を大幅に高める手段として、この新しいオプションを検討します。このオプションは非常に簡単に利用できる可能性があります。パッケージ内でキャッシュ接続マネージャを作成し、新しいキャッシュ変換を使用してキャッシュにデータを設定します。次に、このキャッシュ接続を参照して参照データを取得するように、参照を変更します。

06:29

続いて、ETL の 2 番目のフェーズである変換について見ていきましょう。変換では、既にデータ フローに読み込まれたデータを処理して、後で読み込めるように正しい形状に変えます。SSIS では、すべての変換が、デザイン上にドラッグ可能なオブジェクトとして表示されますが、すべての変換が同じ性質になるわけではありません。それでは、SSIS にある 3 種類の変換について確認してみましょう。

  • 1 つ目は、行に基づいた同期変換です。データのバッファを直接操作します。この変換では、処理に際してデータ バッファや行のコピーは作成されず、バッファ内のデータが直接変換されます。そのため、同期変換はかなり高速で行われます。同期変換の例としては、データ変換、派生列、参照があります。
  • 2 つ目は、部分ブロックによる非同期変換です。データがこれらの変換に渡された場合、その変換では、作業を行うためにデータを保持しておく必要があります。そのため、入力データが内部バッファにコピーされ、必要な量のメモリが消費されます。場合によっては大量のメモリが消費されることもあります。変換に渡されたデータが増えてくると、次の処理に進む準備が整ったと判断され、出力データが書き込まれます。このとき、保持していた内部メモリの該当部分が解放されます。データ フローが完了したら、使用されていたすべてのメモリが解放されます。しかし、それまでの間は、通常、かなり多くのデータが消費されます。
    このような種類の変換の例としては、マージ、マージ結合、全体結合があります。データ フローにこれらの変換がある場合は、最適化が可能かどうかを検討します。その際、これらの冗長コピーがないかどうか、ソース システムのレベルで処理できるマージ結合や結合がないかどうか、などの点を確認します。以前に見たことがあるパッケージの中には、ソースで SQL 結合を記述するだけで済むにもかかわらず、ソース クエリで JOIN を実行する代わりに、OLE DB ソースを使って 2 つのテーブルからすべてのデータをフェッチしてから、パッケージ内でマージ結合を使って結合を行っているものがありました。このケースでは、データベースの機能を利用して対象のクエリを最適化すれば、処理速度を大幅に高めることも可能でした。このような箇所を探して、非同期変換を統合し、その数を減らすようにしてください。
    SQL Server 2008 では、データ フロー タスク スケジューラの機能が充実し、複雑なデータ フローのパフォーマンスを向上させながら、使用可能な CPU をより効率的に活用できるようになっています。SQL Server 2005 で SSIS を使い始めたユーザーの場合、データ フローに全体結合変換を組み込んで、人為的に実行ツリーの分割と並列処理を行うようにしている可能性があります。このような方法による処理は不要になりました。SQL Server 2008 では機能が強化されたため、この処理は必要なく、非推奨になっています。このような人為的な全体結合コンポーネントがある場合は、それらを削除することで、パフォーマンスが向上します。
  • 3 つ目のグループは、ブロックによる非同期変換です。この変換では、出力データを書き込む前に入力データのすべてを保持する必要があるため、前のグループの動作を極端にしたような変換であると言えます。データ フロー内でこのような変換に大きなバッチのデータを渡すと、データ フローの速度が大きく低下することも少なくありません。大きなデータ フローでは、このような変換が重複して使用されることのないようにしてください。同じフローの同じデータで、2 つの集計または 2 つの並べ替えが使用されている場合は、1 つになるようにパッケージを修正できないか検討します。

これで基本的な内容の説明が終わりました。続いて、その他の具体的なヒントを少し見ていきましょう。

  • データ フローでは、列のデータ型の変換が必要になることがよくあります。この処理は一度しか行わないようにし、データ バッファを小さくするためにできるだけ範囲の狭い型を使用するようにします。データのキャストにも CPU 時間がかかるので、データ フロー全体で、ある特定の列に 1 つの型を使用できる場合は、SQL の CAST 関数または CONVERT 関数 (あるいは使用するデータベースの SQL 言語にある同等の関数) を使ってデータ ソースでその列をキャストすることを検討します。
  • 少し前のスライドでも述べましたが、どこで変換を行う必要があるのかを考えることで変換を最適化できます。その際、効率化を図るため、ソースで SQL を使用することをためらわないようにします。たとえば、ソース データを並べ替える場合には、その処理をソース レベルで SQL の ORDER BY 句を使って行うことを検討します。データベースの方が、データ フローよりもはるかに効率的にデータを並べ替えて返すことができる可能性があります。並べ替えコンポーネントは、このような場合ではなく、複数のソースから 1 つにマージされたデータを並べ替える必要がある場合に使用します。同様に、集計の場合も、ソース レベルで GROUP BY および SQL 集計関数を使った方が高速になる可能性があります。
  • SQL Server 2008 で、緩やかに変化するディメンション (SCD) コンポーネントを使用している場合は、SQL Server の新しい MERGE 機能に切り替えることを検討します。MERGE で実行できる作業は SCD とほぼ同じですが、ネットワーク ラウンド トリップの回数は大幅に減ります。
  • SQL の INSERT INTO 機能が役立つかどうかも忘れず検討します。データ フローが単純であり、ソースと変換先が共に同じデータベース インスタンス上にある場合は、単一の SQL ステートメントによってデータ移動を完全にデータベース上で行うことで、同じデータ移動をはるかに高速に行える可能性があります。このような場合、INSERT INTO を実行すると、データをサーバーから取り出す必要がないので、データ フローに比べて桁違いの速さで処理を行うことができます。
  • 最後に忘れてはならないこととして、増分読み込みを行っている場合は、代わりに単純に再読み込みを行う方法を検討します。これまでに見てきたシステムの中には、データの再読み込みを避けるために長い時間を費やして差分を検出し、その処理に I/O や CPU が使用されることで結果的にはジョブの処理が極端に遅くなっている例もありました。

11:59

続いて、読み込みフェーズについて見ていきましょう。

SQL Server にデータを読み込む場合は、パフォーマンスが高い 2 つのオプションを利用できます。

  • 最初のオプションは SQL Server 変換先コンポーネントです。このコンポーネントでは、データ フローとデータベース エンジンの間で共有メモリが使用され、すばやくデータが読み込まれます。ただし、このコンポーネントが動作するのは、データ フローが常に SQL Server 自体と同じコンピュータ上で実行される場合に限られます。また、SQL Server 変換先には、エラー処理に関して既知の制限事項がいくつかあります。
  • SQL Server にデータをすばやく読み込むためのもう 1 つのオプションは OLE DB 変換先です。多くの場合、これは SQL 変換先とほぼ同じ速度で実行できます。

これらのすべてについて、コミットのサイズを 0 にすると、読み込みが最も速くなります。

大規模な読み込みを行う場合、変換先システムのインデックスを削除することも広く行われていますが、いつ削除するかに関して、いくつかのガイドラインに従う必要があります。一般的なガイドラインでは、読み込みによる予想増加率と、テーブルに設定されているインデックスの種類に基づいて、インデックスを削除するかどうかを決定します。

  • テーブルに単一のクラスタ化インデックスが設定されている場合は、インデックスを削除しないでください。テーブル データはこのキーで並べ替えられるので、クラスタ化インデックスがある状態でそのままデータを読み込むのにかかる時間よりも、削除、挿入、および再構築にかかる時間の方が実質的に長くなります。
  • テーブルに単一の非クラスタ化インデックスが設定されている場合は、読み込みによりデータ サイズが約 100% 増加するのであれば、インデックスを削除することを検討します。これは正確な値ではなく大体の目安ですが、大まかに言って、テーブルのサイズが 2 倍にならないのであれば、おそらくインデックスを削除して再構築する価値はありません。
  • テーブルに複数のインデックスが設定されている場合は、大体の目安を付けることがかなり難しくなります。個人的には、増加率 10% が大体の目安ではないかと思います。たとえば、読み込みによる増加率が現在のサイズの 10% 未満であれば、おそらくインデックスをそのまま残す方が効率的です。ただし、ここで最も確実なのは、実際にテストを行って結果を測定する方法です。

他の処理が実行されているテーブルにデータを読み込む場合は、その方法を工夫する必要があります。一括読み込みを行うと、多くの場合、すべてではなくても、ほとんどの変換先テーブルに制限が適用されます。これに問題がないことを確認するか、パーティション分割を使用するようにしてください。運用中のデータベースにデータを読み込む必要がある場合は、現在運用中のデータをアクティブな状態で維持できるように、読み込み先となるパーティションを設定できます。読み込みが遅い場合は、そのテーブルまたはパーティションで他にどのような処理が行われているかを調べ、競合している処理がないことを確かめます。

一括読み込みとパーティションのパフォーマンス向上に関する役立つガイドについては、MSDN にある SQLCAT の記事「データ読み込みパフォーマンス ガイド」を参照してください。

また、再読み込みを行う場合は、削除がトランザクション単位にならないように、DELETE ではなく TRUNCATE を使用してデータを消去します。

ネットワーク接続を使用する変換先でも、既に説明したのと同じネットワークの問題が発生します。読み込み時に最適のパフォーマンスが得られるように、パケット サイズを大きくして、ネットワークで "特大のフレーム" を有効にすることを検討します。

15:02

以上で、このパフォーマンス シリーズの第 2 回は終了です。今回、トマスには、このビデオ シリーズの基礎となる多くの有益な情報を提供していただきました。また、カルラとダグラスからは、このシリーズの作成に関するさまざまなアドバイスを頂きました。ありがとうございました。これらのトピックの詳細については、「SQL Server Integration Services に関するベスト プラクティス トップ 10」を参照してください。

ご覧くださいましてありがとうございました。このビデオ シリーズ「SSIS : パフォーマンス向上のためのデザインとチューニング」には、他に 3 つのビデオがありますので、そちらもご覧ください。このビデオが皆様のお役に立ちましたら幸いです。また、皆様からのご感想をお待ちしております。その際には、ビデオ ホーム ページの右上にある、評価とフィードバックのリンクをご利用ください。

参照

その他の技術情報

SQLCAT チーム

ヘルプおよび情報

SQL Server 2008 の参考資料の入手