更改服务器核心数后,是否需要重新优化视图和过程



运行 SQL Server 2005 的服务器已转换为虚拟机。 原始服务器有 16 个逻辑内核。 新的虚拟服务器只有 4 个内核,但应该更快。

某些存储过程(可能调用视图或 UDF)需要更长的时间来运行。 这可能是由于并行性较低。 但是,查询计划是否仍针对 16 个内核进行优化,还是在硬件更改后自动重新优化?

如果我需要强制重新计算所有计划,最好的方法是什么? 其他想法?

并行查询处理显示保存的查询计划允许并行处理,但不专门绑定特定数量的线程。

可能还有其他原因需要定期编译新的查询计划,例如在更新统计信息之后。 可以计划存储过程以标记要重新编译的所有存储过程。 我在以下方面取得了一些成功:

create procedure [dbo].[INUpdateStatistics]
as
  set nocount on
  create table #Tables ( Table_Qualifier sysname, Table_Owner sysname, Table_Name sysname, Table_Type VarChar(32), Remarks VarChar(254) )
  declare CTable cursor local for select Table_Name, Table_Owner, Table_Type from #Tables order by Table_Name
  declare @TableName as sysname
  declare @TableOwner as sysname
  declare @TableType as sysname
  -- Get the list of tables in the database.
  insert into #Tables exec sp_tables
  open CTable
  fetch next from CTable into @TableName, @TableOwner, @TableType
  -- For each table ... .
  while @@Fetch_Status = 0
    begin
    if @TableOwner = 'dbo' and @TableType = 'TABLE'
      begin
      -- Update statistics for all user tables.
      execute( 'update statistics [' + @TableName + '] with fullscan, all' )
      -- Recompile all stored procedures and triggers when they are next executed.
      exec sp_recompile @objname = @TableName
      -- Throttle the loop.
      waitfor delay '00:00:01'
      end
    fetch next from CTable into @TableName, @TableOwner, @TableType
    end
  -- Houseclean.
  close CTable
  deallocate CTable
  drop table #Tables

您可以使用以下方法清除计划缓存:

DBCC FREEPROCCACHE;

但是,对于其中一些"较慢"的查询,我会先检查您的一些计划,以查看它们是否首先具有任何并行操作。

最新更新