- ベストアンサー
アクセス負荷の分散
こんにちは。 あるクライアントから大量データでテーブル参照/更新をかける処理を実行し、高負荷がかかると、他のクライアントからはテーブルへアクセスが全く出来ない状態になってしまいます。 (その処理が終了すれば、アクセスできるようになります) このような状態を回避し、大量データ処理中であっても他のクライアントからのアクセスが可能となるような解決方法はあるのでしょうか?(もちろんパフォーマンスは落ちるとは思いますが) 素人質問で申し訳ありませんが、解決法をご存知の方がいらっしゃいましたらご回答をお願い致します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
単一のトランザクション内に多数のレコード更新があると、場合によっては更新するレコード数よりはるかに多い数のレコードがロックされ、そのトランザクションが終了するまで問い合わせができない場合があります。これはSQL Serverが持つ弱点の1つです。 単一の大きな、長時間を要する更新トランザクションのかわりに、小さな更新トランザクションに分割することが可能であれば、そうすることで、レコードがロックされている時間を短くすることができます。 そういう見直しが難しい場合は、SQL Serverの設定で「レコードロックからページロックへの移行」のパラメータを変更し、できるだけページロックに移行しないように設定すると、若干は状況が改善される可能性があります。 ただし、レコードロックからページロックへの移行は更新トランザクションのパフォーマンス向上のために行うことで、ページロックへの移行を少なくすると更新トランザクションのパフォーマンスが落ちる可能性があります。 それにより更新トランザクションの実行時間が長くなるとレコードロックされる時間も長くなるので、逆に問い合わせのパフォーマンスが落ちる可能性もあります。 パラメータを変更する場合には、いろいろパラメータを振って、どの程度影響があるか確かめてみてください。 それから、考慮の順番としては逆かもしれませんが、可能であればSQL Serverに使わせるメモリの量を増やしてみてください。大きなトランザクションでも、うまくキャッシュメモリに入れば高速に処理を完了することができますので。