5

コードの特に重い部分の最適化を検討しています。そのタスクは、統計データをテーブルに挿入することです。このデータは、他のプログラムによってかなりの量ヒットされています。それ以外の場合は、SQL 一括挿入などの使用を検討します。

だから私の質問は...

重複した行に対して SqlException がスローされる可能性があることを知って (それほど頻繁ではありませんが)、いくつかのデータを挿入しようとしても問題ありませんか?

例外のパフォーマンス ヒットは、挿入前に各行をチェックするよりも悪いですか?

4

7 に答える 7

9

まず、私のアドバイスは、スピードではなく、正確さを重視することです。プロジェクトを終了し、プロファイリングにより、行を挿入する前に行が存在することを確認するのにかなりの時間を費やしていることが示されたら、それを最適化してください。

第二に、すべてのRDBMSに重複がある場合に挿入してスキップする構文があると思うので、そもそもこれは問題にならないはずです。私は、通常のアプリケーション フローの一部として例外を回避し、真に例外的なケースに任せるようにしています。つまり、コード内のロジックを回避するために DB 内の例外を当てにしないでください。エンド (コード) でできるだけ一貫性を維持し、DB 例外が真のバグのみを示すようにします。

于 2009-02-16T07:30:06.607 に答える
7

純粋なパフォーマンス レベルでは、特にエラーが頻繁に発生しない場合は、データを挿入してエラーを処理する方が高速です。選択クエリを実行して重複をチェックし、その結果を処理し、成功した場合は挿入すると、挿入して時折エラーを処理するよりもかなり遅くなります。例外が発生した場合、ほとんどの言語で例外処理が遅いため、少し遅くなりますが、例外の処理は、どの言語の SQL クエリよりも何倍も高速です。

Assafが言ったように、通常、重複を明示的に処理する方法もあるため、エラーを完全に回避できる場合があります. これにより、パフォーマンスがさらに向上し、特定の方法で重複を処理していることを明示できます。

ストアド プロシージャを使用するかどうかはあなた次第です。データベースにより多くのロジックを配置することを犠牲にして、パフォーマンスを向上させることができます。それはあなたがしなければならない決定です。私はこれで悪い経験をしましたが、RDBMS と使用している言語によって異なります。

于 2009-02-16T07:37:57.617 に答える
2

I don't see that a Stored Procedure will speed up a singleton insert, unless there is other processing involved. May eb other benefits though - keeping all the logic in once place etc.

Personally I would INSERT and trap the error if there are duplicates etc.

If you do an IF NOT EXISTS check and then conditionally INSERT there is an interval where the transaction needs to hold a lock, which may increase blocking on the table.

For a busy insert table worth checking how fragmented the table becomes. If you are inserting with a Clustered PK on an Identity / Auto-number column then all inserts are at one end (and the index can have a fill-factor of 100%), but if the inserts are random throughout the clustered index then you may be getting issues from page splits and so on.

A related issue is that the Statistics on the table are likely to go out of date quickly, and that may effect the performance of queries with cached query plans etc.

于 2009-02-16T09:01:56.823 に答える
1

ストアプロシージャを使用し、IFを使用する方が良いと思います

IF (SELECT COUNT(*) FROM X WHERE Y=Z)=0 INSERT INTO (X) VALUES('XX')....

ELSE条件を追加できます...

于 2009-02-16T07:28:27.077 に答える
0

はい、私はいつもチェックします。たとえば、電子メール アドレスや IP アドレスなどです。

パフォーマンスが心配な場合は、重複する場合はストアド プロシージャを使用してロジックを処理します。

于 2009-02-16T07:25:12.937 に答える