当前位置: 首页 > 面试题库 >

SQL Server函数间歇性性能问题

仉俊能
2023-03-14
问题内容

我们的数据库中有一个函数,该函数搜索两个大表以查看是否存在值。这是一个相当大的查询,但已对其进行了优化以使用索引,并且通常运行速度非常快。

在过去的2周中,此功能有3次决定进入麻烦境地,并且运行极其缓慢,这会导致死锁和性能下降。即使在少于高峰使用时间的情况下,也会发生这种情况。

在SQL Server中使用“更改功能”重建功能似乎可以解决此问题。完成后,服务器使用率将恢复正常,一切正常。

这使我们认为功能查询计划已经重建,并考虑了正确的索引,但是我们不知道为什么SQL Server突然决定将查询计划更改为更差的计划。

有谁知道可能导致这种行为的原因,或者如何测试或预防这种行为?我们正在运行SQL Server 2008 Enterprise。


问题答案:

您描述的行为通常是由于缓存了错误的查询计划和/或过时的统计信息造成的。

当您在WHERE子句中有大量参数时,特别是一长串形式的参数时,通常会发生这种情况:

(@parameter1 is NULL OR TableColumn1 = @parameter1)

假设缓存的查询计划已过期,并且使用一组不具有代表性的参数来调用proc。然后为该数据配置文件缓存该计划。但是,如果proc在一组非常不同的参数中更常见,则该计划可能不合适。这通常被称为“参数嗅探”。

有许多方法可以缓解和消除此问题,但是它们可能涉及折衷,并且取决于您的SQL Server版本。看看OPTIMIZE FOROPTIMIZE FOR UNKNOWN。如果不经常调用proc(如果这很重要),但是必须尽可能快地运行,您可以将其标记为OPTION(RECOMPILE),以在每次调用时强制重新编译,但不要对经常调用的proc进行此操作,否则请不要进行调查。

[注意:请注意您的SQL Server 2008框具有哪个Service
Pack和累积更新(CU)
,因为在某些版本中,重新编译和参数嗅探逻辑的工作方式有所不同]

运行此查询(来自Glenn Berry)以确定统计信息的状态:

-- When were Statistics last updated on all indexes?
SELECT o.name, i.name AS [Index Name],  
      STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date], 
      s.auto_created, s.no_recompute, s.user_created, st.row_count
FROM sys.objects AS o WITH (NOLOCK)
INNER JOIN sys.indexes AS i WITH (NOLOCK)
ON o.[object_id] = i.[object_id]
INNER JOIN sys.stats AS s WITH (NOLOCK)
ON i.[object_id] = s.[object_id] 
AND i.index_id = s.stats_id
INNER JOIN sys.dm_db_partition_stats AS st WITH (NOLOCK)
ON o.[object_id] = st.[object_id]
AND i.[index_id] = st.[index_id]
WHERE o.[type] = 'U'
ORDER BY STATS_DATE(i.[object_id], i.index_id) ASC OPTION (RECOMPILE);


 类似资料:
  • 我们在ignite中面临着间歇性的性能问题,响应时间变得非常高,我们在日志中看到了下面的错误。我们有10个索引列,我没有看到索引有任何问题,因为“where”子句中的所有列都被索引了。联接发生在具有亲和性共定位的字段上,这意味着联接只发生在特定节点中的数据上,而不发生在Across ;节点上。 请让我知道你是否能在这方面提供任何帮助。  > Apache Ignite版本:2.7.5 启用Igni

  • 我在两个不同的API项目上断断续续地收到以下错误。API项目已正常运行近一年,没有变化。当错误开始发生时,它会以持续几分钟的突发方式发生,然后再次开始正常运行。错误事件每小时发生几次,我们在12小时前的昨晚早些时候注意到错误发生。感谢任何帮助。 接口范围:www.googleapis.com/auth/userinfo.profile www.googleapis.com/auth/userinf

  • 我在打Rest电话时遇到了tomcat的间歇性问题。设置: 应用程序在portX上运行独立的tomcat Application B在portY上的另一个独立tomcat上运行,两个tomcat安装都在同一台机器上。Java版本是JRE6 下面的参数被添加到bash profile-Dhttp中的JVM_OPTS中。代理主机=[主机]-Dhttp。proxyPort=[端口]-Dhttp。非Pro

  • 问题内容: 我有一个通过Apache https proxypass在Tomcat上运行的Java Spring Web应用程序,当它尝试访问安全的IBM Watson服务时间歇性地失败。Apache通过LetsEncrypt证书进行安全保护,该证书重定向到Tomcat端口8080。 环境: Java:jdk1.7.0_80 Solaris 10 Tomcat 8.0.33 Apache2.4.1

  • 我已经编写了一个程序,从usb摄像头捕获图像,并根据检测到的每帧颜色跟踪对象的位置。间歇性(可能在1分钟、10分钟或半小时后发生)我收到错误消息: 我遵循的流程是: 用相机拍摄一帧,cap=cv2。视频捕获(1)/cap。read() 变换几何,cv2。透视图 高斯模糊滤波器,cv2。高斯模糊 BGR到HSV转换,cv2。CVT彩色(模糊帧,cv2.COLOR\u BGR2HSV) 轮廓发现和分析

  • 我们遇到了Blob触发函数的问题。该函数是用javascript编写的。我们费了很大的劲才把自动化部署流程落实到位。以下是我们遵循的步骤。 > 使用ARM模板和参数文件在现有资源组中创建函数应用程序 通过<code>Kudu<code>api<code>调用RestMethod-Uri“$apiUrl”-方法Put-InFile“$functionCodeArchivePath”-凭证$crede