pushLog
関数はすべての挿入を個別にコミットし、コミットは遅いです。
ドキュメントの
また:
ただし、あなたの場合、各INSERTが主キー違反で失敗し、最後のコミット以降の前のINSERTがキャンセルされる可能性があるため、これはメリットではなく問題になります。これはCOPYでも問題になることに注意してください。コード> 、それを使用する必要があります。
パフォーマンスのためにトランザクション内のクエリをグループ化することが本当に必要なので、トランザクションを中止しない方法で主キー違反に対処する必要があります。
通常、次の2つの方法が使用されます。
-
エラーを回避します:
INSERT INTO ... WHERE NOT EXISTS(SELECT 1 FROM table WHERE primary_key =...)
-
itrを無視するEXCEPTIONブロックを持つplpgsql関数内に挿入して、エラーをトラップします。重複の原因となっている特定のINSERTはキャンセルされますが、トランザクションは中止されません。
同時挿入がある場合は、これらのメソッドをロック戦略で改良する必要があります。