sql >> データベース >  >> RDS >> Sqlserver

SQL Serverのブロックとは何ですか?

    SQL Serverのブロックは、SQLServerデータベースシステムの通常の特性です。ブロッキングは、SQL Serverが複数のクライアントからの要求を処理していて、異なるプロセスが同時に同じリソースを要求している場合に発生します。リソースが使用中の場合、そのリソースはロックされ、後続のリクエストで使用できなくなります。そのため、リソースが解放されて再び使用可能になるまで、プロセスは遅延されます。 SQL Serverブロックは通常、パフォーマンスに目立った影響を与えることなく自動的に解決されます。ただし、場合によっては、最初のプロセスがリソースを解放する前に長期間ロックするか、最初のプロセスがリソースをまったく解放しないために、ブロックによってパフォーマンスが低下することがあります。これにより、ブロックが解放されるまでリソースにアクセスできなくなります。手動で解決しました。

    一連のリソースがかなりの時間ブロックされると、パフォーマンス品質が低下し、システムユーザーが問題に気づき始めます。これらの問題には、クエリの実行に時間がかかる、タイムアウトする、ユーザーが変更した画面を保存できないなどの問題が含まれます。

    SQLServerブロックを修正する方法

    SQL Serverブロッキングの短期的な解決策は、パフォーマンスが1つまたは複数のブロックによって悪影響を受けていることに気付いたときに、トランザクションを識別して手動でブロックを解除することです。

    SQL Serverブロックの存在を確認したら、SQL Serverアクティビティモニターを確認し、最も問題の原因となっているクエリを強制終了します。 SQLスクリプトを使用して、SQLServerのロックとブロックの状態を継続的に監視することもできます。 Brent Ozarは、指定されたブロッキングしきい値を超えたときにSQL Serverが通知するように、ブロッキング固有のパフォーマンスカウンターを追加することを提案しています。

    SQLServerのブロックを防ぐ方法

    データベース管理者は、SQLServerブロックを修正する方法を知っていると便利です。ただし、高性能のシステムを維持するためには、ブロッキングの発生を防止する、または少なくとも最小限に抑える方法を知っておくとよいでしょう。一般的な種類のSQLServerブロッキングを最小限に抑えるための4つのヒントを次に示します。

    1。インデックスを使用する

    使用率の高いテーブルでクラスター化インデックスを使用すると、クエリオプティマイザーにインデックススキャンの代わりにインデックスシークを実行するように求めることで、ブロッキングを減らすことができます。更新中のレコードのみがロックされている場合、後続のプロセスはロックを回避して完了することができます。

    UPDATEステートメントとDELETEステートメントがインデックスを使用していることを確認することも重要です。インデックスは、UPDATEステートメントとDELETEステートメントが、非クラスター化インデックスまたはインデックスヒントを使用してロックを削除することで取得する変更ロックの数を減らすのに役立ちます。

    2。クエリをクリーンアップする

    SQL Serverブロックを回避するためのベストプラクティスの1つは、長いトランザクションを複数の短いトランザクションに分割することです。長時間実行されるクエリは、トランザクションの間ロックを保持し、他のプロセスがリソースを使用できないようにします。長いトランザクションを短いトランザクションに分割すると、データが移動し続けます。

    SQL Serverチューニングを使用して、クエリを可能な限り効率的にすることを検討してください。優れたクエリオプティマイザは、パフォーマンスを低下させる可能性のあるブロックの数を減らすように構成されるまで、クエリを書き込んだり書き直したりします。

    3。 SQLServerブロッキングの根本原因を特定する

    時間の経過とともにパフォーマンスメトリックを追跡することは、SQLServerのブロックを回避するための優れた方法です。頻繁にブロックされるセッションと関連するステートメントを特定することで、インデックス作成、クエリの最適化、またはその他の手段を通じて、繰り返し発生するブロックの根本原因を取り除くための一連のアクションを決定できます。

    ブロッキングの根本的な原因を探すもう1つの場所は、システムのワークロードです。ワークロード分析を実行して、増加があったかどうかを判断します。ワークロードが重すぎると、ロックされたリソースへのアクセスを待機するクエリの数が増えるため、SQLServerがブロックされます。重いワークロードのパフォーマンスの問題を解決するには、インデックスを追加したり、複数のデータベースにワークロードを分散したりする必要がある場合があります。

    4。統計を最新の状態に保つ

    変更を考慮してプランが更新されていないため、統計が古くなると、非効率的なクエリプランが実行される可能性があります。 SQL Serverは検索クロールを起動して、移動または欠落しているデータを探します。これにより、ブロックが作成されます。

    統計を最新に保つ最も効果的な方法は、できるだけ多くの更新を自動化することです。自動更新をスケジュールできない場合は、スケジュールされたメンテナンスチェックリストに手動更新を追加して、更新が定期的に行われるようにしてください。

    SQL ServerのブロックはDBAの生活の事実かもしれませんが、SQLServerデータベースのパフォーマンスへの影響を軽減する方法があります。上記の戦略のいくつかを実装することにより、ブロックとブロック解除のサイクルを断ち切ります。少しの計画、最適化、および自動化により、SQL Serverブロッキングの発生を減らすことができ、状況によっては、それを完全に根絶することができます。


    1. MySQLのVARCHARとTEXTの違い

    2. Pymysql Cursor.fetchall()/ Fetchone()はなしを返します

    3. ナンバーシリーズジェネレータチャレンジソリューション–パート2

    4. 1つの行をより少ない列で複数の行に変換します