在数据库编程中,索引文件对于改善数据查询速度有着举足轻重的作用,充分使用索引文件可以极大改善数据库应用程序的性能,这一点恐怕是难以否认的.
在应用过程中,用户的查询条件可能是多种多样的,如果能根据用户查询建立和选择索引,对于保证应用程序的性能,无疑是很有帮助的.
另外,由于停电等意外事故很容易造成数据库中的索引文件未及时更新甚至于损坏,此时如果应用程序再出几个错误信息,无疑将使用户的处境雪上加霜.
因而,动态维护数据库索引文件,将使你的数据库应用程序更有稳定性和可靠性.笔者将以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下测试通过。