現在、ユーザーセッションごとに特定のテーブルに5〜10,000行以上のデータを生成するアプリケーションを開発中です。現時点では、sqlテキストコマンドを使用して一度に各行のデータを挿入するため、保存操作には最大1分かかる場合があります。私たちはSqlBulkInsertsを使用して遊んでいて、時間が500ms以下になるのを見ました。多くのユーザーがシステムを使用するプロダクションアプリケーションでSqlBulkInsertsを使用することに異論はありますか?本番アプリケーションでのSqlBulkInsertの使用
答えて
SqlBulkCopyでtableLockオプションが設定され、別のユーザーがブロックされているという問題が発生したことはありません。 TableLockオプションは、多くの人が話したことからインサートの効率を高め、それを使っているだけで私に見せてくれました。
私の典型的な方法:そのため、当社のデータベースが構成されている方法の
public void Bulk(String connectionString, DataTable data, String destinationTable)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy
(
connection,
SqlBulkCopyOptions.TableLock |
SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.UseInternalTransaction,
null
))
{
bulkCopy.BatchSize = data.Rows.Count;
bulkCopy.DestinationTableName = String.Format("[{0}]", destinationTable);
connection.Open();
bulkCopy.WriteToServer(data);
}
}
}
アプリケーションが本当にセッションごとに多くのレコードを生成する必要がある場合は、適切な方法だと思います。
SqlBulkInsertを使用して実装する前に、このように見えるように動的にINSERT
クエリを作成してみてください:
insert into MyTable (Column1, Column2)
select 123, 'abc'
union all
select 124, 'def'
union all
select 125, 'yyy'
union all
select 126, 'zzz'
これは、はるかに迅速に実行する必要がある唯一のデータベース呼び出しになります。 SQL文字列連結の場合は、StringBuilder
クラスを使用してください。
私はこのアイデアを歓迎しましたが、このアプローチの問題は、自己参照テーブルなので階層ツリーを構築しているときにプライマリキー用に作成されたID値がサーバー上に戻ってくる必要があることです。 – PCG
だから何ですか?このtotlalyはSqlBulkCopyの使用も除外しています。サーバー生成IDが必要な場合は、バルク挿入をどのように行いますか?答えは妥当であり、あなたの褒賞はあなたの声明と矛盾します。 – TomTom
あなたの権利と私はばかです。 SqlBulkCopyの実装では、ツリーの各レベルで挿入したばかりのデータのリストを取得して、生成されたIDのリストを取得していました。私は、あなたが上記で提供したステートメントを使用して同じことをすることについても考えなかった。 – PCG
- 1. Doctrineの移行は本番アプリケーションで使用できますか?
- 2. distファイルを使用して本番モードでPlayアプリケーションを実行
- 3. Apacheの々BeanUtilsは、私の本番アプリケーションの
- 4. Railsアプリケーション用の本番データベースを作成できません
- 5. SqlBulkInsert内の一部の列をスキップ
- 6. 本番MVC/SQLアプリケーションでの大量のアクションのロギング
- 7. jdbc本番で特定のクエリを使用したMySQLTransientConnectionException例外
- 8. Dockerを使用して本番モードでDevise-Railsの例をデプロイ
- 9. 開発と本番データベースのFirebaseの使用
- 10. RedirectUrisは本番環境でlocalhostを使用できますか?
- 11. Neo4j Community Editionを本番環境で使用できますか?
- 12. jspmバンドルを本番ではなく、開発で使用する
- 13. capistranoをデプロイした場合の本番アプリケーションのデバッグ
- 14. 本番環境でanyenv、rbenv、ndenvを使用する場合、CentOS7 *
- 15. 本番環境でElixirアプリケーションをデバッグする方法は?
- 16. アプリケーションを本番環境で実行する
- 17. VirtualWebappLoader - 本番環境で使用するのは良い選択ですか?
- 18. NHibernateを使用して本番用のスキーマを生成するためのベストプラクティス
- 19. は、本番サーバー
- 20. なぜNHibernate.Cache.HashtableCacheProviderは本番用ではないのですか?
- 21. アクセス流星の本番データベース
- 22. Angular2は、本番環境で
- 23. テスト用データベースを本番用のものに再構築する
- 24. git:ステージングサーバーと本番サーバー用にプッシュアンドプル
- 25. C#winformsアプリケーションでSQLiteを使用する - 基本的な質問?
- 26. アプリを本番から削除し、ベータテストを使用する
- 27. CodeIgniterの - 本番サーバー上mode_rewriteを設定中のmod_rewriteが本番サーバー
- 28. Railsアプリケーションの本番ロギング用に一意の個別ファイルを1つ作成できますか?
- 29. ステージングと本番データベース
- 30. ジャンゴCSRF本番サーバ
、我々はSqlBulkCopyを使用している間、我々はデッドロックエラーを取得し、このために、単一のトランザクションでのデータを格納している12個のテーブルを持っています。 SqlBulkCopyOptions.TableLockを設定することにより、デッドロックがなくなりました。バルクインサートを行うためにテーブルをロックするのに不利な点はありますか?同時にトランザクションを実行しようとしている他のユーザーを傷つけるでしょうか? – PCG
あなたは麻痺錠を持っていることを除いてはどういう意味ですか?次にデッドロックは別のことであり、プログラミングの悪影響を受けていることを示しています - 発生した問題を修正し、悪いコードを悪用して症状を悪化させないでください。 – TomTom
私はあなたが私の背中を叫ぶプロダクトマネージャーを持っていなかった場合、私は完全に同意するでしょう、多分いくつかのインデックスを除いてデータベーススキーマについての1つの事を変えずに、私は完全な状況によって完全に困惑した。 – PCG