DB2通用数据库中的可扩展索引支持
立即解锁
发布时间: 2025-08-24 02:13:33 阅读量: 1 订阅数: 4 

# DB2 通用数据库中的可扩展索引支持
在数据库操作中,索引起着至关重要的作用,它能够显著提高数据查询的效率。本文将详细介绍可扩展索引在地理信息系统、XML 文档搜索以及外部搜索引擎集成等方面的应用,同时给出具体的操作步骤和代码示例。
## 1. 可扩展索引基本原理
在数据库中,当表中的数据被插入、删除或更新时,查询编译器会利用用户定义谓词的规范来进行索引利用。在基于用户定义谓词的搜索过程中,关系数据管理器会调用相应的搜索方法来生成一组搜索键。
为了避免对用户定义谓词进行可能昂贵的评估,在检索架构中包含了两个过滤器:
- **索引过滤器**:在记录从磁盘检索到关系数据管理器内部的缓冲区之前过滤掉一些记录。
- **数据过滤器**:在评估昂贵的谓词之前,在关系数据管理器中提供另一次经济高效的过滤机会。
## 2. 可扩展索引的应用
### 2.1 地理信息系统应用中的索引
传统地理信息系统(GIS)中,空间数据的索引是通过一组专有 API 提供的。当查询涉及空间数据搜索时,会将空间谓词进行转换以利用索引,然后将结果查询发送到数据库进行优化和评估。然而,空间索引与数据库引擎缺乏集成会导致完整性问题和性能下降。而高级索引框架使得在数据库中实现空间索引成为可能,同时还能利用 GIS 中开发的特殊搜索方法。
#### 2.1.1 创建用户定义类型
```sql
CREATE TYPE envelop AS
(xmin int,
ymin int,
xmax int,
ymax int);
CREATE TYPE shape AS
(gtype varchar(20),
mbr envelop,
numpart sint,
numpoint sint,
geometry BLOB(1M))
NOT INSTANTIABLE;
CREATE TYPE point UNDER shape;
CREATE TYPE line UNDER shape;
CREATE TYPE polygon UNDER shape;
```
这里 `shape` 作为各种子类型(如线和多边形)的超类型。
#### 2.1.2 定义数据库表
```sql
CREATE TABLE schools AS
(name varchar(20),
district varchar(20),
address varchar(20),
area shape,
PRIMARY KEY (name, district));
CREATE TABLE households AS
(address varchar(20),
annualincome int,
location shape);
```
#### 2.1.3 编写查询语句
```sql
SELECT avg(h.annualincome)
FROM households h, schools s
WHERE s.name = ‘Armstrong Elementary’
AND s.district = ‘Highland Park’
AND within(h.location, s.area);
```
此查询用于计算特定学校招生区域内所有家庭的平均年收入。
#### 2.1.4 执行步骤
为了使该查询能够高效执行,需要进行以下操作:
1. **创建索引扩展**:
```sql
CREATE INDEX EXTENSION gridshape(levels varchar(20)
FOR BIT DATA)
FROM SOURCE KEY (sh shape)
GENERATE KEY USING gridkeys(levels,
sh..mbr..xmin, sh..mbr..ymin, sh..mbr..xmax,
sh..mbr..ymax)
WITH TARGET KEY (level int, gx int, gy int,
xmin int, ymin int, xmax int, ymax int)
SEARCH METHODS
WHEN search_within(area shape)
RANGE THROUGH gridrange(levels,
area..mbr..xmin, area..mbr..ymin,
area..mbr..xmax, area..mbr..ymax)
FILTER USING checkduplicate(
level, gx, gy, xmin, ymin, xmax, ymax,
levels, area..mbr..xmin, area..mbr..ymin,
area..mbr..xmax, area..mbr..ymax)
WHEN search_contain(loc shape)
RANGE THROUGH gridrange(levels,
loc..mbr..xmin, loc..mbr..ymin,
loc..mbr..xmax, loc..mbr..ymax)
FILTER USING mbroverlap(xmin, ymin, xmax, ymax,
loc..mbr..xmin, loc..mbr..ymin,
loc..mbr..xmax, loc..mbr..ymax);
```
该索引扩展指定了键转换函数 `gridkeys` 和两个搜索方法,分别用于在特定区域内搜索和查找包含特定位置的形状。
2. **创建索引**:
```sql
CREATE INDEX houselocIDX ON households(location)
USING gridshape(‘10 100 1000’);
```
此操作在 `households` 表的 `location` 列上创建索引。
3. **定义谓词**:
```sql
CREATE FUNCTION within(s1 shape, s2 shape) RETURNS int
LANGUAGE C ... EXTERNAL NAME ‘/lib/spatial/
gislib!within’
PREDICATES (
WHEN = 1
FILTER USING mbrwithin(s1..mbr..xmin, s1..mbr..ymin,
s1..mbr..xmax, s1..mbr..ymax,
s2..mbr..xmin, s2..mbr..ymin,
s2..mbr..xmax, s2..mbr..ymax)
SEARCH BY INDEX EXTENSION gridshape
WHEN KEY (s1) USE search_within(s2)
WHEN KEY (s2) USE search_contain(s1));
```
该函数将 `wit
0
0
复制全文
相关推荐










