C# SqlBulkCopy.WriteToServer在表上自动执行Select*

C# SqlBulkCopy.WriteToServer在表上自动执行Select*,c#,sqlbulkcopy,C#,Sqlbulkcopy,我有一个C4.5应用程序,它从网络接收记录并将它们写入SQLServer表 我使用SqlBulkCopy将DataTable对象快速插入到SQL表中 这是我正在使用的代码: public bool BulkCopy(string tableName, DataTable dataToInsert) { try{ using (SqlBulkCopy tmpBulkCopy = new SqlBulkCopy(dbaseConnection))

我有一个C4.5应用程序,它从网络接收记录并将它们写入SQLServer表

我使用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对象包含1000条记录,而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查询对整体性能的影响。

Select*是在SET FMTONLY on的情况下执行的。因此不处理任何行。必须执行此语句才能返回有关目标表的信息

当SET FMTONLY处于启用状态时,由于请求的原因,不会处理行或将行发送到客户端

参考:

以下是一个例子:

select @@trancount; SET FMTONLY ON select * FROM tag SET FMTONLY OFF exec tempdb..sp_tablecollations_100 N'.[#ZZZProjects_f384e3cc_1428_459d_8853_a50ed818ccca]'

select*在SET FMTONLY开启时执行。因此不处理任何行。必须执行此语句才能返回有关目标表的信息

当SET FMTONLY处于启用状态时,由于请求的原因,不会处理行或将行发送到客户端

参考:

以下是一个例子:

select @@trancount; SET FMTONLY ON select * FROM tag SET FMTONLY OFF exec tempdb..sp_tablecollations_100 N'.[#ZZZProjects_f384e3cc_1428_459d_8853_a50ed818ccca]'
在查询中包括总运行时间,以查看哪些查询实际花费了大量时间,而不仅仅是执行了哪些查询。除非每秒执行数百次,否则您不必担心耗时毫秒的问题。在查询中包含总运行时间,以查看哪些查询实际占用了大量时间,而不仅仅是执行了哪些查询。你不需要关心那些需要毫秒的事情,除非它每秒执行数百次。