Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14481280
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:47:00

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


用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引用Dephi程序维护Paradox 数据表的索引
阅读(101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~