数据库管理系统优化程序使用数据库统计数据来选择用于查询的最优执行计划。要维护查询性能,应在表内容发生显著更改之后(例如,将大量记录加载到表或在表上执行大量编辑之后)更新统计数据。
可在以下类型的表和索引上更新统计数据:
- 选择以进行分析的表及其相关索引
- 版本化表和要素类的增量表,以及增量表上的索引
- 为进行存档而启用的数据集历史存档表,以及存档表的索引
- 地理数据库系统表
- 如果分析的要素类使用 sdebinary 几何存储,则也将更新要素表和空间索引表上的统计数据,以及这些表的索引
ArcGIS 中有多种用于更新统计数据的方法。这些参数将在下面的章节中介绍:
使用“分析”命令
可使用 ArcMap 中的分析命令来更新在目录树中直接选择的特定数据集上的统计数据。要更新统计数据,您必须是数据集的所有者。
- 启动 ArcMap 或 ArcCatalog。
-
在目录树的数据库连接下,连接到包含要更新统计数据的数据集的数据库或企业级地理数据库。
请确保以数据集所有者的身份进行连接。
- 右键单击目录树中的数据集。
该数据集可以是要素数据集、要素类、表、栅格目录、栅格数据集或者镶嵌数据集。
- 指向管理并单击分析。
按照本主题开头所述更新此数据集的表和索引的统计数据。
使用分析数据集工具
您可以使用分析数据集地理处理工具(位于“数据管理”工具箱的“地理数据库管理”工具集中)来更新统计数据。如果要一次更新多个数据集的统计数据,或想要选择已分析的特定表(例如,如果您只想更新增量表上的统计数据),亦或想要更新地理数据库系统表上的统计数据,则使用 ArcMap 的该工具,而不使用分析命令。
您必须以要分析的表的所有者身份运行该工具。就地理数据库系统表而言,您必须以地理数据库管理员的身份运行该工具。您应该在向地理数据库添加许多新表或要素类、执行大量版本化编辑或压缩地理数据库之后,更新地理数据库系统表上的统计数据。
- 启动 ArcGIS for Desktop 客户端,并连接到包含要更新统计数据的表的地理数据库中。
以表的所有者身份进行连接。
- 打开分析数据集地理处理工具。
可以在 ArcGIS for Desktop 客户端的搜索框中输入工具名称以找到该工具并打开,或导航至“数据管理”工具箱中的“地理数据库管理”工具集。
- 使用您在步骤 1 中创建的数据库连接文件作为输入工作空间。
- 选中想要分析的表:
- 如果想要更新所选基表的统计数据,则保留分析所选数据集的基表的选定状态。
- 选中分析所选数据集的增量表可更新版本化数据集添加表和删除表的统计数据。
- 选中分析所选数据集的存档表可更新启用存档历史存档表上的统计数据。
- 选中包括系统表以更新地理数据库系统表上的统计数据。
- 单击确定以运行工具。
更新所选表及其索引的统计数据。
运行 Python 脚本
可调用 Python 脚本中的 AnalyzeDatasets_management 函数来更新基表、增量表、存档表和/或地理数据库系统表上的统计数据。如同使用分析数据集工具一样,您必须以要分析表的所有者身份运行 AnalyzeDatasets_management。
运行以下 Python 脚本时,请指定数据库连接文件(.sde 文件)。该脚本更新连接中指定用户拥有的所有表的统计数据。
例如,要使用位于 /usr/connections 中的数据库连接文件 entgdb.sde 在 Linux 上运行此脚本,请输入以下内容:
./ AnalyzeDatasets.py /usr/connections/entgdb.sde
要运行此脚本来更新系统表的统计数据,请指定作为地理数据库管理员连接的连接文件。
# Name: AnalyzeDatasets.py
# Description: analyzes all datasets in an enterprise geodatabase
# for a given user.
# Import system modules
import arcpy, os
# set workspace
# the user in this workspace must be the owner of the data to analyze.
workspace = arcpy.GetParameterAsText(0)
# set the workspace environment
arcpy.env.workspace = workspace
# NOTE: Analyze Datasets can accept a Python list of datasets.
# Get a list of all the datasets the user has access to.
# First, get all the stand alone tables, feature classes and rasters.
dataList = arcpy.ListTables() + arcpy.ListFeatureClasses() + arcpy.ListRasters()
# Next, for feature datasets get all of the datasets and featureclasses
# from the list and add them to the master list.
for dataset in arcpy.ListDatasets("", "Feature"):
arcpy.env.workspace = os.path.join(workspace,dataset)
dataList += arcpy.ListFeatureClasses() + arcpy.ListDatasets()
# reset the workspace
arcpy.env.workspace = workspace
# Get the user name for the workspace
userName = arcpy.Describe(workspace).connectionProperties.user.lower()
# remove any datasets that are not owned by the connected user.
userDataList = [ds for ds in dataList if ds.lower().find(".%s." % userName) > -1]
# Execute analyze datasets
# Note: to use the "SYSTEM" option the workspace user must be an administrator.
arcpy.AnalyzeDatasets_management(workspace, "NO_SYSTEM", userDataList, "ANALYZE_BASE","ANALYZE_DELTA","ANALYZE_ARCHIVE")
print "Analyze Complete"