Обновление статистики по системным таблицам базы геоданных с помощью скрипта Python
Статистика базы данных используется оптимизатором СУБД для выбора оптимального варианта запуска запроса. Если содержание таблицы существенно меняется, необходимо обновить статистику. Касательно системных таблиц ArcSDE, вам нужно обновить статистику после добавления новых таблиц или классов пространственных объектов в базу геоданных, после осуществления большого количества версионной правки, а также в случае сжатия базы геоданных.
Поскольку при обновлении статистики базы данных выполняется множество операций ввода-вывода, рекомендуется выполнять эту операцию, когда большинство пользователей вышли из базы данных. Можно написать Python-скрипт для вызова инструмента Анализ наборов данных (Analyze Datasets) для обновления статистики по системным таблицам базы геоданных ArcSDE и установить расписание для запуска скрипта в ночное время. В Windows можно использовать утилиту Планировщик задач для установки времени запуска скрипта. В Linux можно настроить задание для утилиты cron, которое будет запускать скрипт.
-
Скопируйте один из следующих скриптов на компьютер, где установлены Python и один из следующих клиентов ArcGIS:
- ArcGIS for Desktop (Standard или Advanced версия)
- Ядро базы геоданных ArcGIS Engine с дополнительным модулем Geodatabase Update
- ArcGIS времени выполнения
- ArcGIS for Server (Стандартная или Расширенная версия)
Измените скрипты, внеся в них информацию о вашем сайте.
В данном скрипте для подключения к базе данных и для запуска скрипта используется существующий файл подключения к базе данных на локальной машине:
# 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"
В приведенном образце скрипта содержится информация, необходимая для подключения к базе данных Oracle для обновления статистики по системным таблицам states, state_lineages и mv_tables_modified:
# 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: 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'
В следующем примере 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"
- После занесения в скрипт информации о подключении, запланируйте запуск скрипта в определенный час в ночное время.
- В Windows откройте утилиту Назначенные задания из Панели управления и используйте мастер для добавления запланированного задания. На запрос указать программу, которую нужно запускать, укажите свой скрипт Python.
- В Linux создайте текстовый файл cron, в котором указывается день и время, в которые необходимо запускать скрипт, затем загрузите файл в cron с помощью программы crontab.
Например, для запуска скрипта Python (с именем ustatssysids.py) каждую субботу в 1:30 ночи необходимо ввести следующую информацию:
30 1 * * 6 /usr/bin/ustatssysids.py
Для получения сведений по использованию cron, см. справочные страницы Linux, поставляемые вместе с операционной системой.