Python スクリプトによるジオデータベース システム テーブルの統計情報の更新

データベース統計情報は、実行されるクエリに対して最適な実行プランを選択するために、DBMS オプティマイザによって使用されます。テーブルの内容が大きく変更された後には、統計情報を更新してください。ArcSDE ジオデータベース システム テーブルの場合は、新しいテーブルまたはフィーチャクラスをジオデータベースに追加した後、バージョン対応の編集を大量に行った後、またはジオデータベースを圧縮した後に、統計情報を更新します。

データベースの統計情報の更新は、I/O に大きな負荷がかかる場合があるため、データベースからほとんどのユーザがログアウトしている間に実行します。[データセットの分析(Analyze Datasets)] ツールを呼び出して ArcSDE ジオデータベース システム テーブルの統計情報を更新する Python スクリプトを作成し、このスクリプトを夜間に実行するようにスケジュールを設定できます。Windows のタスク スケジューラを使用して、スクリプトを実行する時刻を設定できます。Linux では、cron ジョブを設定してスクリプトを実行できます。

手順:
  1. Python および以下のいずれかの ArcGIS クライアントがインストールされているコンピュータに、次のスクリプトのいずれかをコピーします。
    • ArcGIS for DesktopStandard または Advanced
    • ArcGIS Engine と Geodatabase Update エクステンション
    • ArcGIS Runtime
    • ArcGIS for Server(Standard または Advanced)

    環境に固有の情報に基づいて、スクリプトを変更します。

    このスクリプトは、ローカル コンピュータ上の既存のデータベース接続ファイルを使用してデータベースに接続し、スクリプトを実行します。

    # Name: UStatsSysTbls.py
    # Description: Updates statistics on enterprise geodatabase  
    # system tables using an existing .sde file.
    
    # Author: Esri
    
    # Import system modules
    import arcpy, os
    
    # set workspace
    workspace = arcpy.GetParameterAsText(0)
    
    # set the workspace environment
    arcpy.env.workspace = workspace
    
    # Execute analyze datasets for system tables
    arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", "", "","","")
    print "Analyze Complete"
    

    このサンプル スクリプトには、Oracle データベースに接続してシステム テーブルの統計情報を更新するために必要な情報が含まれています。

    # Name: UStatsSysOracle.py
    # Description: Updates statistics on system tables in an enterprise geodatabase in Oracle.
    
    # Author: Esri
    
    # Import system modules
    import sys
    import arcpy
    import os
    
    # Provide connection information
    server = servername
    service = "5151 | sde:oracle:sid"
    account_authentication = OPERATING_SYSTEM_AUTH | DATABASE_AUTH
    #Leave username and password blank if using OPERATING_SYSTEM_AUTH
    username = gdb_admin_user_name
    password = gdb_admin_password
    version = sde.DEFAULT
    
    
    # Set local variables
    if os.name.lower() == "nt":
       slashsyntax = "\\"
       if os.environ.get("TEMP") == None:
          temp = "c:\\temp"
       else:
          temp = os.environ.get("TEMP")
    else:
       slashsyntax = "/"
       if os.environ.get("TMP") == None:
          temp = "/usr/tmp"
       else:
          temp = os.environ.get("TMP")
    
    Connection_File_Name = temp + slashsyntax + "connection.sde"
    
    # Check for the .sde file and delete it if present
    if os.path.exists(Connection_File_Name):
       os.remove(Connection_File_Name)
    
    #Variable defined within the script; other variable options commented out at the end of the line
    saveUserInfo = "SAVE_USERNAME" #DO_NOT_SAVE_USERNAME
    saveVersionInfo = "SAVE_VERSION" #DO_NOT_SAVE_VERSION
    
    print "Creating ArcSDE Connection File..."
    # Create ArcSDE Connection File
    # Usage: out_folder_path, out_name, server, service, database, account_authentication, username, password, save_username_password
    arcpy.CreateArcSDEConnectionFile_management(temp, "connection.sde", server, service, account_authentication, username, password, saveUserInfo, version, saveVersionInfo)
    
    # Update statistics on system tables
    arcpy.AnalyzeDatasets_management(Connection_File_Name, "SYSTEM","","","","")
    print "Analyze Complete"
    

    このサンプル スクリプトには、オペレーティング システムで認証された dbo ユーザを使用して SQL Server に接続し、システム テーブルの統計情報を更新するための情報が含まれています。

    # Name: UStatsSysSqlServer.py
    ## Description: Updates statistics on system tables in an enterprise geodatabase in SQL Server.
    
    # Author: Esri
    
    # Import system modules
    import sys
    import arcpy
    import os
    
    # Provide connection information
    server = servername
    service = "5151 | sde:sqlserver:sqlserver_instance"
    database = database_name
    account_authentication = OPERATING_SYSTEM_AUTH | DATABASE_AUTH
    #Leave username and password blank if using OPERATING_SYSTEM_AUTH
    username = gdb_admin_user_name
    password = gdb_admin_password
    version = sde.DEFAULT
    
    
    # Set local variables
    if os.name.lower() == "nt":
       slashsyntax = "\\"
       if os.environ.get("TEMP") == None:
          temp = "c:\\temp"
       else:
          temp = os.environ.get("TEMP")
    else:
       slashsyntax = "/"
       if os.environ.get("TMP") == None:
          temp = "/usr/tmp"
       else:
          temp = os.environ.get("TMP")
    
    Connection_File_Name = temp + slashsyntax + "connection.sde"
    
    # Check for the .sde file and delete it if present
    if os.path.exists(Connection_File_Name):
       os.remove(Connection_File_Name)
    
    #Variable defined within the script; other variable options commented out at the end of the line
    saveUserInfo = "SAVE_USERNAME" #DO_NOT_SAVE_USERNAME
    saveVersionInfo = "SAVE_VERSION" #DO_NOT_SAVE_VERSION
    
    print "Creating ArcSDE Connection File..."
    # Create ArcSDE Connection File
    # Usage: out_folder_path, out_name, server, service, database, account_authentication, username, password, save_username_password
    arcpy.CreateArcSDEConnectionFile_management(temp, "connection.sde", server, service, database, account_authentication, username, password, saveUserInfo, version, saveVersionInfo)
    
    # Update statistics on system tables
    arcpy.AnalyzeDatasets_management(Connection_File_Name, "SYSTEM","","","","")
    print "Analyze Complete"
    

    この例では、sde ユーザは PostgreSQL データベースに接続します。

    # Name: UStatsSyspg.py
    # Description: Updates statistics on system tables in an enterprise geodatabase in PostgreSQL.
    
    # Author: Esri
    
    # Import system modules
    import sys
    import arcpy
    import os
    
    # Provide connection information
    server = servername
    service = "5151 | sde:postgresql:servername"
    database = database_name
    account_authentication = DATABASE_AUTH
    username = gdb_admin_user_name
    password = gdb_admin_password
    version = sde.DEFAULT
    
    
    # Set local variables
    if os.name.lower() == "nt":
       slashsyntax = "\\"
       if os.environ.get("TEMP") == None:
          temp = "c:\\temp"
       else:
          temp = os.environ.get("TEMP")
    else:
       slashsyntax = "/"
       if os.environ.get("TMP") == None:
          temp = "/usr/tmp"
       else:
          temp = os.environ.get("TMP")
    
    Connection_File_Name = temp + slashsyntax + "connection.sde"
    
    # Check for the .sde file and delete it if present
    if os.path.exists(Connection_File_Name):
       os.remove(Connection_File_Name)
    
    #Variable defined within the script; other variable options commented out at the end of the line
    saveUserInfo = "SAVE_USERNAME" #DO_NOT_SAVE_USERNAME
    saveVersionInfo = "SAVE_VERSION" #DO_NOT_SAVE_VERSION
    
    print "Creating ArcSDE Connection File..."
    # Create ArcSDE Connection File
    # Usage: out_folder_path, out_name, server, service, database, account_authentication, username, password, save_username_password
    arcpy.CreateArcSDEConnectionFile_management(temp, "connection.sde", server, service, database, account_authentication, username, password, saveUserInfo, version, saveVersionInfo)
    
    # Update statistics on system tables
    arcpy.AnalyzeDatasets_management(Connection_File_Name, "SYSTEM","","","","")
    print "Analyze Complete"
    

    この例では、sde ユーザは DB2 データベースに接続します。

    # Name: UStatsSysDb2.py
    # Description: Updates statistics on system tables in an enterprise geodatabase in DB2.
    
    # Author: Esri
    
    # Import system modules
    import sys
    import arcpy
    import os
    
    # Provide connection information
    server = servername
    service = "5151 | sde:db2"
    database = db_alias
    account_authentication = OPERATING_SYSTEM_AUTH | DATABASE_AUTH
    #Leave username and password blank if using OPERATING_SYSTEM_AUTH
    username = gdb_admin_user_name
    password = gdb_admin_password
    version = sde.DEFAULT
    
    
    # Set local variables
    if os.name.lower() == "nt":
       slashsyntax = "\\"
       if os.environ.get("TEMP") == None:
          temp = "c:\\temp"
       else:
          temp = os.environ.get("TEMP")
    else:
       slashsyntax = "/"
       if os.environ.get("TMP") == None:
          temp = "/usr/tmp"
       else:
          temp = os.environ.get("TMP")
    
    Connection_File_Name = temp + slashsyntax + "connection.sde"
    
    # Check for the .sde file and delete it if present
    if os.path.exists(Connection_File_Name):
       os.remove(Connection_File_Name)
    
    #Variable defined within the script; other variable options commented out at the end of the line
    saveUserInfo = "SAVE_USERNAME" #DO_NOT_SAVE_USERNAME
    saveVersionInfo = "SAVE_VERSION" #DO_NOT_SAVE_VERSION
    
    print "Creating ArcSDE Connection File..."
    # Create ArcSDE Connection File
    # Usage: out_folder_path, out_name, server, service, database, account_authentication, username, password, save_username_password
    arcpy.CreateArcSDEConnectionFile_management(temp, "connection.sde", server, service, database, account_authentication, username, password, saveUserInfo, version, saveVersionInfo)
    
    # Update statistics on system tables
    arcpy.AnalyzeDatasets_management(Connection_File_Name, "SYSTEM","","","","")
    print "Analyze Complete"
    

    この例では、sde ユーザは Informix データベースに接続します。

    # Name: UStatsSysIDS.py
    # Description: Updates statistics on system tables in an enterprise geodatabase in Informix IDS.
    
    # Author: Esri
    
    # Import system modules
    import sys
    import arcpy
    import os
    
    # Provide connection information
    server = servername
    service = "5151 | sde:informix"
    database = odbc_dsn
    account_authentication = OPERATING_SYSTEM_AUTH | DATABASE_AUTH
    #Leave username and password blank if using OPERATING_SYSTEM_AUTH
    username = gdb_admin_user_name
    password = gdb_admin_password
    version = sde.DEFAULT
    
    
    # Set local variables
    if os.name.lower() == "nt":
       slashsyntax = "\\"
       if os.environ.get("TEMP") == None:
          temp = "c:\\temp"
       else:
          temp = os.environ.get("TEMP")
    else:
       slashsyntax = "/"
       if os.environ.get("TMP") == None:
          temp = "/usr/tmp"
       else:
          temp = os.environ.get("TMP")
    
    Connection_File_Name = temp + slashsyntax + "connection.sde"
    
    # Check for the .sde file and delete it if present
    if os.path.exists(Connection_File_Name):
       os.remove(Connection_File_Name)
    
    #Variable defined within the script; other variable options commented out at the end of the line
    saveUserInfo = "SAVE_USERNAME" #DO_NOT_SAVE_USERNAME
    saveVersionInfo = "SAVE_VERSION" #DO_NOT_SAVE_VERSION
    
    print "Creating ArcSDE Connection File..."
    # Create ArcSDE Connection File
    # Usage: out_folder_path, out_name, server, service, database, account_authentication, username, password, save_username_password
    arcpy.CreateArcSDEConnectionFile_management(temp, "connection.sde", server, service, database, account_authentication, username, password, saveUserInfo, version, saveVersionInfo)
    
    # Update statistics on system tables
    arcpy.AnalyzeDatasets_management(Connection_File_Name, "SYSTEM","","","","")
    print "Analyze Complete"
    
  2. ユーザの接続情報を含むようにスクリプトを変更した後、スクリプトを毎晩指定した時刻に実行するようにスケジュールします。
    • Windows では、コントロール パネルからタスク スケジューラを開き、ウィザードを使用してタスクのスケジュールを設定します。実行するプログラムを指定するときに、作成した Python スクリプトを参照します。
    • Linux では、スクリプトを実行する曜日と時刻の情報を含む cron テキスト ファイルを作成し、crontab プログラムを使用してファイルを cron に読み込みます。

      たとえば次の情報では、毎週土曜の午前 1 時 30 分に Python スクリプト(ustatssysids.py)を実行するように設定されます。

      30 1 * * 6 /usr/bin/ustatssysids.py

      cron の使用方法については、Linux のインストールに付属の man ページをご参照ください。
5/10/2014