生成SQL查询计划需要5分钟,查询本身以毫秒为单位运行.这是怎么回事?

The*_*tan 10 sql t-sql sql-server stored-procedures sql-server-2008

我在SQL Server 2008上运行的存储过程相当复杂(或者看起来很丑陋,取决于你如何看待).它基于pk表和fk表的视图基于很多逻辑.fk表与pk表连接的次数略多于30次(fk表的设计很差 - 它使用了我需要展平的名称值对.不幸的是,它是第三方而我无法改变它).

无论如何,它已经运行好几周,直到我定期发现需要3-5分钟的运行.事实证明,这是生成查询计划所需的时间.一旦查询计划存在并被缓存,存储过程本身就会非常有效地运行.事情顺利进行,直到有理由再次重新生成和缓存查询计划.

有没有人见过这个?为什么生成计划需要这么长时间?有没有办法让它更快地提出计划?

gbn*_*gbn 3

某些原因会导致计划需要重新编译,例如统计数据更新或 DDL 更改。此处的列表:执行计划缓存和重用

当前形式的查询始终需要 3-5 分钟才能重新编译:这是无法避免的。

假设您无法更改它(PIVOT、使用触发器来维护“正确的”表等),那么您只能控制何时重新编译发生。

莱姆斯的计划指南答案是一种方法。我还会查看我的统计维护并确保它是在一夜之间完成的,所以它只在一天开始时发生一次