ArcGIS属性索引介绍

属性索引可以提高对要素类和表进行属性查询的速度。属性索引是 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

MYTESTINDEX是我针对要素类FAC_TYPE和POI_NAME字段创建的联合索引
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)


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值