索引文件对于改善数据查询速度有着举足轻重的作用,充分使用索引文件可以极大改善数据库应用程序的性能,这一点恐怕是难以否认的.
在应用过程中,用户的查询条件可能是多种多样的,如果能根据用户查询建立和选择索引,对于保证应用程序的性能,无疑是很有帮助的.
另外,由于停电等意外事故很容易造成数据库中的索引文件未及时更新甚至于损坏,此时如果应用程序再出几个错误信息,无疑将使用户的处境雪上加霜.
因而,动态维护数据库索引文件,将使你的数据库应用程序更有稳定性和可靠性.笔者将以
Delphi编程中常用的Paradox数据库为例,介绍数据库索引文件的动态维护.
Paradox 数 据 表 索 引 分 为 主 索 引(Primary Index) 即 关 键 字(Primary Key) 索 引 和 次 索 引(Secondary Index), 其 中 主 索 引 对 应.PX 文 件, 次 索 引 对 应.XG* 和.YG* 文 件.
一. 创 建 表 索 引
(1) 用Table.AddIndex 来 实 现
方 法:AddIndex( IndexName,FieldNames,Options )
其 中:( 详 见Delphi 帮 助)
IndexName: 索 引 名 称, 仅 在 指 定 次 索 引 时 有 作 用.
FieldNames: 索 引 域, 可 指 定 多 个 域, 各 域 之 间 用 分 号 隔 开, 如Field1;Field2;Field3
Options: 索 引 选 项, 可 为[ixPrimary, ixUnique, ixDescending, ixCaseInsensitive, ixExpression]
其 中:
ixPrimary : 建 立 的 索 引 为 主 索 引( 不 适 用 于dBase 数 据 表).
ixUnique : 不 允 许 重 复 值 的 索 引.
ixDescending: 按 降 序 索 引.
ixCaseInsensitive: 索 引 排 序 时 按 忽 略 大 小 写( 不 适 用 于dBase 数 据 表).
ixExpression: 建 立 表 达 式 索 引( 适 用 于Delphi3.0, 仅 适 用 于dBase 数 据 表).
ixNonMaintained: 是 否 不 需 要BDE 自 动 维 护( 适 用 于Delphi1.0).
下 面 是 一 个 例 子:
假 设 有 一 个 存 放 通 讯 录 数 据 表MyComm.DB( 类 型 为Paradox) 存 放 于 本 地 目 录d:\mynote 下, 现 建 立 一 个 主 索 引( 索 引 域 为 编 号ID) 和 一 个 次 索 引( 索 引 域 为 编 号ID 和 姓 名Name, 索 引 名 称 为NameIndex).
with table1 do
begin
close;
DatabaseName := d:\MyNote;
TableName := MyComm.DB;
Open;
{建立主索引 }
AddIndex(,ID,[ixPrimary]);
{建立次索引 }
AddIndex(NameIndex,ID;Name,[]);
close;
end;
(2)用
SQL来实现
对Paradox数据表来说,用SQL只能建立次索引.
在SQL语法中,用来建立索引的语句是:
Create Index IndexName On TableName
(IndexField1,IndexField2,..)
其中:
IndexName为一个次索引的名称,如MySecIndex1等.
TableName为对应数据表的名称,如MyTable等.
TableName后面为索引域列表,所有索引域有圆括号括起来,
各索引域之间用逗号隔开.
下 面 是 一 个 例 子:
假 设 有 一 个 存 放 通 讯 录 数 据 表MyComm.DB( 类 型 为Paradox) 存 放 于 本 地 目 录
d:\mynote 下, 现 建 立 一 个 次 索 引( 索 引 域 为 编 号ID 和 姓 名Name, 索 引 名 称 为NameIndex).
with query1 do
begin
close;
DatabaseName := d:\MyNote;
{建立次索引NameIndex}
sql.clear;
sql.add( Create Index NameIndex On MyComm(ID,Name) );
execSql;
end;
二. 删 除 表 索 引
(1) 用Table.DeleteIndex 来 实 现
DeleteIndex 只 能 删 除 次 索 引 名 称.
方 法:DeleteIndex( IndexName )
其 中:( 详 见Delphi 帮 助)
IndexName: 次 索 引 名 称.
下 面 是 一 个 例 子:
假 设 有 一 个 存 放 通 讯 录 数 据 表MyComm.DB( 类 型 为Paradox) 存 放 于 本 地 目 录
d:\mynote 下, 现 有 一 个 次 索 引( 索 引 域 为 编 号ID 和 姓 名Name, 索 引 名 称 为NameIndex), 将 删 除 之.
with table1 do
begin
close;
Exclusive := true;
DatabaseName := d:\MyNote;
TableName := MyComm.DB;
Open;
{删除次索引}
DeleteIndex(NameIndex);
close;
end;
(2) 用SQL 来 实 现
在SQL 语 法 中, 用 来 删 除 索 引 的 语 句 是:
Drop Index TableName.IndexName
要 删 除 次 索 引 时,IndexName 为 一 个 次 索 引 的 名 称, 如MyTable.MySecIndex1 等.
要 删 除 主 索 引 时,IndexName 为primary, 如MyTable.primary; 值 得 注 意 的 是, 在 删 除 主 索 引 成 功 后, 数 据 表 的 所 有 次 索 引 也 自 动 删 除.
下 面 是 一 个 例 子:
假 设 有 一 个 存 放 通 讯 录 数 据 表MyComm.DB( 类 型 为Paradox) 存 放 于 本 地 目 录
d:\mynote 下, 已 定 义 一 个 主 索 引( 索 引 域 为 编 号ID) 和 一 个 次 索 引( 索 引 域 为 编 号ID 和 姓 名Name, 索 引 名 称 为NameIndex).
现 在 因 为 索 引 损 坏, 要 删 除 索 引, 以 便 重 新 索 引.
with query1 do
begin
close;
DatabaseName := d:\MyNote;
{删除次索引NameIndex }
sql.clear;
sql.add( Drop Index MyComm.NameIndex );
execSql;
{删除主索引 }
sql.clear;
sql.add( Drop Index MyComm.Primary );
execSql;
end;
三.注意事项:
(1)在索引更改时,应保证对应的数据表可以以独占方式(Exclusive=true) 打开,否则会引起错误.
(2)上述方法略加修改后,也可用于dBase,Oracle等其它数据库的数据表.
(3)如果需要重新对索引文件进行索引,请参考BDE的Dbi
函数说明:
RegenIndex,RegenIndexes.
(4)以上程序在Delphi3.0下测试通过。
查看本文来源