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秒。
是什么原因造成的?
尝试将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一起使用。