SQL Server フォーラムの ログリーダー エージェントのMax Worker Threadの変更 のスレッドで知りました。
SQL Server Agent の KB として以下の情報があります。
SQLAGENT ジョブのワーカー スレッドを待機しています。
この KB の情報でレジストリの値を変更する手順が記載されていますが、SQL Server 2005 以降については、レジストリによる変更ではなく、msdb の syssubsystems テーブルの内容を直接修正することで設定を変更することになるようです。
# レジストリの変更は SQL Server 7.0 / 2000 を使用している場合の設定変更方法になります。
syssubsystems はシステムテーブルですが、直接修正することが可能です。
この値を修正して SQL Server Agent を再起動すると、エージェントジョブの max worker thread 数を変更することができるようです。
現状の設定は以下のようなクエリで確認することができます。
exec msdb..Sp_enum_sqlagent_subsystems |
フォーラムで回答させていただいていて、最初は SQL Server の sp_configure で確認できる max worker thread かと思っていたのですが、SQL Server Agent のジョブにサブシステム単位の同時ステップの最大数というものが設定されているのですね。
2013/05/28 追記
コメントをいただいたので SQL Server 2012 について調べてみました。
SQL Server Agent のサービスを起動した際に、Agent の初期化処理が流れるのですがその際に [SQLAgent – Subsystems refresher] というアプリケーション名で処理が行われている個所があります。
その中で、[EXECUTE msdb.dbo.sp_enum_sqlagent_subsystems_internal @syssubsytems_refresh_needed = 1] が実行されているのですが、このストアドプロシージャ内では [dbo.sp_verify_subsystems] が実行されています。
SQL Server 2012 の sp_verify_subsystems では、以下の内容が追加されています。
— Fix for #525111 – when MSDB is restored from any other sqlserver, it is possible that physical path to agent_exe, subsystem_dll may not be valid on current server
– It is better to delete all records in this table and reinsert them again
— perform delete and re-insert operations within a transaction
TRUNCATE TABLE syssubsystems
SQL Server 2012 に関してはコメントでご指摘いただいたように、SQL Server Agent の起動時にテーブルを初期化してレコードを再作成しているため、テーブルを更新してもサービスを再起動することで設定が初期化されてしまうようですね。
フォーラムで話題に上がっていた LogReader については [25 * processor_count] というように CPU のコア数に応じて自動設定されているようです。
# SQL Server 2008 R2 も同様の設定でした。
コメントを見ると msdb バックアップを取得したサーバーと異なる環境にリストアした際のパスの設定に対する対応のようですので、以下の KB を考慮した実装なのかもしれないですね。
Error message when you restore or attach an msdb database or when you change the syssubsystems table in SQL Server 2005: "Subsystem % could not be loaded"
このストアドプロシージャはスキーマが dbo になっており、ALTER 文で変更可能なので、 SQL Server 2012 の場合はこのストアドプロシージャを直接調整する形になるのでしょうかね??
修正プログラムの類を適用したら初期化されてしまわないかが気になりますが。
こんにちは。どうしても気になったのでコメントしますね。
msdb.dbo.syssubsystemsの変更ですが、SQL Server 2012では有効な対処となりません。
試していただくとわかるのですが、Agentの再起動のタイミングで元の値になってしまいます。
現時点においては、2008R2まで有効な対策となるかと思います。
Yoshihiro Matsumoto
27 5月 13 at 23:32
なるほど。2008 R2までは試したのですが2012は試していませんでした。
システムテーブルの説明で2012が入っていなかったのが気になったのですが、そういう理由なのですね。
コメントありがとうございます!!
Masayuki.Ozawa
27 5月 13 at 23:34