在數據庫編程中,索引文件對於改善數據查詢速度有著舉足輕重的作用,充分使用索引文件可以極大改善數據庫應用程序的性能,這一點恐怕是難以否認的.
在應用過程中,用戶的查詢條件可能是多種多樣的,如果能根據用戶查詢建立和選擇索引,對於保證應用程序的性能,無疑是很有幫助的.
另外,由於停電等意外事故很容易造成數據庫中的索引文件未及時更新甚至於損壞,此時如果應用程序再出幾個錯誤信息,無疑將使用戶的處境雪上加霜.
因而,動態維護數據庫索引文件,將使你的數據庫應用程序更有穩定性和可靠性.筆者將以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下測試通過。