C# SqlBulkCopy.WriteToServer在表上自动执行Select*
我有一个C4.5应用程序,它从网络接收记录并将它们写入SQLServer表 我使用SqlBulkCopy将DataTable对象快速插入到SQL表中 这是我正在使用的代码: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))
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]'
在查询中包括总运行时间,以查看哪些查询实际花费了大量时间,而不仅仅是执行了哪些查询。除非每秒执行数百次,否则您不必担心耗时毫秒的问题。在查询中包含总运行时间,以查看哪些查询实际占用了大量时间,而不仅仅是执行了哪些查询。你不需要关心那些需要毫秒的事情,除非它每秒执行数百次。