8

私は SSIS を初めて使用し、いくつか質問があります

  1. 同じデータベース内のあるテーブルから別のテーブルに 1,25,000 行を転送したいと考えています。しかし、私が使用するData Flow Taskと、時間がかかりすぎます。と を使用してみADO NET DestinationましたOLE DB Destinationが、パフォーマンスは受け入れられませんでした。同等のクエリを 内に記述したExecute SQL Taskところ、許容できるパフォーマンスが得られました。なぜこんなにも性能に差が出るのか。

    INSERT INTO table1 select * from table2

  2. 最初の観察に基づいて、パッケージを変更しました。これはExecute SQL Tasks、直接クエリまたはストアド プロシージャのいずれかのみで構成されます。のみを使用して問題を解決できる場合Execute SQL Task、非常に多くのドキュメントや記事が示すように、なぜ SSIS を使用するのでしょうか。信頼性が高く、保守が簡単で、比較的高速であることを確認しました。

4

2 に答える 2

28

性能の違い

「単純な」データ フロー タスクおよび同等の SQL 実行タスクのパフォーマンスを引き起こす可能性のある要因は多数あります。

  1. ネットワーク遅延。同じサーバーとインスタンスで、テーブル b からテーブル a への挿入を実行しています。SQL 実行タスクでは、その作業はすべて同じマシンで実行されます。サーバー B でパッケージを実行して、サーバー A から 125 万行をクエリし、ネットワーク経由でサーバー B にストリーミングします。そのデータは、対応する INSERT 操作のためにサーバー A にストリーミングされます。ネットワークが貧弱で、データの幅が広く (特にバイナリ型)、または単にサーバー間の距離が離れている (サーバー A が米国にあり、サーバー B がインドにある) 場合、パフォーマンスが低下します。
  2. メモリ不足。パッケージがターゲット/ソース データベースと同じサーバー上で実行されると仮定すると、データ フロー タスクはメモリ内エンジンであるため、依然として低速になる可能性があります。つまり、ソースから宛先に流れるすべてのデータがメモリに格納されます。SSIS が取得できるメモリが多いほど、処理速度が速くなります。ただし、SQL Server 自体だけでなく、メモリの割り当てについても OS と戦う必要があります。SSIS は SQL Server Integration Services ですが、SQL Server データベースと同じメモリ空間では実行されません。サーバーに 10 GB のメモリが割り当てられていて、OS が 2 GB を使用し、SQL Server が 8 GB を要求している場合、SSIS が動作する余地はほとんどありません。SQL Server にメモリの一部を放棄するように要求することはできないため、OS はページ アウトする必要があり、データの細流が制限されたデータ パイプラインを通過します。
  3. お粗末な目的地。使用している SSIS のバージョンに応じて、OLE DB 変換先の既定のアクセス モードは "テーブルまたはビュー" でした。これは、低レベルのロックがテーブル ロックにエスカレートするのを防ぐのに適した設定です。ただし、これは行の挿入を苦しめることによって行になります (1.25M の一意の挿入ステートメントが送信されます)。Execute SQL Tasks INSERT INTO のセットベースのアプローチとは対照的です。SSIS の最近のバージョンでは、デフォルトでアクセス方法が宛先の「高速」バージョンに設定されています。これは、セットベースの同等の機能と同様に動作し、パフォーマンスが向上します。
  4. OLE DB コマンド変換。OLE DB Destinationがあり、これをOLE DB Command Transformationと混同する人もいます。これらは、用途が異なる 2 つの非常に異なるコンポーネントです。前者は宛先であり、すべてのデータを消費します。それは非常に速く進むことができます。後者は常にRBAR です。それを通過する各行に対してシングルトン操作を実行します。
  5. デバッグ。BIDS/SSDT でパッケージを実行するとオーバーヘッドが発生します。そのパッケージの実行は、DTS Debugging Host でラップされます。これにより、パッケージの実行が「重要ではない」ほど遅くなる可能性があります。実行する SQL タスクについて、デバッガーができることはあまりありません。実行するかしないかです。データフロー、検査、監視などできるメモリがたくさんあるため、利用可能なメモリの量が減り(pt 2を参照)、実行中のさまざまなチェックのために速度が低下します。より正確な比較を行うには、常にコマンド ライン (dtexec.exe /file MyPackage.dtsx) からパッケージを実行するか、SQL Server エージェントからスケジュールします。

パッケージデザイン

Execute SQL Task単なるsである SSIS パッケージには、本質的に問題はありません。クエリを実行することで問題が簡単に解決できる場合は、SSIS を完全に忘れて、適切なストアド プロシージャを作成し、SQL エージェントでスケジュールして完了します。

多分。このような「単純な」ケースでも SSIS を使用することで私が気に入っているのは、一貫した成果物を保証できることです。大したことではないように聞こえるかもしれませんが、メンテナンスの観点からは、すべてがこれらのソース管理されたSSISパッケージに含まれているデータをいじっています。タスク AC は「単純」であるため、SQL エージェント ジョブから呼び出されるストアド プロシージャであることを新しい人に覚えたり、トレーニングしたりする必要はありません。タスク DJ、または K はそれよりもさらに単純なので、データをロードするためにエージェント ジョブで「インライン」クエリを実行するだけで、残りのパッケージを取得できます。Service Broker と一部の Web サービスを除いて、それらもデータベースを更新します。年齢を重ねるほど、触れる場所が増えるほど、やり過ぎであっても一貫したソリューション提供へのアプローチに価値を見出すことができます。

パフォーマンスがすべてではありませんが、SSIS チームは SSIS を使用して ETL ベンチマークを設定したため、一部のデータを急いでプッシュする機能を確実に備えています。

この回答が長くなるにつれて、SSIS の利点とストレート TSQL に対するデータ フローがネイティブであり、そのまま使用できるため、そのままにしておきます。

  • ロギング
  • エラー処理
  • 構成
  • 並列化

私のお金でそれらを打ち負かすのは難しい.

于 2013-04-24T02:32:39.577 に答える