解决高SQL Server编译/批处理比率问题

我有一个SQL Server(四核x86,4GB内存),它不断具有“SQLServer:SQL统计:SQL编译/秒”和“SQLServer:SQL统计:SQL批/秒”几乎相同的值。 这可以解释为运行100%即席查询的服务器,其中每一个都必须重新编译,但在这里并不是这样。 sys.dm_exec_query_stats DMV列出数百个查询计划,其执行计数远远大于1。

有没有人有任何想法如何解释/排除这种现象? 顺便说一句,服务器的一般性能计数器(CPU,I / O,RAM)都显示非常适度的利用率。

不眠的是,有些事情可能导致过程/查询重新编译,例如当表有新的统计信息时,但最常见的情况是当你的过程/查询包含一个dynamic语句,如下所示:

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) 

由于声明在不同的调用之间是不可重复的,查询计划每次都要重新编译。 你的解决scheme有很多的程序,或者它发出针对数据库的查询?

如果你看到很多“cache miss”(你没有使用许多dynamic查询/ EXEC语句),你的SQL Server可能被configuration为使用太less的ram。

你可以使用sqlpipe理工作室检查这个configuration,右键单击服务器并select属性。 在“内存”页面中,您可以检查服务器configuration的最小和最大限制。