用Delphi程序維護Paradox數(shù)據(jù)表的索引

字號:

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