web-dev-qa-db-ja.com

SQL Serverは同時の読み取り/書き込み要求をどのように処理しますか?

バックグラウンド:

SQL Server 2008データベースを多用するアプリケーションがあります。このアプリケーションを最適化しようとしています。これはシングルスレッドであり、アプリのロギング/プロファイリングを通じて、最大のボトルネックがデータベースの読み取り/書き込みであることがわかりました。一部の通話は最大100ミリ秒かかりましたが、これでは対処するには長すぎます。他の最適化の中で、これらの呼び出しの一部を別のスレッドに分割しました。この変更のみから、処理時間の大幅な改善が見られます(コードはほとんど同じですが、一部が別のスレッドに移動されただけです)。

質問:

メモリでのコードの実行に費やされる時間はごくわずかであると想定すると、別のスレッドで読み取り/書き込みの一部を実行してもパフォーマンスは向上しないと推測していました。 SQL Serverが単に要求をキューに入れている場合、読み取り/書き込みを並行して実行することはできず、処理時間は同様になると思います。これはそうではありません。

SQL Serverが異なるスレッドからの2つの同時要求(読み取り/書き込みの任意の組み合わせ)をどのように処理するのかと思います。どういうわけかそれらを同時に実行できますか?

要約すると、Query1 + Query2が次々に呼び出される合計時間は、同時に呼び出されるQuery1 + Query2と同様であると想定していました。

これはデュアルコアサーバーで実行されています。

5
Erix

SQL Serverはマルチユーザーデータベースです。主に複数の同時リクエストを処理することを目的としています。

理想的には、逐次実行時にA + Bをとる2つのクエリが同時に実行されるとMAX(A、B)をとります。

破損したデータの読み取りまたは書き込みを防ぐために、SQL Serverは Transactions および Locking を使用します。これに加えて、アプリケーションは同時実行性も管理している可能性があります( optimistic など)。

3
David B

David Bが良い答えを提供したと思いますが、ここでは例を挙げて少し拡大します。

データベースにTable_AとTable_Bの2つのテーブルがあるとします。サーバーには複数のプロセッサがあります。さらに、ディスクサブシステムは、各テーブルを個別のドライブ/ LUN /スピンドルに配置します(正しい用語が何であれ、私はハードウェアの大物ではありません)。さらに、サーバーには複数のNICカードがあります。

2人のユーザーが両方ともデータベースにアクセスし、1人がTable_Aに書き込み、もう1人がTable_Bから読み取りたい場合、うまくいけば、リクエストが異なるネットワークカードで同時に受信され、異なるCPU /コアで同時に処理され、 IOアクティビティは、すべて異なるディスクで同時に発生する可能性があります。

さて、現実の世界では、それほど簡単なことはめったにありません。通常、ハードウェアとアプリケーションの使用方法に応じて、これらの領域の1つ以上にボトルネックがあります。また、両方のユーザーが同じテーブルの同じ行にアクセスしようとすると、リソースのボトルネックが発生する可能性があります。したがって、実際には、アプリケーションのこれらのボトルネックの原因となっているリソースを見つけ、それらのボトルネックを取り除くために多くの時間を費やす人がいます。少なくとも、通常、並列処理が可能なsomeエリアがあります。

2
Tom H.

あなたの質問は、改善前はSQLアクセスがシーケンシャルだったことを意味します。つまり、後続のクエリは、同じ接続の同じコードスレッドで次々に実行されます。

ロジックを別のスレッドに移動すると、2つの異なる効果が発生します。1つ目はcodeが続行する前に各クエリが完了するのを待つ必要がなくなり、2つ目はSQLクエリが(ある程度)並列化されることです。 、SQLサーバーがデータファイルアクセスを最適化できるようにします。これは、コードがこれまでよりはるかに優れています。

コードが純粋なSQL呼び出しだけで構成されていないとすると、前者は後者と同じくらい大きな影響を与える可能性があります。

2
adaptr