SqlBulkCopy.WriteToServer自动执行表

时间:2017-05-29 11:02:20

标签: c# sqlbulkcopy

我有一个C#4.5应用程序,它从网络接收记录并将它们写入Sql Server表。

我正在使用SqlBulkCopy将DataTable对象快速插入到SQL表中。

这是我正在使用的代码:

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条记录,而SQL表可能包含约500条记录。

我正在执行一些调试,以确定我们的应用程序中可能存在的瓶颈,并且我发现每次调用WriteToServer时,都会执行sql表上的Select *。

我正在使用此查询来获取在数据库上运行的最新50个查询的列表:

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对象的正常行为吗?由于SQL表非常大,我现在关注的是Select查询对整体性能的影响。

1 个答案:

答案 0 :(得分:3)

使用SET FMTONLY ON执行select *。所以没有处理任何行。必须执行此语句才能返回有关目标表的信息。

  

当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]'