Aktualisieren von Statistiken in Geodatabase-Systemtabellen mit einem Python-Skript

Datenbankstatistiken werden vom DBMS-Optimierer verwendet, um den optimalen Ausführungsplan für die Abfrage auszuwählen, die ausgeführt wird. Sie sollten Statistiken aktualisieren, nachdem sich der Inhalt einer Tabelle deutlich geändert hat. Im Fall von ArcSDE-Geodatabase-Systemtabellen sollten Sie die Statistiken aktualisieren, nachdem der Geodatabase neue Tabellen oder Feature-Classes hinzugefügt wurden, eine große Zahl versionierter Bearbeitungen durchgeführt oder die Geodatabase komprimiert wurde.

Da das Aktualisieren der Datenbankstatistik ein E/A-intensiver Vorgang sein kann, sollten Sie dies tun, während die meisten Benutzer von der Datenbank abgemeldet sind. Sie können zum Aufrufen des Werkzeugs "Datasets analysieren" ein Python-Skript schreiben, um Statistiken in den ArcSDE-Geodatabase-Systemtabellen zu aktualisieren und das Skript so zu planen, dass es in der Nacht ausgeführt wird. Sie können die Aufgabenplanung in Windows verwenden, um eine Zeit für die Ausführung des Skripts festzulegen. Unter Linux können Sie einen cron-Auftrag einrichten, um das Skript auszuführen.

Schritte:
  1. Kopieren Sie eines der folgenden Skripte auf einen Computer, auf dem Python und einer der folgenden ArcGIS-Clients installiert sind:
    • ArcGIS for Desktop (Standard oder Advanced)
    • ArcGIS Engine mit der Erweiterung Geodatabase-Aktualisierung
    • ArcGIS Runtime
    • ArcGIS for Server (Standard oder Erweitert)

    Ändern Sie die Skripte, um Ihre standortspezifischen Informationen einzuschließen.

    Dieses Skript verwendet auf dem lokalen Computer eine vorhandene Datenbankverbindungsdatei, um eine Verbindung mit der Datenbank herzustellen und das Skript auszuführen:

    # 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)
    default_gdb = "C:\\Documents and Settings\<user>\Application Data\ESRI\ArcCatalog\sp_data.sde"
    
    # set the workspace environment
    arcpy.env.workspace = workspace
    
    # Execute analyze datasets for system tables
    arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", "", "","","")
    print "Analyze Complete"
    

    Dieses Beispielskript enthält die notwendigen Informationen für eine Verbindung mit einer Oracle-Datenbank, um die Statistiken in den Systemtabellen zu aktualisieren:

    # 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"
    

    Dieses Beispielskript enthält die Informationen für die Verwendung eines vom Betriebssystem authentifizierten dbo-Benutzers, um eine Verbindung zum SQL-Server herzustellen und die Statistiken in den Systemtabellen zu aktualisieren:

    # 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"
    

    In diesem Beispiel stellt der sde-Benutzer eine Verbindung mit einer PostgreSQL-Datenbank her:

    # Name: RSysIdxpg.py
    # Description: Rebuilds indexes on the sde_states, sde_state_lineages,
    # and sde_mv_tables_modified 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)
    
    # Rebuild indexes on system tables
    arcpy.RebuildIndexes_management(Connection_File_Name, "SYSTEM", "", "ALL")
    print 'Rebuild Complete'
    

    In diesem Beispiel stellt der sde-Benutzer eine Verbindung mit einer DB2-Datenbank her:

    # 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"
    

    In diesem Beispiel stellt der sde-Benutzer eine Verbindung mit einer Informix-Datenbank her:

    # 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. Nachdem Sie das Skript geändert haben, um die Verbindungsinformationen einzuschließen, planen Sie das Skript so, dass es jede Nacht zu einem bestimmten Zeitpunkt ausgeführt wird.
    • Öffnen Sie unter Windows die Aufgabenplanung in der Systemsteuerung, und verwenden Sie den Assistenten, um einen geplanten Task hinzuzufügen. Wenn Sie gefragt werden, welches Programm ausgeführt werden soll, wechseln Sie zum Python-Skript.
    • Erstellen Sie unter Linux eine cron-Textdatei, die Informationen zu Tag und Uhrzeit für die Ausführung des Skripts enthält, und laden Sie dann die Datei mit dem crontab-Programm in cron.

      Die folgenden Informationen legen z. B. das Python-Skript (ustatssysids.py genannt) so fest, dass es jeden Samstag um 1:30 Uhr ausgeführt wird:

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

      Informationen zur Verwendung von cron finden Sie auf den Linux-man-Seiten zu Ihrer Linux-Installation.
9/11/2013