アプリケーションの複数のスレッドからデータベースへの複数の接続により、挿入クエリのパフォーマンスが向上しますか?
-
03-07-2019 - |
質問
ここでは、数千万のレコードを含むデータベースを扱っています。データベースに接続し、テーブル内の単一の列からすべてのデータを取得し、それに対して何らかの操作を行い、それを更新するアプリケーションがあります(SQL Serverの場合-カーソルを使用)。
数百万件のレコードでは、更新に非常に長い時間がかかります。だから私はそれをより速くしたい
- 各スレッドに独立した接続で複数のスレッドを使用します。
または
- すべてのスレッドで単一の接続を使用して、更新クエリを起動します。
どちらが速いか、または他のアイデアがある場合は説明してください。
データベースの種類に依存しないソリューションが必要です。または、データベースの種類ごとに特定のソリューションを知っている場合でも、返信してください。
解決
達成しようとしている高速化は機能しません。反対に、データベースは複数の接続/セッション/トランザクションの同期を維持する必要があるため、全体の処理が遅くなります。
反復操作および同等の操作のために、できるだけ少ない接続/トランザクションで維持します。 好みに応じて時間がかかりすぎる場合は、クエリを何らかの形で最適化できるかどうかを分析してみてください。また、問題に適したデータベース固有の拡張機能(一括操作など)も確認してください。
他のヒント
すべてはデータベース、およびデータベースが実行されているハードウェアに依存します。
データベースが同時処理を利用でき、共有リソースの競合を回避できる場合(たとえば、ページベースロックが複数のレコードにまたがる場合、レコードベースはそうではありません)。この場合の共有リソースにはハードウェアが含まれます。単一のコアボックスでは、複数のCPU集中型アクティビティ(SQLの解析など)を完全に並行して実行することはできません。
ネットワーク自体は、データベース自体が同時実行性を利用できない場合でも、同時挿入を軽減するのに役立つ可能性があります。
パフォーマンスの質問と同様に、特定のシナリオでのテストに代わるものがあります。
可能であれば、ストアドプロシージャを使用して、すべての処理を行い、レコードを更新します。