在數(shù)據(jù)庫(kù)編程中,索引文件對(duì)于改善數(shù)據(jù)查詢速度有著舉足輕重的作用,充分使用索引文件可以極大改善數(shù)據(jù)庫(kù)應(yīng)用程序的性能,這一點(diǎn)恐怕是難以否認(rèn)的.
在應(yīng)用過(guò)程中,用戶的查詢條件可能是多種多樣的,如果能根據(jù)用戶查詢建立和選擇索引,對(duì)于保證應(yīng)用程序的性能,無(wú)疑是很有幫助的.
另外,由于停電等意外事故很容易造成數(shù)據(jù)庫(kù)中的索引文件未及時(shí)更新甚至于損壞,此時(shí)如果應(yīng)用程序再出幾個(gè)錯(cuò)誤信息,無(wú)疑將使用戶的處境雪上加霜.
因而,動(dòng)態(tài)維護(hù)數(shù)據(jù)庫(kù)索引文件,將使你的數(shù)據(jù)庫(kù)應(yīng)用程序更有穩(wěn)定性和可靠性.筆者將以Delphi編程中常用的Paradox數(shù)據(jù)庫(kù)為例,介紹數(shù)據(jù)庫(kù)索引文件的動(dòng)態(tài)維護(hù).
Paradox數(shù)據(jù)表索引分為主索引(Primary Index)即關(guān)鍵字(Primary Key)索引和次索引(Secondary Index),其中主索引對(duì)應(yīng).PX文件,次索引對(duì)應(yīng).XG*和.YG*文件.
一.創(chuàng)建表索引
(1) 用Table.AddIndex來(lái)實(shí)現(xiàn)
方法:AddIndex( IndexName,FieldNames,Options )
其中:(詳見(jiàn)Delphi幫助)
IndexName:索引名稱,僅在指定次索引時(shí)有作用.
FieldNames:索引域,可指定多個(gè)域,各域之間用分號(hào)隔開(kāi),如Field1;Field2;Field3
Options:索引選項(xiàng),可為[ixPrimary, ixUnique, ixDescending, ixCaseInsensitive, ixExpression]
其中:
ixPrimary : 建 立 的 索 引 為 主 索 引( 不 適 用 于dBase 數(shù) 據(jù) 表).
ixUnique : 不 允 許 重 復(fù) 值 的 索 引.
ixDescending: 按 降 序 索 引.
ixCaseInsensitive: 索 引 排 序 時(shí) 按 忽 略 大 小 寫(xiě)( 不 適 用 于dBase 數(shù) 據(jù) 表).
ixExpression: 建 立 表 達(dá) 式 索 引( 適 用 于Delphi3.0, 僅 適 用 于dBase 數(shù) 據(jù) 表).
ixNonMaintained: 是 否 不 需 要BDE 自 動(dòng) 維 護(hù)( 適 用 于Delphi1.0).
下面是一個(gè)例子:
假設(shè)有一個(gè)存放通訊錄數(shù)據(jù)表MyComm.DB(類型為Paradox)存放于本地目錄d:\mynote下,現(xiàn)建立一個(gè)主索引(索引域?yàn)榫幪?hào)ID)和一個(gè)次索引(索引域?yàn)榫幪?hào)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來(lái)實(shí)現(xiàn)
對(duì)Paradox數(shù)據(jù)表來(lái)說(shuō),用SQL只能建立次索引.
在SQL語(yǔ)法中,用來(lái)建立索引的語(yǔ)句是:
Create Index IndexName On TableName
(IndexField1,IndexField2,..)
其中:
IndexName為一個(gè)次索引的名稱,如MySecIndex1等.
TableName為對(duì)應(yīng)數(shù)據(jù)表的名稱,如MyTable等.
TableName后面為索引域列表,所有索引域有圓括號(hào)括起來(lái),
各索引域之間用逗號(hào)隔開(kāi).
下面是一個(gè)例子:
假設(shè)有一個(gè)存放通訊錄數(shù)據(jù)表MyComm.DB(類型為Paradox)存放于本地目錄
d:\mynote下,現(xiàn)建立一個(gè)次索引(索引域?yàn)榫幪?hào)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;
在應(yīng)用過(guò)程中,用戶的查詢條件可能是多種多樣的,如果能根據(jù)用戶查詢建立和選擇索引,對(duì)于保證應(yīng)用程序的性能,無(wú)疑是很有幫助的.
另外,由于停電等意外事故很容易造成數(shù)據(jù)庫(kù)中的索引文件未及時(shí)更新甚至于損壞,此時(shí)如果應(yīng)用程序再出幾個(gè)錯(cuò)誤信息,無(wú)疑將使用戶的處境雪上加霜.
因而,動(dòng)態(tài)維護(hù)數(shù)據(jù)庫(kù)索引文件,將使你的數(shù)據(jù)庫(kù)應(yīng)用程序更有穩(wěn)定性和可靠性.筆者將以Delphi編程中常用的Paradox數(shù)據(jù)庫(kù)為例,介紹數(shù)據(jù)庫(kù)索引文件的動(dòng)態(tài)維護(hù).
Paradox數(shù)據(jù)表索引分為主索引(Primary Index)即關(guān)鍵字(Primary Key)索引和次索引(Secondary Index),其中主索引對(duì)應(yīng).PX文件,次索引對(duì)應(yīng).XG*和.YG*文件.
一.創(chuàng)建表索引
(1) 用Table.AddIndex來(lái)實(shí)現(xiàn)
方法:AddIndex( IndexName,FieldNames,Options )
其中:(詳見(jiàn)Delphi幫助)
IndexName:索引名稱,僅在指定次索引時(shí)有作用.
FieldNames:索引域,可指定多個(gè)域,各域之間用分號(hào)隔開(kāi),如Field1;Field2;Field3
Options:索引選項(xiàng),可為[ixPrimary, ixUnique, ixDescending, ixCaseInsensitive, ixExpression]
其中:
ixPrimary : 建 立 的 索 引 為 主 索 引( 不 適 用 于dBase 數(shù) 據(jù) 表).
ixUnique : 不 允 許 重 復(fù) 值 的 索 引.
ixDescending: 按 降 序 索 引.
ixCaseInsensitive: 索 引 排 序 時(shí) 按 忽 略 大 小 寫(xiě)( 不 適 用 于dBase 數(shù) 據(jù) 表).
ixExpression: 建 立 表 達(dá) 式 索 引( 適 用 于Delphi3.0, 僅 適 用 于dBase 數(shù) 據(jù) 表).
ixNonMaintained: 是 否 不 需 要BDE 自 動(dòng) 維 護(hù)( 適 用 于Delphi1.0).
下面是一個(gè)例子:
假設(shè)有一個(gè)存放通訊錄數(shù)據(jù)表MyComm.DB(類型為Paradox)存放于本地目錄d:\mynote下,現(xiàn)建立一個(gè)主索引(索引域?yàn)榫幪?hào)ID)和一個(gè)次索引(索引域?yàn)榫幪?hào)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來(lái)實(shí)現(xiàn)
對(duì)Paradox數(shù)據(jù)表來(lái)說(shuō),用SQL只能建立次索引.
在SQL語(yǔ)法中,用來(lái)建立索引的語(yǔ)句是:
Create Index IndexName On TableName
(IndexField1,IndexField2,..)
其中:
IndexName為一個(gè)次索引的名稱,如MySecIndex1等.
TableName為對(duì)應(yīng)數(shù)據(jù)表的名稱,如MyTable等.
TableName后面為索引域列表,所有索引域有圓括號(hào)括起來(lái),
各索引域之間用逗號(hào)隔開(kāi).
下面是一個(gè)例子:
假設(shè)有一個(gè)存放通訊錄數(shù)據(jù)表MyComm.DB(類型為Paradox)存放于本地目錄
d:\mynote下,現(xiàn)建立一個(gè)次索引(索引域?yàn)榫幪?hào)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;