2017-05-29 36 views
0

私は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クエリの影響についてです。

+0

'実際にはかなりのクエリが実行されているだけで何よりも、かなりの時間がかかる照会ものを見るためにあなたのクエリでtotal_elapsed_time'を含めます。毎秒何百回も実行されない限り、ミリ秒かかる作業には心配する必要はありません。 –

答えて

3

select *はSET FMTONLY ONで実行されます。したがって、行は処理されません。このステートメントは、宛先テーブルに関する情報を返すために実行する必要があります。

SET FMTONLYがオンになっているため、要求のために行が処理されないか、クライアントに送信されません。

参考:ここでhttps://docs.microsoft.com/en-us/sql/t-sql/statements/set-fmtonly-transact-sql

は一例です。

select @@trancount; SET FMTONLY ON select * FROM tag SET FMTONLY OFF exec tempdb..sp_tablecollations_100 N'.[#ZZZProjects_f384e3cc_1428_459d_8853_a50ed818ccca]' 
関連する問題