Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用COM互操作时.NET数据库调用缓慢,通过查询分析器调用快速_.net_Sql Server_Com Interop - Fatal编程技术网

使用COM互操作时.NET数据库调用缓慢,通过查询分析器调用快速

使用COM互操作时.NET数据库调用缓慢,通过查询分析器调用快速,.net,sql-server,com-interop,.net,Sql Server,Com Interop,我有一个Sql查询,它根据SSN查找person并返回PersonID(标识列)。persons表中的SSN列上有一个索引 我有一个旧的VB6应用程序,它使用COM/.NET互操作调用此查询。当它这样做时,它运行得相对缓慢。我使用SQL Profiler设置了一个跟踪,每个调用的持续时间在400ms-600ms之间 如果通过查询分析器运行完全相同的查询,则得到的持续时间

我有一个Sql查询,它根据SSN查找person并返回PersonID(标识列)。persons表中的SSN列上有一个索引

我有一个旧的VB6应用程序,它使用COM/.NET互操作调用此查询。当它这样做时,它运行得相对缓慢。我使用SQL Profiler设置了一个跟踪,每个调用的持续时间在400ms-600ms之间

如果通过查询分析器运行完全相同的查询,则得到的持续时间<30ms。我还有一个ASP.NET网站,它可以进行相同的精确调用,并且持续时间不超过30毫秒

通常我会怀疑COM/.NET互操作开销造成了延迟。但是,我要从SQL分析器中获取跟踪时间。我看不出客户端的开销会如何影响我从服务器端数据库跟踪中获取的数据

还有什么可能导致此问题

编辑:

我发现了这个问题。我设置了sql profiler来捕获执行计划,发现当通过VB应用程序调用存储过程时,执行计划没有使用SSN上的索引。但是,当通过asp.net或QA调用同一SP时,会调用适当的索引。我向服务器发送了一个sp_重新编译,从那时起,VB应用程序以足够的速度运行


我仍然不明白的是,为什么VB应用程序没有使用与其他客户端相同的缓存查询计划。

检查传递给SQL的参数(@SSN)的类型。通常情况下,参数是这样添加的:

List<...> GetBySSN(string ssn) {
   SqlCommand cmd = new SqlCommand (@"select ... from ... where SSN=@SSN", conn);
   cmd.Parameters.AddWithValue("@SSN", ssn);
   using (SqlDataReader rdr = cmd.ExecuteQuery()) {
     ...
   }
}
此查询不能受益于SSN列上的索引,因此将执行表扫描。我调查“应用程序中的查询运行缓慢,而SSMS中的查询运行快速”这一说法的90%都是这个问题,因为绝大多数开发人员实际上在SSMS中运行不同的查询进行比较(他们使用VARCHAR参数或硬编码值)


如果这确实是问题所在,那么解决方案很简单:将参数类型显式指定为。

谢谢您的回答。在本例中,它正在调用一个存储过程,参数类型显式设置为varchar。使用探查器捕获慢速情况的执行计划(请参阅),如果可能,发布慢速执行计划,并在从SSMS运行时比较快速情况的执行计划。请参阅中的“参数嗅探”
select ... from ... where CAST(SSN as NVARCHAR) = @SSN;