2

データ アクセスに sqlserver コンパクト エディションとエンティティ フレームワークを使用している c# プロジェクトがあります。5000以上の大量の行をデータベースに挿入または更新する必要があるため、キーが存在する場合は、挿入しない場合はレコードを更新します。コンパクト エディションと EF を使用してこれを実行するには、恐ろしいパフォーマンスが必要です。つまり、コア i7 コンピューターで 2 分以上かかります。レコードを検索して、存在するかどうかを確認し、存在しない場合は挿入するか、存在する場合は更新しようとしましたが、検索はそのキラーです。検索クエリをコンパイルしてみましたが、わずかな改善しか得られませんでした。私が試したもう1つのことは、try catchにレコードを挿入し、更新に失敗した場合ですが、パフォーマンスキラーである最後とは対照的に、すべてのレコードで変更を保存して例外を取得することを強制します. 明らかに私はできます」コンパクト版なのでストアドプロシージャを使用しません。また、データベース上で何らかの方法で t-sql を直接実行することだけを見てきましたが、コンパクトにプロセスステートメントがないため、それが除外されているようです。私は世界中を探し回り、アイデアを探し出しました。展開の利点と、ユーザーがデータベースを掘り下げるのを防ぐ機能を過剰に表現できる場合は、コンパクトを使用したかったのです。どんな提案もいただければ幸いです。

ありがとう

4

7 に答える 7

2

SqlCeResultSetを直接使用することをお勧めします。EFの優れたタイプセーフ性は失われますが、パフォーマンスは非常に高速です。ADO.NET 2.0スタイルのTypeDataSetsからSqlCeResultSetおよびSqlCeDataReaderに切り替えたところ、速度が20〜50倍向上しました。

于 2009-04-24T16:30:00.057 に答える
2

Entity Frameworkを使用したことがないため、これが実行可能かどうかはわかりませんが、最初に更新を実行して行数を確認しましたか?行が更新されていない場合は挿入しますか?これは、例外をキャッチするよりも高速な場合があります。一般に、制御フローに例外を使用することは悪い習慣であり、多くの場合、処理速度が大幅に低下します。

SQLを直接記述できる場合、それを行う最も速い方法は、すべてのデータを一時テーブルに取得してから、存在するものを更新して残りを挿入することです(上記のAndrea Bertaniの例のように)。挿入のselectで元のテーブルに左結合を使用し、元のテーブルの値がnullでない行を除外すると、わずかに良い結果が得られるはずです。

INSERT INTO original
SELECT * FROM temp
LEFT JOIN original ON original.id = temp.id
WHERE original.id IS NULL
于 2009-04-09T00:12:31.540 に答える
2

問題の説明を考えると、このソフトウェアは比較的強力な環境を想定していると思います。sqlce を使用せずに自分で判断する作業を検討したことはありますか? 基本的に、関連するテーブルからすべての ID (キー?) のソートされたリストを取得し、すべてのオブジェクト キーをそのリストに対してチェックしてから、挿入のためにキューに入れますか?

これにより、典型的な DB では悪いニュースとなるいくつかの仮定が行われますが、SQLCE ではおそらく回避できます。たとえば、この挿入の実行中に行が挿入されたり、別のユーザーによって大幅に変更されたりしないことを前提としています。

キーのリストが長すぎて、そのようなチェックのためにメモリに合理的に保持できない場合、sqlce はその仕事に適したツールではない可能性があると思います。:(

于 2009-04-08T04:10:07.297 に答える
1

SqlCeResultSet を参照してください。.NETCF プロジェクトでは、このクラスを優先してほとんどすべての SQL コードを削除しました。ここで "SqlCeResultSet" と msdn を検索してください。

簡単な概要:

  1. 結果セットを開きます。(存在チェックのために) シークが必要な場合は、結果セットのインデックスを指定する必要があります。

  2. 結果セットをシークして読み取り、行が見つかったかどうかを確認します。これは、数万行のテーブルでも非常に高速です (シークはインデックスを使用するため)。

  3. レコードを挿入または更新します (SqlCeResultSet.NewRecord を参照)。


65000 行を超えるメイン製品テーブル (4 つのインデックスで読み取り/書き込み) を持つ sqlce データベースを使用したプロジェクトの開発に成功しました。

于 2009-06-30T07:50:28.333 に答える
0

SQL Server Compact Editionは、現時点では開発のかなり早い段階にあります。また、デバイスによっては、メモリディスクへのアクセスがかなり遅くなる可能性があり、SQLCEと.NETの型安全性のオーバーヘッドはかなり集中します。かなり静的なデータストアで最適に動作します。

軽量のAPIを使用するか、SQLiteを検討することをお勧めします。

于 2009-04-24T16:39:06.917 に答える