web-dev-qa-db-ja.com

msdbでクエリストアを有効にするとどのようなメリットがありますか?

SQLシステムデータベース(master、model、msdb、tempdb)のクエリストアは、msdbでのみ使用できます。 msdbのクエリストアに関するドキュメントを探しましたが見つかりませんでした。

GUIには表示されませんが、SQL 2016インスタンスで検証できます

クエリストアの検証がオフです

USE msdb
SELECT * FROM sys.database_query_store_options; 

クエリストアをオンにする

USE [master]
GO
ALTER DATABASE msdb SET QUERY_STORE = ON
GO
ALTER DATABASE msdb SET QUERY_STORE (OPERATION_MODE = READ_WRITE
, INTERVAL_LENGTH_MINUTES = 30
, MAX_STORAGE_SIZE_MB = 1000
, QUERY_CAPTURE_MODE = AUTO)
GO

クエリストアの検証がオンになっています

USE msdb
SELECT * FROM sys.database_query_store_options; 

すべてのシステムデータベースの中で、msdbがクエリストアを使用するオプションを持つ唯一のデータベースである理由と、それによって追加される値は何ですか。

-- Stop Query Store
USE [master]
GO
ALTER DATABASE msdb SET QUERY_STORE = OFF
GO
9
James Jenkins

Microsoftが機能を有効にしても、それがすべての人に役立つとは限りません。一部の機能を使用するシステムの場合、MSDBに格納されている情報に依存することになります。このような場合、クエリストアが役立ちます。

以下は、MSDBデータベースオブジェクトの使用法とチューニングに関する記事です。

msdbデータベース オンラインブックから。

MSDBパフォーマンスチューニング by Geoff N. Hiten

MSDBでのメンテナンスの重要性 Tim Radneyによると、彼は次のように述べています。

Msdbでのインデックスの最適化は、ユーザーデータベースと同じくらい重要です。多くの場合、ユーザーデータベースを最適化しているが、システムデータベースは最適化していないクライアントを見つけました。 msdbデータベースは、SQL Serverエージェント、ログ配布、Service Broker、SSIS、バックアップと復元、およびその他のプロセスによって頻繁に使用されるため、インデックスが非常に断片化する可能性があります。インデックス最適化ジョブにもシステムデータベース、または少なくともmsdbが含まれていることを確認してください。インデックスの最適化により、msdb内の非常に断片化されたインデックスから数ギガバイトのスペースが解放されるのを見てきました。

クエリストアが、インデックス作成戦略を最適化し、MSDBに格納されている情報の一部を最適にクエリ/集約/パージするのにどのように役立つかがわかります。

7
SqlWorldWide

@SqlWorldWideは質問の「なぜ[msdb]」の部分に回答したので、ここではそれを複製しません。しかし、質問の「なぜ[master][model][tempdb]」ではない部分に答えるには:

  • [tempdb]は一時的なストレージであり、その性質上、自動最適化または履歴分析を提供する機能のどちらからも恩恵を受けることはないようです。クエリストアがストアドプロシージャの実行統計を追跡する場合、ストアドプロシージャが他の場所に存在する場合、ここでは役に立ちません。一時的なストアドプロシージャを作成することは可能ですが、ローカルの一時的なストアドプロシージャの名前には、複数のセッション間で同様の名前を分離するための一意のハッシュコードが含まれているため、これによるメリットはおそらくありません。また、一時的な性質を考えると、グローバル一時Stored Procはセッション間で一貫した名前を持っていますが、セッション全体で同じ名前のグローバル一時Stored Proc(同時にではないと想定)が同じコードを持っていると仮定する方法はありません。したがって、意味のある/相関可能な統計を持つことはできません。

  • [model]は、新しいデータベースを作成するためのテンプレートです([tempdb]を含み、SQL Serverインスタンスが起動/再起動するたびに再作成されます)。ここからクエリは実行されません。ただし、ここではクエリストアを有効にしてmightすると、新しいDBを作成するときにデフォルトでオンになるようになっていると思います。ただし、thatに対しては、クエリストアが[tempdb]で有効になることを意味し、それはばかげています(上記のポイントを参照)。

    UPDATE:
    おお、ネリー! 最初の質問 をもう一度読んだところ、これがこの問題につながり、奇妙なことに気付きました。[master][tempdb]のエラーメッセージのみがありました。 [model]のエラーは報告されていません。 O.P.が質問にコピーするときにそのエラーメッセージを単に省略した可能性があるため、SQL Server 2016 SP1-CU7-GDR(13.0.4466.4)で次のコマンドを実行して自分で確認しました。

    ALTER DATABASE [model] SET QUERY_STORE = ON; -- completes successfully!
    
    -- Restart instance to force recreation of [tempdb];
    
    CREATE DATABASE [IsQueryStoreEnabledByDefault];
    
    SELECT * FROM sys.databases WHERE [is_query_store_on] = 1;
    
    DROP DATABASE [IsQueryStoreEnabledByDefault];
    

    そして結果は? [model][IsQueryStoreEnabledByDefault]が返されますが、[tempdb]は結果にではありません!したがって、最初の2つの "however"にhoweverを追加すると、[model]canにクエリストアがあるようです有効化されたa)デフォルトでクエリ保存の有効化(はい、それはWordです。私は;-)でも新しく作成されたDBをチェックし、b)サービスの開始時に[tempdb]を再作成するために無視されます(したがって、これは[tempdb])で有効にするためのバックドアではありません。

  • [master]はメインシステムデータベースであり、ここではコードを実行しないでください。また、ここに存在し、頻繁に使用されるストアドプロシージャは、最適化の恩恵を受けないか、それらが呼び出されるユーザーデータベースのコンテキストで実行されます(つまり、sp_で始まるシステムストアドプロシージャは、すべてのDBに「出現」— [master]..で完全に修飾する必要はなく、実際に各DBに存在するかのように実行し、おそらくそれらが存在するユーザーデータベースのクエリストアによって管理されます呼び出されました。

5
Solomon Rutzky