3

アプリを高速化するためのサポートが必要です。アプリケーションは、約53,000行の区切られたレコードを読み取り、各行を解析してから、各行をデータベースに送信して書き込みを行います。これまでのところ、私はデータベースの終わりを主要なボトルネックとして特定しました。これを調整するのを手伝っていただければ幸いです。現在、それぞれ190フィールドのすべてのレコード(53,000)を処理するのに約20分かかります。データベースにデータを送信するコードから始めて、その数を大幅に減らしたいと思います。

私はEnterpriseLibrary5を使用して、そこでの接続プールを利用しています)のようにデータベースに接続します

   internal void SaveItem(String connString)
    {
        try
        {
            ImportDataAccessor dbacess = new ImportDataAccessor(connString);

            foreach (ItemDetail item in itemEZdetails)
            {
                if (dbacess.SaveProduct(RecordID, item))
                {
                    updatecounter++;
                }
            }
            successfulsaves = dbacess.RowsProcessed;
            updatecounter = dbacess.TotalRows;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }


public bool SaveProduct(String RecordUID, ItemDetail item)
{
 //. . . . start function here
 DbCommand insertCommand = db.GetStoredProcCommand("IDW_spEZViewRecordImport");
 db.AddInParameter(insertCommand, "SessionUID", DbType.String, recordUID);
  // the other 189 Parameters go here 
        int rowsAffected = db.ExecuteNonQuery(insertCommand);
                   // Object sreturnval = (String)db.GetParameterValue(insertCommand, "ReturnVal");
                    String returnval = String.Empty;
                    if ( ! (db.GetParameterValue(insertCommand, "ReturnVal") == DBNull.Value))
                        returnval = (String)db.GetParameterValue(insertCommand, "ReturnVal");
                    if (returnval == "60")
                        RowsProcessed++;
                    result = rowsAffected > 0;
}
//end of line add

私が今持っているコードでこれをどのように達成するのですか?前もって感謝します。

4

2 に答える 2

1

複数の行を入力する場合は非常に高速であるため、SQLBulkCopyを使用します。

DataTable newProducts = MakeTable();

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
    {
        bulkCopy.DestinationTableName = 
            "dbo.BulkCopyDemoMatchingColumns";

        try
        {
            // Write from the source to the destination.
            bulkCopy.WriteToServer(newProducts);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

DataTable一致する列名でそれを渡すだけで、出来上がりです!

于 2012-10-17T19:52:43.277 に答える
0

おそらく、次のように、ストアド プロシージャで複数のレコードの INSERT コマンドを使用すると、パフォーマンスが向上します。

Insert into ItemType (ItemTypeName)
VALUES
('TYPE1'),
('TYPE2'),
('TYPE3')
于 2012-10-17T19:48:33.890 に答える