我有一台 SQL Server(四核 x86,4GB RAM),其“SQLServer:SQL 统计信息:SQL 编译/秒”和“SQLServer:SQL 统计信息:SQL 批处理/秒”的值始终几乎相同。这可以解释为服务器运行 100% 的临时查询,每个查询都必须重新编译,但这里的情况并非如此。sys.dm_exec_query_stats DMV 列出了数百个查询计划,其执行计数远大于 1。
有人知道如何解释/排除这种现象吗?顺便说一句,服务器的常规性能计数器(CPU、I/O、RAM)都显示利用率非常低。
答案1
Sleepless,有些事情可能会导致过程/查询重新编译,例如当表有新的统计数据时,但最常见的情况是当您的过程/查询包含动态语句时,如下所示:
DECLARE @sqlCommand varchar(1000)
DECLARE @columnList varchar(75)
DECLARE @city varchar(75)
SET @columnList = 'CustomerID, ContactName, City'
SET @city = '''London'''
SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = ' + @city
EXEC (@sqlCommand)
由于语句在不同的调用之间不可重复,因此每次都会重新编译查询计划。您的解决方案有很多过程,还是它针对数据库发出查询?
答案2
如果您看到很多“缓存未命中”(并且您没有使用很多动态查询/EXEC 语句),那么您的 SQL Server 可能配置为使用太少的 RAM。
您可以使用 SQL Management Studio 检查此配置,右键单击服务器并选择属性。在“内存”页面中,您可以检查服务器配置的最小和最大限制。