データベースのバックアップ、整合性チェック、およびパフォーマンスの最適化は、DBAのコアとなる通常のタスクです。クライアントデータは、DBAがデータベースのバックアップを管理し、バックアップの整合性を確保するために非常に重要です。したがって、本番データベースに問題が発生した場合でも、最小限のダウンタイムで復旧できます。データベースの整合性チェックも重要です。データベースが破損した場合、ダウンタイムとデータ損失を最小限に抑えて修正できるためです。データベースのパフォーマンスを管理することも重要です。データベースのパフォーマンスの管理は、複数のタスクの組み合わせです。
- リソースを大量に消費するクエリのリストを特定し、開発者がそれらを書き直すのを支援します。
- テーブルのインデックスを作成および管理します。また、インデックスの最適化を実行して、インデックスが良好な状態に保たれていることを確認します。
- 最後に、テーブルの統計を管理します。
前回の記事では、統計の自動作成と統計の自動更新のトピックと、それらがパフォーマンスの向上にどのように役立つかについて説明しました。この記事では、統計を更新するための保守計画を作成およびスケジュールする方法について説明します。
まず、SQL Serverの統計とは何か、SQLServerのパフォーマンスを向上させるのにどのように役立つかについて説明します。
SQLServerの統計とその重要性
統計は、SQL Serverクエリオプティマイザーによって使用されるメタデータであり、データを取得するための最良の方法を決定するのに役立ちます。オプティマイザーは統計を使用して、データ、その分布、および特定のクエリが使用可能な統計から返す可能性のある行数を理解します。この情報に基づいて、最適なデータアクセスパスを決定します。また、テーブルスキャンまたはインデックスシークを実行するか、ネストされたループ結合またはハッシュ結合を使用するかなども決定します。
統計が古くなっている場合、または統計が利用できない場合、オプティマイザーは不十分な実行プランを選択する可能性があり、これによりクエリのパフォーマンスが大幅に低下します。 SQL Serverは、統計を自動的に維持し、データ変更の追跡に基づいて統計を更新できます。
「統計の自動作成」と「統計の自動更新」を有効にすると、統計を自動的に作成および更新できます。ただし、データ分散が大幅に変更されるテーブルなど、一部のテーブルでは、SQL Serverの自動統計更新では、一貫して高レベルのクエリパフォーマンスを維持するには不十分である可能性があります。
統計を更新するためのさまざまなアプローチを説明する前に、任意のテーブルで作成された統計を確認するためのさまざまな方法を説明しましょう。
統計を確認する方法
列の統計とインデックスの統計を表示できます
- SQL ServerManagementStudioの使用。
- システムストアドプロシージャとシステムカタログおよび動的管理ビューの使用
SQL ServerManagementStudioを使用して統計を表示する
たとえば、[HumanResources]。[Employee]で作成された統計を確認したい AdventureWorks2017で作成されたテーブル データベース。これを行うには、SQL ServerManagementStudioを起動します。次に、 AdventureWorks2017を展開します データベースで、[HumanResources]。[Employee]を展開します テーブル。次の画像を参照してください:
システムストアドプロシージャと動的管理ビューの使用
古いバージョンのSQLServerを使用している場合は、 sp_helpstatsを使用できます。 テーブルの統計を確認するためのシステム手順。 sp_helpstats SQLServerまたはユーザーによって作成された統計が表示されます。インデックスによって作成された統計は表示されません。それを実証するために、 User_Statistics_BirthDateという名前の統計を作成しました [HumanResources]。[Employee] テーブル。
次に例を示します。
USE ADVENTUREWORKS2017 GO EXEC SP_HELPSTATS 'HUMANRESOURCES.EMPLOYEE'
以下は出力です。
sys.stats にクエリを実行すると、統計を確認できます。 システムカタログ。 SQL Serverによって作成され、インデックスによって作成され、ユーザーによって作成された統計に関する情報を提供します。
次のクエリを実行します:
SELECT NAME AS 'STATISTICS NAME', AUTO_CREATED AS 'CREATED AUTOMATICALLY', USER_CREATED AS 'CREATED BY USER' FROM SYS.STATS WHERE OBJECT_ID = OBJECT_ID('HUMANRESOURCES.EMPLOYEE')
出力は次のとおりです。
それでは、このテーブルを他のシステムカタログと結合して、統計に関する詳細情報を取得しましょう。これを行うには、次のクエリを実行します。
SELECT [SCHEMAS].[NAME] + '.' + [OBJECTS].[NAME] AS [TABLE_NAME], [INDEXES].[INDEX_ID] AS [INDEX ID], [STATS].[NAME] AS [STATISTIC], STUFF((SELECT ', ' + [COLUMNS].[NAME] FROM [SYS].[STATS_COLUMNS] [STATS_COLUMN] JOIN [SYS].[COLUMNS] [COLUMNS] ON [COLUMNS].[COLUMN_ID] = [STATS_COLUMN].[COLUMN_ID] AND [COLUMNS].[OBJECT_ID] = [STATS_COLUMN].[OBJECT_ID] WHERE [STATS_COLUMN].[OBJECT_ID] = [STATS].[OBJECT_ID] AND [STATS_COLUMN].[STATS_ID] = [STATS].[STATS_ID] ORDER BY [STATS_COLUMN].[STATS_COLUMN_ID] FOR XML PATH('')), 1, 2, '') AS [COLUMNS_IN_STATISTIC] FROM [SYS].[STATS] [STATS] JOIN [SYS].[OBJECTS] AS [OBJECTS] ON [STATS].[OBJECT_ID] = [OBJECTS].[OBJECT_ID] JOIN [SYS].[SCHEMAS] AS [SCHEMAS] ON [OBJECTS].[SCHEMA_ID] = [SCHEMAS].[SCHEMA_ID] LEFT OUTER JOIN [SYS].[INDEXES] AS [INDEXES] ON [OBJECTS].[OBJECT_ID] = [INDEXES].[OBJECT_ID] AND [STATS].[NAME] = [INDEXES].[NAME] WHERE [OBJECTS].[OBJECT_ID] = OBJECT_ID(N'HUMANRESOURCES.EMPLOYEE') ORDER BY [STATS].[USER_CREATED] GO
上記のクエリは、次の詳細を入力します
- 統計が作成されるテーブル。
- インデックスID。
- 統計の名前。
- 統計に含まれる列。
出力は次のとおりです。
次のセクションでは、統計を更新するさまざまな方法について説明します。
統計更新へのさまざまなアプローチ
次の方法で統計を更新できます。
- SQLServerのメンテナンスプランを作成します。
- カスタムスクリプトを使用して作成します。
- 個々のテーブルでupdatestatisticsコマンドを手動で実行します。
まず、統計を更新するための保守計画を作成する方法について説明します。
統計を更新するSQLServerメンテナンスプランを作成する
ここで、このデモでは、統計を更新するための更新統計保守計画を作成します。メンテナンスプランは次のタスクを実行します:
まず、メンテナンスプランを作成します。これを行うには、SQL ServerManagementStudioを開きます。 [SQLサーバーインスタンス]>>[管理フォルダー]>>[管理]で、[MaintenancePplans]を右クリックし、[新しいメンテナンスプラン]を選択します。次の画像を参照してください:
新しいメンテナンスプラン ダイアログボックスが開きます。ボックスに、メンテナンスプランの名前を入力し、[OK]をクリックします。次の画像を参照してください:
保守計画設計者が開きます。メンテナンスプランデザイナツールボックスで、デザイナウィンドウに「統計の更新タスク」をドラッグアンドドロップします。次の画像を参照してください:
次に、統計タスクの更新をダブルクリックします。 。 統計の更新タスク ダイアログボックスが開きます。ダイアログボックスには、メンテナンスプランをカスタマイズするために使用できるオプションがあります。次の画像を参照してください:
統計の更新保守計画の使用に関して、次のオプションをカスタマイズできます。
- 特定のデータベースのすべてのオブジェクトの統計を更新します。次の画像を参照してください:
- 選択したデータベースの特定のオブジェクト。すべてのテーブルとビュー/特定のテーブルとビューの統計を更新できます。次の画像を参照してください:
SQLよりもテーブルまたはビューを選択すると、選択範囲のビューまたはテーブルの名前が入力されますダイアログボックス。次の画像を参照してください:
- 3番目のオプションは更新です 。テーブル/ビューのすべての統計を更新するか、列統計(インデックス付けされていない列で作成された統計)のみを更新するか、インデックス統計のみ(インデックスによって作成された統計)を選択するかを選択できます。次の画像を参照してください:
- 任意の統計のスキャンタイプを選択することもできます。 フルスキャンを選択できます またはサンプル 指定されたパーセンテージまたは指定された行。次の画像を参照してください:
ここで、前述したように、 AdventureWorks2017内のすべてのテーブルの統計を更新するメンテナンスタスクを作成します。 フルスキャンのデータベース。したがって、それに応じてオプションを選択してください。メンテナンスタスクを設定すると、次のようになります。
メンテナンスタスクが適切に構成されたら、統計の更新ダイアログを閉じます。構成後のメンテナンスプランは次のようになります。
メンテナンスプランが作成されたら、メンテナンスプランをスケジュールしましょう。これを行うには、説明の反対側にあるカレンダーアイコンをクリックします 桁。次の画像を参照してください:
カレンダーボタンをクリックすると、ジョブスケジュールを設定するためのダイアログボックスが開きます。次の画像を参照してください:
前述したように、更新統計保守計画は毎週日曜日の午前4時に実行されます。したがって、それに応じてジョブスケジュールを構成します。ジョブのスケジューリングは簡単です。スケジュールを設定すると、ダイアログボックスは次のようになります。
実行スケジュールを設定すると、全体の保守計画は次の図のようになります。メンテナンスプランを保存してウィンドウを閉じます。
次に、保守計画によって作成されたSQLジョブを実行して、この保守計画を実行してみましょう。 SQLジョブを開くには、[SQLServerエージェント]を展開します ジョブを展開します 。 SQLメンテナンスプランによって作成されたSQLジョブを確認できます。ここでジョブを実行するには、 Update Statistics Weekly.Weekly.Subplan_1を右クリックします。 ステップでジョブを開始をクリックします 。次の画像を参照してください。
ジョブが完了すると、次の[ジョブの実行が成功しました]ダイアログボックスが表示されます。
概要
この記事では、以下について説明しました:
- SQLServer統計とその重要性の詳細な説明。
- 統計を更新するためのさまざまなオプション。
- 統計を更新するためのSQLメンテナンスプランを作成する実例。
次の記事では、統計を更新するためのさまざまなT-SQLコマンドについて説明します。さらに、テーブルで挿入/更新/削除が発生した後に発生したデータ変更の量に基づいて統計を更新するT-SQLスクリプトについて説明します。