web-dev-qa-db-ja.com

SQL Serverデータベースのすべてのストアドプロシージャとテーブル値関数を再コンパイルする方法

SQL Serverデータベースでは、sp_recompileをストアドプロシージャで実行して、実行プランを更新できます。これをデータベース内のすべてのストアドプロシージャで実行したいと思います。また、すべてのテーブル値関数で同等の機能を実行したいのですが、実行するsysプロシージャがわかりません。

SQL Server Management Studioですべてのストアドプロシージャ名のsp_recompile行を手動で入力せずにこれを行うことは可能ですか?同様に、テーブル値関数についてはどうですか?

VM SQL Serverのメモリが大幅に増加しましたが、実行時間がわずかに増加しているだけです。実行プランは実行時間の80%以上を示しています。クラスター化されたインデックスのシークにあるので、ストアドプロシージャを最適化するためにこれ以上できることはないと思います。

6
Edmund

役立つと思われる場合は、カーソルを使用してsp_recompileをすべてに対して実行し、それぞれにアドホックSQLを生成して実行できます。

DECLARE C CURSOR FOR (SELECT [name] FROM sys.objects WHERE [type] IN ('P', 'FN', 'IF'));
DECLARE @name SYSNAME;
OPEN C;
FETCH NEXT FROM C INTO @name;
WHILE @@FETCH_STATUS=0 BEGIN
    EXEC sp_recompile @name;
    FETCH NEXT FROM C INTO @name;
END;
CLOSE C;
DEALLOCATE C;

または、アドホックSQLを生成し、EXECを介してそれを実行することで、必要なコードが少なくなり、わずかに効率が上がる可能性があります。

DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'EXEC sp_recompile '''+[name]+''''+CHAR(10) FROM sys.objects WHERE [type] IN ('P', 'FN', 'IF');
EXEC (@sql);

(私はこのフォームがlookingセットベースのために人をスローすることがありますが、文字列を繰り返し構築しているため、標準のSQLパターンではありません)

ここで同様の問題となる可能性のあるオブジェクトの別のセットはビューです。同様に、上記のカーソルまたはアドホックSQLメソッドに小さな変更を加えることで、保存されたプランやその他のメタデータがsp_refreshviewで古くなっていないことを確認するために再評価する必要があるものとしてマークすることができます。

DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'EXEC sp_refreshview '''+[name]+''''+CHAR(10) FROM sys.objects WHERE [type] IN ('V');
EXEC (@sql);

実行プランは、実行時間の80%以上がクラスター化インデックスシークにあることを示しているため、ストアドプロシージャを最適化するためにこれ以上実行できることはないと思います。

最適化には、スキャンよりもシークを優先する場合などがあります。インデックススキャンは、シーク操作の多くの実行よりも効率的である場合があります。また、見ているパーセント値が計算されるコストの見積もりは、最高(有用なガイドですが、時にはまったく正確ではありません)。

「それ以上のメモリを投入する」ことは、少なくとも一時的に、ボトルネックがメモリではなくCPUに非常にバインドされている場合や、IOバインドされている場合、メモリを追加すると非常に多くなります。少しの影響。

6
David Spillett

メモリを追加した場合(VMにホット追加された場合でも)、最大サーバーメモリを増やして一致させると、プランキャッシュがクリアされます。

それらは、再利用するためにキャッシュに保存された計画を持たないため、あなたが言及したそれらのすべてを効果的に「再コンパイル」します。 SQL Serverは新しいものを構築する必要があります。

ただし、最大サーバーメモリを設定したことがない場合もあります。それがわからない場合は、DBCC FREEPROCCACHEプランのキャッシュをクリアします。

これは、本番環境でご自身の責任で行ってください。新しい計画の改善を保証できません。

メモリはSQL Serverのすべてのパフォーマンスの問題を解決するわけではなく、Seekは必ずしもパフォーマンスチューニングの最終段階ではありません。

特定のクエリのヘルプが必要な場合は、別の質問をする必要があります。

3
Erik Darling