私はC#4.5アプリケーションを持っています。これはネットワークからレコードを受け取り、Sql Serverテーブルに書き込みます。SqlBulkCopy.WriteToServerはテーブル上のSelect *を自動的に実行します
私はSqlBulkCopyを使用して、DataTableオブジェクトをSQLテーブルにすばやく挿入しています。 SQLの表は、〜500Mエントリを持っている可能性がありながら、
public bool BulkCopy(string tableName, DataTable dataToInsert)
{
try{
using (SqlBulkCopy tmpBulkCopy = new SqlBulkCopy(dbaseConnection))
{
// Set the destination table.
tmpBulkCopy.DestinationTableName = tableName;
// Define column mappings
foreach (DataColumn dc in dataToInsert.Columns)
{
tmpBulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
}
// Perform the Bulk Copy
tmpBulkCopy.WriteToServer(dataToInsert);
}
}
catch (Exception)
{
return false;
}
return true;
}
を通常DataTableオブジェクトは、1,000レコードが含まれています
これは私が使用しているコードがあります。
アプリケーションのボトルネックを特定するためにデバッグを実行していましたが、WriteToServerが呼び出されるたびにsqlテーブルのSelect *が実行されることがわかりました。
SELECT TOP 50 * FROM(SELECT COALESCE(OBJECT_NAME(s2.objectid),'Ad-Hoc') AS ProcName,
execution_count,s2.objectid,
(SELECT TOP 1 SUBSTRING(s2.TEXT,statement_start_offset/2+1 ,
((CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(NVARCHAR(MAX),s2.TEXT)) * 2)
ELSE statement_end_offset END)- statement_start_offset)/2+1)) AS sql_statement,
last_execution_time
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2) x
WHERE sql_statement NOT like 'SELECT TOP 50 * FROM(SELECT %'
--and OBJECTPROPERTYEX(x.objectid,'IsProcedure') = 1
ORDER BY last_execution_time DESC
これはSqlBulkCopyオブジェクトの正常な動作です:
は、私は、データベース上で実行し、最新の50個のクエリのリストを取得するには、このクエリを使用していますか? SQLテーブルがかなり大きいという事実のために、私の心配は全体的なパフォーマンスに対するそのSelectクエリの影響についてです。
'実際にはかなりのクエリが実行されているだけで何よりも、かなりの時間がかかる照会ものを見るためにあなたのクエリでtotal_elapsed_time'を含めます。毎秒何百回も実行されない限り、ミリ秒かかる作業には心配する必要はありません。 –