複数のクライアントを同時に処理する DB キューとして SQL Server を使用する
複数のクライアント間で同時にキューからのコマンドを効率的に処理する能力は、 SQL Server をデータベース キューとして使用する場合に不可欠です。これを実現するには、特定の構成とクエリの最適化を実装する必要があります。
1 つのアプローチには、次のようなクエリで悲観的ロックを使用することが含まれます。
select top 1 COMMAND from EXAMPLE_TABLE with (UPDLOCK, ROWLOCK) where PROCESSED=false;
ただし、この戦略では複数のクエリの間で競合が発生する可能性があります。同じ行ロックを取得しようとしているワーカー。より効果的な解決策は、SQL Server 2005 で導入された OUTPUT 句を利用することです。
OUTPUT 句を使用すると、アトミックなデキュー操作が可能になります。これにより、適切な行の検索、ロックされた行のスキップ、および選択した行のデキュー済みとしてのマーク付けが 1 回の操作で容易になります。
with CTE as ( SELECT TOP(1) COMMAND, PROCESSED FROM TABLE WITH (READPAST) WHERE PROCESSED = 0) UPDATE CTE SET PROCESSED = 1 OUTPUT INSERTED.*;
最適なパフォーマンスを得るには、テーブルの左端のクラスター化インデックス キーを使用してテーブルを構造化することが重要です。処理済み列。 ID が主キーとして存在する場合は、クラスター化キーの 2 番目の列に移動する必要があります。さらに、キューではなく非クラスター化インデックスの使用を避けることをお勧めします。
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
さらに、テーブルをピーク操作に使用したり、キューとストアの両方として使用したりしないことが重要です。これらの方法を実行すると、デッドロックが発生し、スループットが低下する可能性があります。
アトミックなデキュー プロセスを遵守し、READPAST ヒントを利用し、適切に構造化されたテーブルを実装することにより、SQL Server を使用するときに非常に同時負荷でも高いスループットを実現できます。複数のクライアントを持つ DB キューとして。
以上がSQL Server はどのようにして複数のクライアント間での同時キュー処理を効率的に処理できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。