2

SQLServer2005を実行しているサーバーが仮想マシンに変換されました。元のサーバーには16個の論理コアがありました。新しい仮想サーバーには4つのコアしかありませんが、より高速になるはずです。

一部のストアドプロシージャ(ビューまたはUDFを呼び出す場合があります)の実行に時間がかかります。これは、並列処理が少ないことが原因である可能性があります。しかし、クエリプランは16コア用に最適化できますか、それともハードウェアの変更後に自動的に再最適化されますか?

すべての計画を強制的に再計算する必要がある場合、最善の方法は何ですか?他の考え?

4

2 に答える 2

1

以下を使用して、プランのキャッシュをクリアできます。

DBCC FREEPROCCACHE;

ただし、これらの「遅い」クエリのいくつかについて、最初にいくつかの計画を調べて、最初に並列操作があるかどうかを確認します。

于 2012-06-08T18:21:38.653 に答える
1

並列クエリ処理は、保存されたクエリ プランで並列処理が可能であることを示していますが、特定の数のスレッドに具体的に関連付けられているわけではありません。

統計を更新した後など、新しいクエリ プランを定期的にコンパイルする理由は他にもあるかもしれません。ストアド プロシージャは、すべてのストアド プロシージャを再コンパイル用にマークするようにスケジュールできます。私は次のことでいくつかの成功を収めました:

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
于 2012-06-08T18:23:27.987 に答える