2

サーバー上で同時に実行したい多数のストアド プロシージャがあります。理想的には、外部クライアントへの接続に依存せずに、すべてサーバー上で実行します。

これらすべてを起動して同時に実行するには、どのようなオプションがありますか (追加の作業を行うためにすべてのプロセスが完了するまで待つ必要さえありません)。

私は考えました:

  • クライアントから複数の接続を開始し、それぞれが適切な SP を開始する。
  • 各 SP のジョブを設定し、SQL Server 接続または SP からジョブを開始します。
  • xp_cmdshell を使用して、osql またはその他と同等の追加の実行を開始する
  • SSIS - より多くの SP を処理するためにパッケージを動的に記述できるかどうかを確認する必要があります。クライアントが本番環境にどの程度アクセスするかわからないためです。

ジョブとコマンドシェルのケースでは、おそらく DBA から許可レベルの問題に遭遇するでしょう...

SPリストをテーブル駆動できる場合、SSISは良い選択肢かもしれません。

これはデータ ウェアハウスの状況であり、作業はほとんど独立しており、NOLOCK は恒星で広く使用されています。このシステムは 8 ウェイ 32 GB のマシンなので、問題が発生した場合はロード ダウンしてスケール バックします。

私は基本的に3つのレイヤーを持っています.レイヤー1には少数のプロセスがあり、基本的にすでに読み込まれているすべての事実/次元に依存しています. 2 にはレイヤー 1 の一部またはすべてに依存するプロセスがいくつかあり、レイヤー 3 にはレイヤー 2 の一部またはすべてに依存するプロセスがいくつかあります。それらはレイヤー内で直交しているため、同時に特定のレイヤーでプロシージャーを実行します。

4

4 に答える 4

2

SSIS はあなたの選択肢ですか? ストアド プロシージャを同時に実行する並列 SQL 実行タスクを含む単純なパッケージを作成できます。ただし、ストアド プロシージャの動作によっては、これを並行して開始することでメリットが得られる場合と得られない場合があります (たとえば、それらがすべて同じテーブル レコードにアクセスする場合、ロックが解放されるまで待機する必要がある場合があります)。

于 2008-10-02T15:21:19.280 に答える
1

あなたはサービスブローカーを見たいと思うかもしれません、そしてそれはアクティベーションストアドプロシージャです...オプションかもしれません...

于 2008-10-05T18:05:54.860 に答える
1

最後に、実行可能なプロセスを非同期で起動し、接続を追跡する C# 管理コンソール プログラムを作成しました。

于 2010-02-23T21:33:22.930 に答える
1

ある時点で、私はAcumen Advantageという製品の設計作業を行いました。この製品には、これを行う倉庫管理者がいます。

このための基本的な戦略は、sprocs とその依存関係のリストを含むコントロール DB を用意することです。依存関係に基づいて、トポロジカル ソートを実行して実行する順序を指定できます。これを行う場合、依存関係を管理する必要があります。ストアド プロシージャのすべての先行操作は、実行前に完了する必要があります。複数のスレッドで順番に sproc を開始するだけでは、これだけでは達成できません。

これを実装することは、SSIS 機能の多くを頭から叩き、別のスケジューラを実装することを意味しました。これは製品としては問題ありませんが、オーダーメイドのシステムではやり過ぎです。したがって、より簡単な解決策は次のとおりです。

単一の SSIS パッケージと一連の sprocs が抽出からディメンションまたはファクト テーブルの生成までデータを取得するディメンション (サブジェクト指向 ETLとも呼ばれます) によって ETL を垂直に編成することにより、より大まかなレベルで依存関係を管理できます。通常、ディメンションは大部分がサイロ化されるため、相互依存性は最小限に抑えられます。相互依存性がある場合は、1 つのディメンション (またはファクト テーブル) の読み込みプロセスを、上流で必要なものに依存させます。

各ローダーは比較的モジュール化されており、ロード プロセスを並行して開始し、SSIS スケジューラに処理させることで、有用な程度の並列処理を実現できます。依存関係には、ある程度の冗長性が含まれます。たとえば、ODS テーブルは、ディメンションの読み込みが完了することに依存していない場合がありますが、アップストリーム パッケージ自体は、完了する前にコンポーネントをディメンション スキーマに直接渡します。ただし、これは次の理由により、実際には問題にはなりません。

  • ロード プロセスには、その間に実行できるタスクが他にもたくさんある可能性があります。
  • 最もリソースを消費するタスクは、ほぼ確実にファクト テーブルのロードであり、相互に依存することはほとんどありません。依存関係 (別のテーブルの内容に基づくロールアップ テーブルなど) がある場合、とにかくこれを避けることはできません。

SSIS パッケージを作成して、XML ファイルからすべての構成を取得し、場所を環境変数で外部的に指定できるようにすることができます。この種のことは、Control-M のようなスケジューリング システムでかなり簡単に実装できます。これは、変更された SSIS パッケージを、比較的少ない手動操作で展開できることを意味します。運用スタッフは、ストアド プロシージャと共に展開するパッケージを渡すことができ、SSIS パッケージの構成を手動でいじる必要なく、環境ごとに構成ファイルを維持できます。

于 2008-10-03T16:09:30.727 に答える