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