2017-05-29 32 views
0

我有一个C#4.5应用程序,它从网络接收记录并将它们写入到Sql Server表中。SqlBulkCopy.WriteToServer在表上自动执行Select *

我正在使用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表可能有〜500M的条目。

我正在执行一些调试,以确定我们的应用程序中可能存在的瓶颈,并且我发现每次调用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 Table非常大,我现在关心的是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]'