Sql server 如何确定SQL Server中正在编译的内容

Sql server 如何确定SQL Server中正在编译的内容,sql-server,sql-server-2008,Sql Server,Sql Server 2008,在跟踪我的SQLServer2008STDEdition安装上的性能监视器时,我注意到SQL编译/秒每5秒左右就会出现峰值,从3到大约50次 我们每秒的编译与批处理请求的比率也相对较高。我知道理想的比例应该是1/10,但我们的工作更像是8/10 db支持有大量应用程序的繁忙网站,因此很难确定是什么导致了过度编译,尤其是5秒的峰值。几乎所有的查询都是存储过程调用,而不是嵌入式SQL,我们有大量(48gb)RAM 是否有一种方法可以在给定的时间点查看当前正在编译的查询?如果是这样,我们可以确定是否有

在跟踪我的SQLServer2008STDEdition安装上的性能监视器时,我注意到SQL编译/秒每5秒左右就会出现峰值,从3到大约50次

我们每秒的编译与批处理请求的比率也相对较高。我知道理想的比例应该是1/10,但我们的工作更像是8/10

db支持有大量应用程序的繁忙网站,因此很难确定是什么导致了过度编译,尤其是5秒的峰值。几乎所有的查询都是存储过程调用,而不是嵌入式SQL,我们有大量(48gb)RAM


是否有一种方法可以在给定的时间点查看当前正在编译的查询?如果是这样,我们可以确定是否有问题。

当我过去不得不研究计划缓存/过度查询重新编译的问题时,我遵循了Microsoft白皮书中提供的指导,我强烈建议阅读,因为它涵盖了计划缓存、查询计划重用、重新编译的原因,确定重新编译和其他相关主题

话虽如此,SQL Server Profiler(如果作为客户端工具安装的一部分安装,则应位于Microsoft SQL Server 2008->Performance Tools下)公开了三个与查询编译直接相关的事件,这些事件可能对您有所帮助:

  • 光标
    • 草人
  • 演出
    • 用于查询编译的Showplan XML
  • 存储过程
    • SP:重新编译
您正在使用存储过程,因此可能只需要担心事件。每当重新编译存储过程、触发器或用户定义函数时,都会触发此事件。TextData列将显示导致语句重新编译的tsql语句的文本,EventSubClass列将显示指示重新编译原因的代码

SP的事件子类代码:在SQL 2008中重新编译

  • 1=架构已更改
  • 2=统计数据已更改
  • 3=重新编译DNR
  • 4=设置选项已更改
  • 5=临时表已更改
  • 6=远程行集已更改
  • 7=已更改浏览烫发
  • 8=查询通知环境已更改
  • 9=MPI视图已更改
  • 10=光标选项已更改
  • 11=具有重新编译选项
如果监视以下5个事件,您将能够看到哪些存储过程和语句正在SQL Server上调用,哪些存储过程和语句正在触发重新编译:

  • 储存程序
    • SP:启动
    • SP:StmtStarting
    • SP:重新编译
    • SP:已完成
  • 演出
    • 自动统计
我还通常设置探查器跟踪以捕获这些事件的所有列。我会说用这5个事件设置一个跟踪,运行一个跟踪30到60秒,然后暂停它,然后你应该对导致重新编译的原因有一个很好的快照

如果噪声太大,可以开始向跟踪属性添加列过滤器,以过滤输入/输出事件。例如,如果您发现大多数重新编译只发生在一次数据库上,请在databaseID或databaseName列上设置列筛选器,以便跟踪中只包含针对该数据库运行的查询

然后开始寻找正在重新编译查询的模式,并使用Microsoft的白皮书作为指南,说明它们可能触发重新编译的原因