Cmd.Execute times out

本文关键字:out times Execute Cmd | 更新日期: 2023-09-27 18:24:55

172点

206个帖子WierdCmd.ExecuteReader性能问题23小时8分钟前|链接

我建立了以下查询:

SELECT TOP 14 DocumentId
 FROM idx1_AuthLetters
a INNER JOIN Documents b ON a.DocumentId = b.Id
WHERE Status in ('L','S','V')
AND  ServiceCenter = 'NC'
AND  mem_name like '%ZZZ%'
ORDER BY DOCUMENTID

当我在SqlServerManagementStudioQuery窗口中运行它时,它会在一瞬间运行它。非常快。

对于此查询,我返回了0条记录。

问题是我正在动态地构建这个查询。因此,如果我在查询执行之前放置一个断点,并检查cmd对象,这就是我所看到的:

 SELECT TOP 14 DocumentId 
 FROM idx1_AuthLetters a 
 INNER JOIN Documents b ON     
 a.DocumentId = b.Id 
 WHERE Status in ('L','S','V')  
 AND  ServiceCenter = @1  
 AND  mem_name like @2 
 ORDER BY DOCUMENTID

参数值为

@1: NC
@2: %ZZZ%

有趣的是,如果返回了记录,而不是0条记录,那么一切都很好。

一个例子是使用不同参数值构建的相同查询:

SELECT TOP 14 DocumentId 
FROM idx1_AuthLetters a 
INNER JOIN Documents b 
ON a.DocumentId = b.Id 
WHERE Status in ('L','S','V')  
AND  ServiceCenter = @1  
AND  mem_name like @2 
ORDER BY DOCUMENTID
@1: NC
@2: %JOHN%

这是最近的一个问题。这两个测试用例过去对我来说都很好,但现在返回0条记录导致cmd。ExecuteRead()行超时。

此外,我们在Oracle中也有同样的问题。虽然它没有超时,但在Oracle版本中它只是有点慢。

此查询在Oracle中返回0条记录需要11秒,而对于包含记录的查询则需要0或1秒。

是什么原因造成的?

Cmd.Execute times out

尝试将OPTION (RECOMPILE)添加到动态构建的查询中,例如像一样构建它

SELECT TOP 14 DocumentId 
FROM idx1_AuthLetters a 
INNER JOIN Documents b 
ON a.DocumentId = b.Id 
WHERE Status in ('L','S','V')  
AND  ServiceCenter = @1  
AND  mem_name like @2 
ORDER BY DOCUMENTID
OPTION (RECOMPILE)

这将避免参数嗅探,当从.NET代码执行SQL语句/存储过程时,参数嗅探通常是性能缓慢的原因

在SQL Server Management Studio中有一个很棒的功能,叫做执行计划可视化。使用执行计划执行查询,您将获得在服务器上如何处理查询的(文字)图片。使用表扫描查找嵌套循环。

这通常是未索引或索引不正确的数据库的问题,但如果没有关于数据库结构的其他信息,我认为没有人能正确地帮助您。

编辑:如果问题仅发生在从.Net代码访问数据库时,则应使用SQL Server Profiler(Management Studio->Tools->SQL Server Profile器),在数据库上启动跟踪,然后在客户端中运行查询。Profiler跟踪将显示执行的实际查询(由于参数的原因,您可能需要编辑一点),然后将该查询与Execution Plan一起使用。