关系型数据库存储用户信息的对象为表,表中包括大量的记录,数据库内部标识这些记录并且能够快速的定位到某条记录的机制就是ROWID机制,ROWID实际上就是就是唯一标志记录物理位置的一个id,使用ROWID是定位数据最快的方法,每种数据库的ROWID的组成部分都不同,如Oracle10G数据库的ROWID的格式为:
数据对象编号(object) +文件编号(file) +块编号(block) +行编号(row)
例如:
SQL> select rowid ,substr(rowid,1,6) "OBJECT",substr(rowid,7,3) "FILE", substr(rowid,10,6) "BLOCK",substr(rowid,16,3) "ROW" from server_config where prop_name='AUTH_KEY';
ROWID OBJECT FILE BLOCK ROW
------------------ ------------ ------ ------------ -----------------------------------------
10:
AAAMqRAAFAAAAycAAA(64bit) AAAMqR AAF AAAAyc AAA
AAAMqRAAFAAAAydAAb为存储许可信息的ROWID,插播一句,从上图中可以看出Block个数的范围在0—2^32,因此才会出现一个数据文件有大小限制:
数据库的块大小:
4k 8k 16k 32k
数据文件大小 16G 32G 64G 128G
利用该信息可以很快定位到某一条记录:
SQL> select prop_name from server_config where rowid='AAAMqRAAFAAAAycAAA';
PROP_NAME
----------------------------------------------------------------
AUTH_KEY
需要注意的是:ROWID是一个伪列,该列并不在表中真正的存在,只是在查询的时候Oracle临时构建的。
索引从大类上分:
从数据库层次上主要分两种索引:常规数据索引和非常规数据索引,常规数据索引主要是对常规数据进行索引,至于常规数据不在此进行介绍,非常规数据索引是针对于非常规数据所建立的索引,非常规数据主要包括一些视频,空间数据(栅格和矢量数据),XML数据以及大文本数据(小说等)。
从我们GIS层次上考虑,常规数据索引为属性索引,由于我们GIS主要处理的是矢量这种非常规数据,因此我们将非常规数据索引又称为空间索引。其具有加快地图访问的速度。
不论是什么类型的索引,里面都会记录ROWID信息的,使用索引检索的数据的过程通常为:
1. 到索引中根据你的查询条件快速的超找到满足条件的相关记录的ROWID。
2. 然后再根据找到的ROWID到表中获取到相关的记录。
现在关系型数据库本身支持很多种类型的属性索引,如常见的并且所有的数据库都支持的B-tree索引,另外还有某些数据库所独有的索引,如Oracle的位图索引,函数索引等等。以上的的索引所针对的数据类型为常规类型,如整型,字符,日期等我们所熟悉的数据类型,因此这些数据也是我们GIS人所统称的属性数据。
我们的桌面软件Desktop现在支持索引为B-TREE索引,另外可以选择是索引的属性是否唯一以及升序还是降序。具体使用可以见下图:
建立好的索引后,可以到数据库的数据字典中查询索引的相关信息,如
下面为索引R1859_SDE_ROWID_UK索引的一些信息,
SQL> select index_type, UNIQUENESS,blevel,status,table_name from user_indexes where index_name='R1859_SDE_ROWID_UK';
INDEX_TYPE UNIQUENES BLEVEL STATUS TABLE_NAME
--------------------------- --------- ---------- -------- --------------------
NORMAL UNIQUE 0 VALID ELEGR_GEO_P_DEC
其中索引的类型为NORMAL也就是我们俗称的BTREE索引,是否具有唯一索引,是在ELEGR_GEO_P_DEC上建立的索引,以及最终要的索引的状态是合法的。
由于Oracle数据库在所有的数据库中是最完善,用户群最大,同时也是最开放的一种商业数据库,因此我们针对空间索引的研究主要放在Oracle数据库上,因此下面的截图和数据大部分都是从Oracle数据库中截出来的,偶尔也有一些从DB2上截下来的。