我有一个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查询对整体性能的影响。
答案 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]'