SQLite R*Tree 模块(三十三)

返回:SQLite—系列文章目录   

上一篇:SQLite FTS3 和 FTS4 扩展(三十二)

下一篇:SQLite轻量级会话扩展(三十四)

1. 概述

R-Tree 是一个特殊的 专为执行范围查询而设计的索引。R-树最常见的是 用于地理空间系统,其中每个条目都是一个矩形,最小且 最大 X 和 Y 坐标。给定一个查询矩形,R 树能够 快速查找查询矩形中包含的所有条目 或与查询矩形重叠。这个想法很容易扩展到 用于 CAD 系统的三维。R-Trees 也可用于时域 范围查找。例如,假设数据库记录了起始和 大量事件的结束时间。R-Tree 能够快速 查找在给定期间任何时间处于活动状态的所有事件 时间间隔,或在特定时间间隔内开始的所有事件, 或在给定时间间隔内开始和结束的所有事件。 等等。

R-Tree 概念起源于 Toni Guttman:R-Trees: A Dynamic Index Structure for Spatial Searching, 1984 ACM SIGMOD 数据管理国际会议, 第47-57页。 在SQLite中发现的实现是对Guttman原始的改进 想法,通常称为“R*Trees”,由 Norbert Beckmann、Hans-Peter Kriegel、Ralf Schneider、Bernhard Seeger:R*-树:一种高效且鲁棒的点访问方法 和矩形。SIGMOD会议1990:322-331。

2. 编译 R*Tree 模块

SQLite R*Tree 模块的源代码作为一部分包含在内 的合并。但是,根据配置选项 以及您正在使用的特定版本的 SQLite,它可能会也可能不会 默认启用。要确保启用 R*Tree 模块, 只需使用定义的 SQLITE_ENABLE_RTREE C 预处理器宏进行编译。使用许多编译器,可以完成此操作 通过向编译器添加选项“-DSQLITE_ENABLE_RTREE=1” 命令行。

3. 使用 R*Tree 模块

SQLite R*Tree 模块是作为虚拟表实现的。每个 R*Tree 索引都是一个 列数介于 3 到 11 之间的奇数的虚拟表。 第一列始终是 64 位有符号整数主键。 其他列是成对的,每个维度一对,包含 分别是该维度的最小值和最大值。 因此,一维 R*Tree 有 3 列。 二维 R*Tree 有 5 列。 三维 R*Tree 有 7 列。 一个 4 维 R*Tree 有 9 列。 一个 5 维 R*Tree 有 11 列。SQLite R*Tree 实现 不支持宽度超过 5 维的 R*Tree。

SQLite R*Tree 的第一列类似于整数主 普通 SQLite 表的 key 列。它只能存储 64 位签名 整数值。在此列中插入 NULL 值会导致 SQLite 自动生成新的唯一主键值。如果尝试 用于在此列中插入任何其他非整数值, R-Tree 模块在写入之前将其静默转换为整数 进入数据库。

最小值/最大值对列存储为 32 位浮点值 “rtree”虚拟表或“rtree_i32”虚拟表中的 32 位有符号整数 表。与常规 SQLite 表不同,它可以将数据存储在各种 数据类型和格式,R*Tree 严格执行这些存储类型。 如果将任何其他类型的值插入到此类列中,则 r 树 模块在写入 数据库的新记录。

3.1. 创建 R*Tree 索引

将按如下方式创建新的 R*Tree 索引:

CREATE VIRTUAL TABLE  USING rtree();

 是应用程序为 R*Tree 索引和  是一个逗号分隔的列表 3 到 11 列之间。 虚拟<名称>表创建三个影子表,以实际 存储其内容。这些影子表的名称为:

_node

_rowid

_parent

影子表是普通的 SQLite 数据表。您可以查询它们 如果您愿意,请直接使用,尽管这不太可能透露任何特别的信息 有用。 您可以更新、删除、插入甚至删除影子表,尽管这样做会损坏您的 R*Tree 索引。 因此,最好直接忽略影子表。认识到他们 保留您的 R*Tree 索引信息并让它照原样运行。

例如,请考虑创建一个二维 R*Tree 索引,以便在 空间查询:

CREATE VIRTUAL TABLE demo_index USING rtree(
   id,              -- Integer primary key
   minX, maxX,      -- Minimum and maximum X coordinate
   minY, maxY       -- Minimum and maximum Y coordinate
);

3.1.1. 列命名详细信息

在 CREATE VIRTUAL TABLE 语句中对 “rtree” 的参数中, 列的名称取自每个参数的第一个标记。 每个参数中的所有后续标记都将被静默忽略。 这意味着,例如,如果尝试为列提供类型亲和力,或者将约束(如 UNIQUE 或 NOT NULL 或 DEFAULT)添加到 一列,这些额外的标记被接受为有效,但它们不会更改 rtree 的行为。 在 RTREE 虚

你可能感兴趣的:(SQLite,数据库,C与c++,sqlite,数据库,c++)