1

現在、プロジェクトで SQL Server 2008 を使用してデータを保存およびフェッチしています。これは今のところ完璧です。50ms (JSON) 未満で 20000 レコードをフェッチできます。しかし、挿入物の問題に直面しています。私のプロジェクトでは、毎分 100000 レコードのようなものを挿入できる必要があります。これはSQLサーバーでは非常に遅いようです。
私はmongoDBのような別のデータベース(NOSQL DB)を使用しようとしました.SQLServer(270s)と比較してデータの保存が非常に高速ですが(5秒)、データのフェッチではSQLほど高速ではありません(20000 => 180ms)。
だから私はここで、SQL の保存を高速化する方法があるかどうかを尋ねています。または、mongoDB のフェッチを高速化します (私は mongoDB の専門家ではありませんが、非常に基本的なことは知っています)。

public static void ExecuteNonQuery(string sql)
{
    SqlConnection con = GetConnection();
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    try
    {
        cmd.ExecuteNonQuery();
    }
    finally
    {
        con.Close();
    }
}

SQLの挿入機能

public IEnumerable<T> GetRecords<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression, int from, int to) where T : class, new()
{
    return _db.GetCollection<T>(collectionName).Find<T>(expression).Skip(from).Limit(to).Documents;
}

Mongo の Select 関数 (MongoDB 1.6)

更新 : データ構造: (int) Id 、(string) データ

4

4 に答える 4

4

それぞれの挿入を独自のトランザクションで実行していると思います (明示的に提供しないと、暗黙的なトランザクションが作成された可能性があります)。SQL サーバーは、トランザクションがハード ドライブに確実にコミットされるようにする必要があるため、各トランザクションには非常に大きなオーバーヘッドがあります。

ExecuteNonQuery()処理を高速化するには、1 回の呼び出しで多くの挿入を実行してみてください (1000 程度で試してみてください) 。また、開いたり閉じたりするのではなく、いくつかの挿入に対して接続を開いたままにします (したがって、同じトランザクション内にあります)。

于 2011-02-19T12:19:28.230 に答える
3

SqlBulkCopy クラス http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspxをご覧ください。

于 2011-02-19T12:29:04.943 に答える
0

MongoDB は読み取りと書き込みが非常に高速です。コモディティ ハードウェアでは、データ サイズにもよりますが、1 秒あたり 50,000 回の読み取りと書き込みが可能です。それに加えて、シャーディングとレプリカ セットでスケールアウトするオプションが常にありますが、前述のように、MongoDB で 1 秒あたり 20,000 の操作は何もありません。

于 2011-02-19T12:21:05.533 に答える
0

一般に、データベースにデータを挿入する速度は、操作の複雑さの関数です。

挿入が非常に遅い場合は、挿入に最適化の問題があることを示しています。プログラムが生成している SQL 挿入ステートメントを正確に特定し、データベースの EXPLAIN 関数を使用して、基礎となるデータベースが使用している操作を特定します。これにより、多くの場合、これらの操作の速度を上げるためにセットアップをどのように変更する必要があるかについての手がかりが得られます。

データベースを変更する必要があることを意味する場合もあれば、各項目を個別に挿入するのではなく、挿入を 1 回の呼び出しにバッチ処理することを意味する場合もあります。

毎回接続を設定して閉じているようです..これにはかなりの時間がかかります. 永続的な接続を使用してみてください。

于 2011-02-19T12:21:51.613 に答える