none
统计信息被更新后,sql语句会重新做硬解析的操作吗? RRS feed

答案

  • 要看AUTO_UPDATE_STATISTICS 的选项:

    当 AUTO_UPDATE_STATISTICS 数据库选项被设置为 ON 时,如果查询以表或索引视图为目标,而自上次执行后,表或索引视图的统计信息已更新或基数已发生很大变化,查询将被重新编译。此行为适用于标准用户定义表、临时表以及由 DML 触发器创建的 inserteddeleted 表。如果过多的重新编译影响到查询的性能,请考虑将此设置更改为 OFF。当 AUTO_UPDATE_STATISTICS 数据库选项设置为 OFF 时,不会因统计信息或基数的更改而发生任何重新编译,但是,由 DML INSTEAD OF 触发器创建的 inserteddeleted 表除外。因为这些表是在 tempdb 中创建的,因此,是否重新编译访问这些表的查询取决于 tempdb 中 AUTO_UPDATE_STATISTICS 的设置。请注意,在 SQL Server 2000 中,即使此设置为 OFF,查询仍然会基于 DML 触发器 inserteddeleted 表的基数变化进行重新编译。有关禁用 AUTO_UPDATE_STATISTICS 的详细信息,请参阅使用统计信息提高查询性能


    Please Mark As Answer if it is helpful.

    2013年10月29日 4:40
  • 最近微软的网站访问速度可以用龟速来形容,包括论坛

    在《SQLSERVER企业级平台管理实践》里面有这样的描述:

    -5、当表格或者视图上的统计信息发生变化后
    --当统计信息被手动更新后,或者SQL发现某个统计信息需要自动更新时,SQL会对所涉及
    --的语句都做重编译


    --4、统计信息更新
    --统计信息手工或者自动更新后,对和他有关的执行计划都不再能重用,而会产生重编译
    --这样能够保证下次运行的语句能够根据数据变化使用新的执行计划


    --keepfixed plan强制查询优化器不因统计信息的更改而重新编译查询。只有在基础表的结构
    --发生变化后,或者有人运行过sp_recompile以后,才会发生重编译。用户可以像下面这样
    --使用他
    SELECT b.col4,SUM(a.col1)
    FROM [dbo].permtable a INNER JOIN #temptable b ON a.col1=b.col2
    WHERE b.col3<100
    GROUP BY b.col4
    OPTION(keepfixed plan)

    -7、用户在调用语句的时候,使用了“keep plan”或者“keepfixed plan”这样的查询提示(Hint)
    --keep plan放宽了对临时表的重编译阀值,使得SQL像对普通表一样对待临时表,不会在上面
    --做额外的重编译。用户可以像下面这样使用他:
    SELECT b.col4,SUM(a.col1)
    FROM [dbo].permtable a INNER JOIN #temptable b ON a.col1=b.col2
    WHERE b.col3<100
    GROUP BY b.col4
    OPTION(KEEP PLAN)


    --3、SQL Trace里的一些和编译有关的事件
    --在SQLTrace里有一些事件可用很有效地跟踪编译和重编译行为
    --SQLTrace里的一些和编译有关的事件
    --cursors -cursorrecompile:当游标所基于的对象发生架构变化,导致的TSQL游标做的重编译
    --performance -auto stats:发生自动创建或者更新统计信息的事件

    2013年10月29日 5:57

全部回复

  • 不一定 参考Kimberly Tripp 的文章:hat caused that plan to go horribly wrong – should you update statistics?

    Here’s a quick summary though because it looks like things have changed again in SQL Server 2012…

    • In SQL Server 2005, 2008 and 2008R2 – updating statistics only caused plan invalidation when the database option auto update statistics is on.
    • In SQL Server 2012 – updating statistics does not cause plan invalidation regardless of the database option.


    Please Mark As Answer if it is helpful.

    2013年10月29日 2:01
  • 要看AUTO_UPDATE_STATISTICS 的选项:

    当 AUTO_UPDATE_STATISTICS 数据库选项被设置为 ON 时,如果查询以表或索引视图为目标,而自上次执行后,表或索引视图的统计信息已更新或基数已发生很大变化,查询将被重新编译。此行为适用于标准用户定义表、临时表以及由 DML 触发器创建的 inserteddeleted 表。如果过多的重新编译影响到查询的性能,请考虑将此设置更改为 OFF。当 AUTO_UPDATE_STATISTICS 数据库选项设置为 OFF 时,不会因统计信息或基数的更改而发生任何重新编译,但是,由 DML INSTEAD OF 触发器创建的 inserteddeleted 表除外。因为这些表是在 tempdb 中创建的,因此,是否重新编译访问这些表的查询取决于 tempdb 中 AUTO_UPDATE_STATISTICS 的设置。请注意,在 SQL Server 2000 中,即使此设置为 OFF,查询仍然会基于 DML 触发器 inserteddeleted 表的基数变化进行重新编译。有关禁用 AUTO_UPDATE_STATISTICS 的详细信息,请参阅使用统计信息提高查询性能


    Please Mark As Answer if it is helpful.

    2013年10月29日 4:40
  • 最近微软的网站访问速度可以用龟速来形容,包括论坛

    在《SQLSERVER企业级平台管理实践》里面有这样的描述:

    -5、当表格或者视图上的统计信息发生变化后
    --当统计信息被手动更新后,或者SQL发现某个统计信息需要自动更新时,SQL会对所涉及
    --的语句都做重编译


    --4、统计信息更新
    --统计信息手工或者自动更新后,对和他有关的执行计划都不再能重用,而会产生重编译
    --这样能够保证下次运行的语句能够根据数据变化使用新的执行计划


    --keepfixed plan强制查询优化器不因统计信息的更改而重新编译查询。只有在基础表的结构
    --发生变化后,或者有人运行过sp_recompile以后,才会发生重编译。用户可以像下面这样
    --使用他
    SELECT b.col4,SUM(a.col1)
    FROM [dbo].permtable a INNER JOIN #temptable b ON a.col1=b.col2
    WHERE b.col3<100
    GROUP BY b.col4
    OPTION(keepfixed plan)

    -7、用户在调用语句的时候,使用了“keep plan”或者“keepfixed plan”这样的查询提示(Hint)
    --keep plan放宽了对临时表的重编译阀值,使得SQL像对普通表一样对待临时表,不会在上面
    --做额外的重编译。用户可以像下面这样使用他:
    SELECT b.col4,SUM(a.col1)
    FROM [dbo].permtable a INNER JOIN #temptable b ON a.col1=b.col2
    WHERE b.col3<100
    GROUP BY b.col4
    OPTION(KEEP PLAN)


    --3、SQL Trace里的一些和编译有关的事件
    --在SQLTrace里有一些事件可用很有效地跟踪编译和重编译行为
    --SQLTrace里的一些和编译有关的事件
    --cursors -cursorrecompile:当游标所基于的对象发生架构变化,导致的TSQL游标做的重编译
    --performance -auto stats:发生自动创建或者更新统计信息的事件

    2013年10月29日 5:57