2009-07-29 4 views
6

1つのテーブルにn個のレコードを挿入します。多数の同時ユーザーが存在し、このテーブルのデータを挿入/更新/選択することができます。このようなテーブルに1000レコードを挿入する方がよいでしょう:Sqlクエリのクエリパフォーマンスを

  1. 複数の挿入を持つデータベースに単一のSQLクエリを送信します。これにより、サーバからデータベースへの呼び出しが保存されますが、挿入が完了してこのテーブルへの他のすべてのクエリが待機するまで、テーブルがロックされます(わかりません)。
  2. いくつかのチャンクで1000レコードを分割し、複数のSQLクエリでそれらを送信します。これにより、他のクエリをテーブル上で実行できますが、サーバ間の呼び出しに時間を費やします。

これは何かに依存しているのですか、または常に最適な方法が1つありますか? これは、データの挿入中にトランザクションを使用するかどうかによって異なりますか? このような挿入を実行する他のより良い方法はありますか?

私が使用しているデータベースはMS SQLですが、Oracleのような他のDBでどのように動作するかは面白いです。

答えて

6

これは、あなたが使用しているものはどれもRDBMSに依存します。

Oracleでは、書き込みが読み取りをブロックすることはありません。そのため、すべてのデータを一度に安全に保存できます。ただし、同時クエリでは余分な読み取りが必要なUNDO表領域からデータをフェッチする必要があるため、パフォーマンスが低下することに注意してください。

SQL ServerTRANSACTION ISOLATION LEVELSNAPSHOTに設定しないかぎり、(ロックのエスカレーションの問題によって)影響を受ける行/ページ/テーブルの読み取りをブロックします。

同時書き込みと読み取りを可能にするすべてのトランザクションエンジンでは、エンジンは古いデータと新しいデータの両方を同時に使用可能にする必要があります。

Oracleには、古いデータがUNDO表領域にコピーされます。

SQL Serverにはtempdbにコピーされます(SNAPSHOTアイソレーションが有効な場合のみ、それ以外の場合はロックされます)。

これは、常に一部のリソース(メモリまたはディスク)を必要とし、UPDATEクエリが多くの行に影響を及ぼす場合、これらのリソースを使い果たす可能性があります。

1

トランザクション中に古いデータを読み取ることができる分離(並行性)レベルを設定します。 SQL Server 2005+には読み方があります。

2

私はこのことについてブログしていますa while ago - 私はその投稿があなたの質問のいくつかに答えると思います。あなたがライターをブロックしている読者を心配しているならば、CKのアドバイスは健全です(Quassnoiはオラクルについていくつかの良い点を持っています)。

+0

興味深いブログ投稿+1。あなたのテストで_reason_トランザクションがより速く現れるのは、私の関心事です。私はそれが必要なロックの多くは、事前のパスで既に撮影されているためだと思う。しかし、あなたの投稿が対処していない1つの重要なことは、負荷のある動作です。あなたのテストは孤立しているようです。ライブシステムでは、結果がかなり早く逆転すると思われます。 – EBarr

2

一般的なルールは、データベースに作業の仕方を理解させることです。これは、1つのステートメントで実行するように指示するほど効果的です。つまり、1000レコードを一度に挿入する必要があります。これは、のほとんどの場合、データベースサーバーで動作し、ほとんどのサーバーは書き込みの読み取りをブロックしません。

例外はあります。サーバーの速度が遅い、またはテーブルが大きく複雑なために挿入が遅い場合は、を小さな挿入のグループに分割する方が良いことがあります。

中間の方法では、1つの大きなスクリプトでサーバーにコミットしながら、たとえば10または100行の複数の挿入コマンドを送信することです。

追加:ほとんどのデータベースサーバーは、InnoDBテーブルを使用して、Oracle、IBM DB/2、およびMySQlのように読み取りをブロックしません。一方、SQL Serverは読み込みのためにテーブルをロックすることを管理し、その中にはありません。

+1

ほとんどのDBには、読者がライターをブロックするような問題があると思います(Oracleではありません)。 – RichardOD

+0

Microsoft ADO.NETのコアリファレンスでは、100〜1000のバッチサイズを使用することをお勧めします。 – RichardOD

+0

@RichardOD:この推奨へのリンクを投稿してください。 – Kamarey