属性索引可以提高对要素类和表进行属性查询的速度。属性索引是 ArcGIS 用于检索表中记录的备用路径。对于大多数属性查询类型而言,使用索引查询记录要比从第一条记录开始逐条搜索整个表的方式更加快速。
只要要素类或表内有数据,您就可以为经常查询的字段创建属性索引。请只创建那些真正需要的索引,因为添加的每个索引都会略微降低要素类的编辑速度。每次编辑要素类时,ArcGIS 都必须更新索引。如果需要经常编辑某个字段,尽可能避免为其创建索引。属性索引可以通过访问 ArcCatalog 内的属性对话框或用地理处理进行创建。添加索引后,可以随时删除或重新添加。
可通过多种方法来创建属性索引。您可以为单个或多个字段创建属性索引;他们可以是唯一的;在某些地理数据库中,可以按升序或降序来创建属性索引。
唯一索引
“唯一”选项不适用于文件地理数据库,因此可以不选中此选项。“唯一”选项不适用于 SQL Server ArcSDE 地理数据库,在“添加属性索引”对话框中此选项不可用。
当您创建索引时,会出现一个“创建为唯一索引”选项。如果每条记录中的属性都具有唯一值,请选择此选项。这将加快对该属性的查询过程,因为数据库将在找到第一个匹配值后停止搜索。
但是请注意,在个人地理数据库中您无法编辑用户定义字段中的具有唯一索引的要素类。此外,您还无法在用户定义字段中编辑与具有唯一索引的其他要素类位于同一要素数据集的要素类。在试图开始编辑个人地理数据库时,ArcMap 将返回如下错误: “无法编辑任何地图图层。请检查图层或表中用户管理的列上是否包含唯一索引。”
如果个人地理数据库中的某个字段具有唯一索引且需要对其进行编辑,则可使用 ArcCatalog 删除此唯一索引并将其重新创建为非唯一索引。
单个索引与多列索引
文件地理数据库不支持多列索引。“要素类”和“表属性”对话框不允许您指定多列索引。“添加属性索引 GP”工具和 ArcObjects 允许您指定多列索引,尽管您所创建的索引在从 ArcCatalog 内的“要素类”或“表属性”对话框中查看时显示为多列索引,但实际上它是每个字段的单独索引。
在个人或 ArcSDE 地理数据库中可以为单个列或多个列创建索引。如果您经常在查询中同时指定两个或三个字段,则多列索引将十分有用。在这种情况下,多列索引所提供的查询性能可能比使用两个或三个独立索引分别查询各个字段时快得多。
字段在多列索引中的显示顺序很重要。在多列索引中,如果 A 列位于 B 列之前,则将使用 A 列执行初始搜索。此外,与针对仅涉及 B 列的查询相比,此类索引更适用于针对仅涉及 A 列的查询。
决定是创建多列或单列索引,还是同时创建两种形式的索引需要加以权衡,多数情况下难以确定。不过,通常会有各种行之有效的解决办法。例如,如果您有时只查询 A 列、有时只查询 B 列、而有时又会同时查询这两列,您可以任选下列方法之一:
为 A 和 B 创建两个单独的索引。
为 A 和 B 创建一个多列索引。通常,当同时查询这两列时效率会更高。对于仅涉及 A 的查询,此索引将比单独的 A 索引慢。此索引对于只涉及 B 的查询来说作用不大。为此,您可以另外为 B 创建一个索引。
创建全部三个索引:一个 A 索引、一个 B 索引和一个 A 和 B 的多列索引。当所有三种类型的查询均经常发生,且对表的查询频率大于其更新频率时,使用这种方法才会有意义。
---------------------------------------------------------以上转自ArcGIS10中文帮助---------------------------------------
实验
查看一下Point要素类包含的索引名称。
R11_SDE_ROWID_UK,系统默认给ObjectID创建的属性索引
SQL> select index_name from user_indexes where table_name ='POINT';
INDEX_NAME
------------------------------
A5_IX1
SYS_IL0000075139C00020$
R11_SDE_ROWID_UK
MYTESTINDEX
SQL> select dbms_metadata.get_ddl('INDEX','MYTESTINDEX','TEST') from dual;
DBMS_METADATA.GET_DDL('INDEX','MYTESTINDEX','TEST')
--------------------------------------------------------------------------------
CREATE INDEX "TEST"."MYTESTINDEX" ON "TEST"."POINT" ("FAC_TYPE", "POI_NAME")
PCTFREE 0 INITRANS 4 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAX
SQL> select objectid from test.point where poi_name='96806043' and fac_type='9998';
OBJECTID
----------
110502
执行计划
----------------------------------------------------------
Plan hash value: 1066938114
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 63 | 4 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| POINT | 1 | 63 | 4 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | MYTESTINDEX | 1 | | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("FAC_TYPE"=9998 AND "POI_NAME"=U'96806043')
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
9 recursive calls
0 db block gets
137 consistent gets
2 physical reads
0 redo size
349 bytes sent via SQL*Net to client
360 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> select objectid from test.point where poi_name='96806043';
OBJECTID
----------
110502
执行计划
----------------------------------------------------------
Plan hash value: 3054296013
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 46 | 2300 | 1132 (1)| 00:00:14 |
|* 1 | TABLE ACCESS FULL| POINT | 46 | 2300 | 1132 (1)| 00:00:14 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("POI_NAME"=U'96806043')
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
5 recursive calls
0 db block gets
4228 consistent gets
0 physical reads
0 redo size
349 bytes sent via SQL*Net to client
360 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> select objectid from test.point where poi_name='96806043' and fac_type='9998';
OBJECTID
----------
110502
执行计划
----------------------------------------------------------
Plan hash value: 3054296013
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 23 | 1449 | 1132 (1)| 00:00:14 |
|* 1 | TABLE ACCESS FULL| POINT | 23 | 1449 | 1132 (1)| 00:00:14 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("POI_NAME"=U'96806043' AND "FAC_TYPE"=9998)
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
405 recursive calls
0 db block gets
4319 consistent gets
7 physical reads
0 redo size
349 bytes sent via SQL*Net to client
360 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
10 sorts (memory)
0 sorts (disk)
1 rows processed
从上面对上面的理论得以验证!
QQ群:ArcSDE讨论群 (78773981)