データベース統計情報の更新

Standard または Advancedのライセンスで利用可能。

データベース管理システム オプティマイザーは、クエリーに最適な計画を選択するために、データベース統計情報を使用します。 クエリーのパフォーマンスを維持するため、テーブルまたはフィーチャクラスのコンテンツが大幅に変更された場合に、統計情報を更新します。たとえば、大量のレコードをテーブルに読み込んだ場合や、テーブルに対して多くの編集を行った場合などです。

エンタープライズ ジオデータベースの次のタイプのテーブルとインデックスに対して、統計情報を更新できます:

  • ユーザー定義のテーブルとフィーチャクラスおよびその関連インデックス
  • トラディショナル バージョニング用に登録されたテーブルとフィーチャクラスの差分テーブルおよび差分テーブル上のインデックス
  • ジオデータベース履歴管理が有効化されたテーブルとフィーチャクラスの履歴アーカイブ テーブル、およびアーカイブ テーブルのインデックス
  • ジオデータベース システム テーブル
注意:

データベースの統計情報の更新は、入出力 (I/O) の負荷が高い処理です。 データベースの負荷が低い時間帯に統計情報を更新します。

データベース管理者はデータベース ツールを使用して、ユーザーが作成したテーブルとフィーチャクラスのデータベース統計情報を更新できます。 ただし、エンタープライズ ジオデータベース内のテーブルとフィーチャクラスに関する統計情報を更新する際は、データベース管理者はそれらに関連する正しいジオデータベース内部テーブルに関する統計情報も更新する必要があります。 これらの内部テーブルの統計情報が更新されるようにするには、[データセットの分析 (Analyze Datasets)] ジオプロセシング ツールまたは AnalyzeDatasets_management ArcPy 関数を実行します。

ジオデータベース システム テーブルのデータベース統計情報を更新する際も、[データセットの分析 (Analyze Datasets)] ジオプロセシング ツールまたは AnalyzeDatasets_management ArcPy 関数を使用します。 多くの新しいテーブルまたはフィーチャクラスがジオデータベースに追加された場合、大量のバージョン対応の編集が行われた場合、またはジオデータベースが圧縮された場合は、ジオデータベース システム テーブルに関する統計情報を更新します。

テーブルの所有者としてツールまたは関数を実行する必要があります。 ジオデータベース システム テーブルの場合、所有者はジオデータベース管理者です。

データセットの分析 (Analyze Datasets) ツールの使用

[データセットの分析 (Analyze Datasets)] ジオプロセシング ツールを使用して、データベース統計情報を更新できます。 このツールは、データの所有者がデータセット内の解析対象のテーブルとフィーチャクラスを選択し、ジオデータベース管理者がジオデータベース システム テーブルに関する統計情報を更新できるようにします。

  1. ArcGIS Pro を起動し、統計情報を更新するテーブルを含むジオデータベースに接続します。

    分析対象のテーブルの所有者として接続します。

  2. [データセットの分析 (Analyze Datasets)] ジオプロセシング ツールを開きます。

    [検索] フィールドにツール名を入力してツールを検索して開くか、データ管理ツールボックスのジオデータベース管理ツールセット内のツールを参照します。

  3. 手順 1 で作成したデータベース接続ファイルを、入力ワークスペースとして使用します。
  4. 以下の 1 つ以上のオプションを選択し、解析対象のテーブルを指定します:
    • 選択したユーザー定義テーブルの統計情報を更新するには、[選択したデータセットのベース テーブルの分析] をオンのままにします。
    • トラディショナル バージョン対応登録されたデータセットのテーブルの追加および削除に関する統計情報を更新する場合は、[選択したデータセットの差分テーブルの分析] をオンにします。
    • 履歴管理が有効化されたデータセットの履歴アーカイブ テーブルに関する統計情報を更新する場合は、[選択したデータセットのアーカイブ テーブルの分析] をオンにします。
    • ジオデータベース システム テーブルに関する統計情報を更新する場合は、[システム テーブルを含める] をオンにします。 このオプションを使用するには、前のステップで指定したデータベース接続ファイルをジオデータベース管理者として接続する必要があります。
  5. [実行] をクリックします。

選択したテーブルとそれらのインデックスの統計情報が更新されます。

Python スクリプトの実行

Python スクリプトで AnalyzeDatasets_management ArcPy 関数を呼び出して、ベース テーブル、差分テーブル、アーカイブ テーブル、またはジオデータベース システム テーブルに関する統計情報を更新できます。 [データセットの分析 (Analyze Datasets)] ツールと同様に、分析対象のテーブルの所有者として AnalyzeDatasets_management ArcPy 関数を実行する必要があります。

以下の Python スクリプトを実行するときに、データベース接続ファイル (.sde ファイル) を指定します。 このスクリプトは、接続で指定されたユーザーが所有するすべてのテーブルの統計情報を更新します。

たとえば、データベース接続ファイル entgdb.sde (/usr/connections にあります) を使用して Linux 上でこのスクリプトを実行するには、以下を入力します。

./ AnalyzeDatasets.py /usr/connections/entgdb.sde

このスクリプトを実行してシステム テーブルに対して統計情報を更新するには、ジオデータベース管理者として接続する接続ファイルを指定します。

# Name: AnalyzeDatasets.py
# Description: analyzes all datasets in an enterprise geodatabase
#              for a given user.

# Import system modules
import arcpy
import os

# set workspace
# the user in this workspace must be the owner of the data to analyze.
workspace = "C:\\MyProject\\MyDataConnection.sde"

# set the workspace environment
arcpy.env.workspace = workspace

# NOTE: Analyze Datasets can accept a Python list of datasets.

# Get the user name for the workspace
userName = arcpy.Describe(workspace).connectionProperties.user

# Get a list of all the datasets the user owns by using a wildcard that incldues the user name
# First, get all the stand alone tables, feature classes and rasters.
dataList = arcpy.ListTables(userName + "*") + arcpy.ListFeatureClasses(userName + "*") + arcpy.ListRasters(userName + "*")

# Next, for feature datasets get all of the datasets and featureclasses
# from the list and add them to the master list.
for dataset in arcpy.ListDatasets(userName + "*", "Feature"):
    arcpy.env.workspace = os.path.join(workspace,dataset)
    dataList += arcpy.ListFeatureClasses(userName + "*") + arcpy.ListDatasets(userName + "*")

# reset the workspace
arcpy.env.workspace = workspace

# Execute analyze datasets
# Note: to use the "SYSTEM" option the workspace user must be an administrator.
arcpy.management.AnalyzeDatasets(workspace, "NO_SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
print("Analyze Complete")