在 Standard 或 Advanced 许可等级下可用。
属性索引可以提高对要素类和表进行属性查询的速度。属性索引是 ArcGIS 用于检索表中记录的备用路径。对于大多数属性查询类型而言,使用索引查询记录要比从第一条记录开始逐条搜索整个表的方式更加快速。
只要要素类或表内有数据,您就可以为经常查询的字段创建属性索引。请只创建那些真正需要的索引,因为添加的每个索引都会略微降低要素类的编辑速度。每次编辑要素类时,ArcGIS 都必须更新索引。如果需要经常编辑某个字段,尽可能避免为其创建索引。属性索引可以通过访问 ArcCatalog 内的属性 对话框或用地理处理进行创建。添加索引后,可以随时删除或重新添加。
可通过多种方法来创建属性索引。您可以为单个或多个字段创建属性索引;他们可以是唯一的;在某些地理数据库中,可以按升序或降序来创建属性索引。本主题仅对这些概念做简要说明。如果您在为 ArcSDE 地理数据库选择索引策略,请参阅 DBMS 文档来获取更详细的说明。
在 ArcCatalog 中创建属性索引
您可以为地理数据库要素类或表中的单个或多个字段创建属性索引,方法是:右键单击“目录树”中的表名并进入属性对话框。
- 在“目录树”中,右键单击要为其创建索引的表或要素类并单击属性。
- 单击索引选项卡。
- 单击添加。
- 输入新索引的名称。
- 如果您的字段值是唯一的,请选中唯一复选框。选中升序复选框可创建一个升序索引。
“唯一”和“升序”设置不适用于文件地理数据库,因此可以不选中这两个选项。“升序”设置不适用于 Oracle ArcSDE 地理数据库。“唯一”和“升序”设置不适用于 SQL Server ArcSDE 地理数据库。
- 单击要创建索引的一个或多个字段。
- 单击右箭头按钮将字段移动到选定字段列表中。
- 使用上下箭头更改索引中字段的顺序。
- 单击确定。
- 单击应用创建索引或单击确定创建索引,然后关闭属性对话框。
使用地理处理创建属性索引
“数据管理”工具箱中的“索引”工具集提供了两个用来创建和移除属性索引的主要工具。
“添加属性索引”工具可向现有的表、要素类或属性关系类中添加单个或多列索引。对于所有 ArcGIS 许可,此工具均可用。
“移除属性索引”工具可从现有的表、要素类或属性关系类中移除单个或多列索引。对于所有 ArcGIS 许可,此工具也都可用。
属性索引名称
当命名 ArcSDE 地理数据库中的索引时,指定的索引名称最好能够反映出索引的是哪个表甚至哪个列。不过,对于被索引的表,如果其名称发生改变,您的索引名称可能无法再指示索引的是哪个表。一些组织发现,如果指定的索引名称中能够体现出它是一个索引(例如,在名称的开头或结尾添加 IDX),这样会很有用。例如,地址表索引的名称可以是 ADRS_APK_IDX,其中 ADRS 表示此索引位于地址表中,APK 表示索引的是哪个列,IDX 明确表明这是一个索引。
与表名类似,ArcSDE 地理数据库中的索引名称同样也适用于以下规则:
- 在数据库中必须唯一
- 必须以字母开头
- 不能包含空格
- 不能包含保留字
对于在文件地理数据库内如何命名属性索引,没有任何限制。个人地理数据库内的索引名称中不能包含空格或保留字。
在 ArcGIS 中,属性索引名称的最大长度强制不得超过 16 个字符。此限制基于所支持的数据库内允许的最小长度,这样便于在不同地理数据库之间分发和共享数据。
唯一索引
“唯一”选项不适用于文件地理数据库,因此可以不选中此选项。“唯一”选项适用于 SQL Server ArcSDE 地理数据库;但是,当源数据为注册为版本的要素类时,在“添加属性索引”对话框中此选项不可用。
当您创建索引时,会出现一个“创建为唯一索引”选项。如果每条记录中的属性都具有唯一值,请选择此选项。这将加快对该属性的查询过程,因为数据库将在找到第一个匹配值后停止搜索。
但是请注意,在个人地理数据库中您无法编辑用户定义字段中的具有唯一索引的要素类。此外,您还无法在用户定义字段中编辑与具有唯一索引的其他要素类位于同一要素数据集的要素类。在试图开始编辑个人地理数据库时,ArcMap 将返回如下错误:
无法编辑任何地图图层。请检查图层或表中用户管理的列上是否包含唯一索引。如果个人地理数据库中的某个字段具有唯一索引且需要对其进行编辑,则可使用 ArcCatalog 删除此唯一索引并将其重新创建为非唯一索引。
升序和降序索引
在文件或 Oracle ArcSDE 地理数据库中无法使用“升序”选项,因此可以不选中此选项。“升序”选项适用于 SQL Server ArcSDE 地理数据库;但是,当源数据为注册为版本的要素类时,在“添加属性索引”对话框中此选项不可用。
当您创建索引时,会出现“创建升序索引”选项,如果未选中此选项,则默认“创建降序索引”选项。升序索引将按升序排列。例如,在升序索引中城市名以 Athens、Berlin、London 和 Paris 这种顺序排列,而在降序索引中它们则将显示为 Paris、London、Berlin 和 Athens。
在几乎所有情况下,索引的排列方向对检索速度几乎或完全没有影响,因为对于大多数查询,向前遍历索引的效率与向后遍历索引相同。
单个索引与多列索引
文件地理数据库不支持多列索引。要素类属性 和表属性 对话框不允许您指定多列索引。通过“添加属性索引”工具和 ArcObjects,您可以指定多列索引,尽管您所创建的索引在从 ArcCatalog 内的要素类属性 或表属性 对话框中查看时显示为多列索引,但实际上它是每个字段的单独索引。
在个人或 ArcSDE 地理数据库中可以为单个列或多个列创建索引。如果您经常在查询中同时指定两个或三个字段,则多列索引将十分有用。在这种情况下,多列索引所提供的查询性能可能比使用两个或三个独立索引分别查询各个字段时快得多。
字段在多列索引中的显示顺序很重要。在多列索引中,如果 A 列位于 B 列之前,则将使用 A 列执行初始搜索。此外,与针对仅涉及 B 列的查询相比,此类索引更适用于针对仅涉及 A 列的查询。
决定是创建多列索引或单列索引,还是同时创建两种形式的索引需要加以权衡,多数情况下难以做出最佳决定。不过,通常会有各种行之有效的解决办法。例如,如果您有时只查询 A 列、有时只查询 B 列、而有时又会同时查询这两列,您可以任选下列方法之一:
- 为 A 和 B 创建两个单独的索引。
- 为 A 和 B 创建一个多列索引。通常,当同时查询这两列时效率会更高。对于仅涉及 A 的查询,此索引将比单独的 A 索引慢。此索引对于只涉及 B 的查询来说作用不大。为此,您可以另外为 B 创建一个索引。
- 创建全部三个索引:一个 A 索引、一个 B 索引和一个 A 和 B 的多列索引。当所有三种类型的查询均经常发生,且对表的查询频率大于其更新频率时,使用这种方法才会有意义。