Mise à jour des statistiques sur les tables système de géodatabase à l'aide d'un script Python
Les statistiques de base de données sont utilisées par l'optimiseur de SGBD pour choisir le plan d'exécution optimal pour la requête qui est exécutée. Vous devez mettre à jour les statistiques après une modification importante du contenu d'une table. Dans le cas des tables système de la géodatabase ArcSDE, vous devez mettre à jour les statistiques après l'ajout de nouvelles tables ou classes d'entités dans la géodatabase, la réalisation d'un grand nombre de mises à jour versionnées ou la compression de la géodatabase.
Comme la mise à jour des statistiques de base de données peut être une opération lourde en termes d'entrées et de sorties, vous pouvez l'effectuer pendant que la plupart des utilisateurs sont déconnectés de la base de données. Vous pouvez écrire un script Python pour appeler l'outil Analyze Datasets afin de mettre à jour les statistiques sur les tables système de la géodatabase ArcSDE et de planifier l'exécution du script pendant la nuit. Vous pouvez utiliser l'application Tâches planifiées dans Windows pour définir l'heure d'exécution de votre script. Sous Linux, vous pouvez configurer une tâche cron pour exécuter le script.
-
Copiez l'un des scripts suivants vers un ordinateur où Python et l'un des clients ArcGIS suivants sont installés :
- ArcGIS for Desktop (Standard ou Avancé)
- ArcGIS Engine avec l'extension Geodatabase Update
- Exécution ArcGIS
- ArcGIS for Server (Standard ou Advanced)
Modifiez les scripts avec les informations spécifiques à votre site.
Ce script utilise un fichier de connexion de base de données existant sur l'ordinateur local pour se connecter à la base de données et exécuter le script :
# 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"
Cet exemple de script contient les informations nécessaires pour se connecter à une base de données Oracle afin de mettre à jour les statistiques sur les tables système :
# 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"
Cet exemple de script contient les informations permettant de se servir d'un utilisateur dbo authentifié par le système d'exploitation pour se connecter à SQL Server et mettre à jour les statistiques sur les tables système :
# 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"
Dans cet exemple, l'utilisateur sde se connecte à une base de données 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"
Dans cet exemple, l'utilisateur sde se connecte à une base de données 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"
Dans cet exemple, l'utilisateur sde se connecte à une base de données 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"
- Après avoir modifié le script pour qu'il contienne vos informations de connexion, planifiez le script pour qu'il s'exécute à une heure spécifique chaque nuit.
- Sous Windows, dans le Panneau de configuration, ouvrez Tâches planifiées et utilisez l'Assistant pour ajouter une tâche planifiée. Lorsqu'il vous est demandé de spécifier le programme à exécuter, parcourez l'arborescence jusqu'à votre script Python.
- Sous Linux, créez un fichier texte cron contenant des informations sur le jour et l'heure où vous souhaitez exécuter le script, puis chargez le fichier dans cron à l'aide du programme crontab.
Par exemple, les informations suivantes entraînent l'exécution du script Python (nommé ustatssysids.py) chaque samedi à 1h30 du matin :
30 1 * * 6 /usr/bin/ustatssysids.py
Reportez-vous aux pages de manuel Linux fournies avec votre installation de Linux pour obtenir plus d'informations sur l'utilisation de cron.