專利名稱:一種利用定長字段優(yōu)化迭代查詢的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及使用數(shù)據(jù)庫(DBMS)進行數(shù)據(jù)管理的應(yīng)用領(lǐng)域,特別是 大型的關(guān)系數(shù)據(jù)庫管理系統(tǒng),例如Sybase, oracle, mssql等等。
背景技術(shù):
查詢是數(shù)據(jù)庫中使用最頻繁的操作,所以對于一個數(shù)據(jù)庫應(yīng)用系統(tǒng)來 說,用戶最關(guān)心的就是查詢效率問題。在電信網(wǎng)絡(luò)管理系統(tǒng)中,為了滿足 用戶大數(shù)據(jù)量查詢需求釆用了迭代查詢的方式。迭代查詢的基本思想是將一個非常大的結(jié)果集分批返回,避免一次 性獲取數(shù)據(jù)過多造成內(nèi)存處理困難甚至系統(tǒng)崩潰。迭代器是迭代查詢過程 中使用的一種數(shù)據(jù)結(jié)構(gòu),其中保存了符合條件的總的記錄條數(shù)、每次獲取 的記錄條數(shù)、已經(jīng)查詢的次數(shù)和剩余查詢次數(shù)等等。迭代查詢的具體方案如下1) 設(shè)置迭代器,并將所有符合條件的記錄提取出來放入一個臨時表 或內(nèi)存中;2) 每次查詢時,根據(jù)已經(jīng)查詢的次數(shù)和每次查詢的記錄條數(shù)計算出 本次查詢的起始位置和結(jié)束位置;3) 如果是存放在臨時表中,則每次查詢時打開臨時表并定位到本次 查詢的起始位置,然后逐條讀取記錄直至結(jié)束位置;如果是存放在內(nèi)存中, 則直接取出本次查詢需要的記錄即可;4) 更新迭代器并查看迭代器中剩余查詢次數(shù),如果已為0,則清除 迭代器,查詢過程結(jié)束,否則開始下一次查詢。結(jié)合圖1所示,主要步驟包括
步驟IOI,業(yè)務(wù)模塊獲取迭代器;步驟102,迭代器容器分配迭代器;步驟103 ,將數(shù)據(jù)庫表中的數(shù)據(jù)提取到臨時表或內(nèi)存中;步驟104,從臨時表或內(nèi)存中迭代獲取數(shù)據(jù)庫記錄。上述查詢方案存在一定的缺陷,如果將符合條件的記錄放在臨時表 中,則每次查詢都要重新打開記錄集并執(zhí)行若干次NextRow操作定位到 本次查詢的起始位置,這顯然對查詢效率造成很大的影響,而且隨迭代次 數(shù)的增加查詢時間也成倍增長;如果放在內(nèi)存中,雖然可以節(jié)省這部分時 間開銷,但當(dāng)查詢數(shù)據(jù)量大時會占用大量的內(nèi)存空間,甚至可能導(dǎo)致內(nèi)存 溢出。發(fā)明內(nèi)容本發(fā)明所解決的技術(shù)問題在于提供一種利用定長字段優(yōu)化迭代查詢 的方法,以優(yōu)化目前廣泛使用的迭代查詢方法,解決用戶在進行大數(shù)據(jù)量 查詢時無法獲得較快的查詢速度,并且會耗費大量內(nèi)存等問題。為了解決上述問題,本發(fā)明提供了一種利用定長字段優(yōu)化迭代查詢的 方法,其特征在于,包括以下步驟(1)在數(shù)據(jù)庫表中設(shè)置一個定長的主鍵字段;(2 )根據(jù)具體要求從數(shù)據(jù)庫中取出所有符合條件的記錄的主鍵字段 的值并保存在一個磁盤文件中;(3) 設(shè)置迭代器,并通過迭代器對數(shù)據(jù)庫表進行分批查詢,查詢過 程中通過讀取》茲盤文件中的主4走字段的值來構(gòu)造SQL語句;(4) 迭代查詢完成后,刪除所述迭代器和保存在磁盤文件中的值。 本發(fā)明所述的方法,其中,所述步驟(2)為根據(jù)網(wǎng)管系統(tǒng)的具體要求構(gòu)造SQL語句從數(shù)據(jù)庫中取出所有符合條 件的記錄的主鍵字段的值,并按照二進制方式保存在一個磁盤文件中。其中,所述步驟(3)包括(31) 設(shè)置迭代器,并通過迭代器獲取每次查詢的記錄條數(shù)N,計算出本次查詢的起始記錄編號,根據(jù)所述定長的主鍵字段,所述起始記錄編號直接定位到磁盤文件中對應(yīng)主鍵字段的值的位置,順序讀取N個主鍵 字段的值;(32) 使用獲取到的主鍵字段的值構(gòu)造SQL語句;(33) 執(zhí)行構(gòu)造好的SQL語句,獲取本次查詢的記錄集,并更新迭代器;(34) 重復(fù)步驟(31)到(33)分批查詢獲取記錄,直到迭代器中剩 余迭代次數(shù)為0。上面所述的方法,其中,所述SQL語句,其中的where子句采用所 述主鍵字段的名稱in (主鍵l,主鍵2…主鍵N)的方式構(gòu)造。其中,所述步驟(4)包括(41) 迭代查詢完成后,刪除所述迭代器;(42) 刪除步驟(2)中創(chuàng)建的以二進制方式保存在磁盤文件中的主 鍵字段的值。本發(fā)明所述的方法,其中,步驟(l)中所述數(shù)據(jù)庫表為歷史告警表。 其中,所述二進制為,file方式的二進制。本發(fā)明所述的方法,其中,步驟(3)中所述迭代器,為數(shù)組型迭代 器或者鏈表型迭代器。本發(fā)明與目前迭代查詢方法相比具有以下優(yōu)點.1 )每次查詢只獲取本批需要的記錄,避免多余的NextRow才喿作,查 詢速度快;2) 采用定長主鍵字段,文件定位速度快;3) 僅僅將主鍵值保存在磁盤文件中,節(jié)省程序內(nèi)存。同時,本發(fā)明沒有引入各種大型數(shù)據(jù)庫的差異性,能滿足各種大型數(shù) 據(jù)庫應(yīng)用系統(tǒng)中的查詢需求。
圖1是現(xiàn)有技術(shù)的迭代查詢方法流程圖2是本發(fā)明實施例所述的一種利用定長字段優(yōu)化迭代查詢的方法 流程圖3是本發(fā)明實施例所述的電信網(wǎng)絡(luò)管理系統(tǒng)中的歷史告警表利用 定長字段優(yōu)化迭代查詢的方法流程圖。
具體實施例方式
本發(fā)明的目的是介紹一種利用定長字段優(yōu)化迭代查詢的方法,優(yōu)化目 前廣泛使用的迭代查詢方法,使得用戶在進行大數(shù)據(jù)量查詢時能獲得較快 的查詢速度,且不會耗費大量內(nèi)存。以下對具體實施方式
進行詳細描述, 但不作為對本發(fā)明的限定。
如圖2所示,本發(fā)明所述的迭代查詢方法操作步驟如下
步驟201,在表中加入一個定長的主鍵字段,用來唯一標(biāo)識一條記錄;
步驟202,從數(shù)據(jù)庫中取出所有滿足條件的記錄的主鍵字段值并保存 在一個》茲盤文件中;
步驟203,設(shè)置迭代器,并使用迭代器進行分批查詢;
步驟204,迭代查詢完成,刪除迭代器和保存主4定值的二進制文件。
上述方法所述的系統(tǒng)中應(yīng)該定義一個全局的迭代器池,可以為數(shù)組或鏈表。
需要使用迭代器時,如果是數(shù)組,就從全局迭代池中取一個空閑結(jié)點 并初始化各分量。如果是鏈表,則創(chuàng)建一個迭代器結(jié)點并插入到全局迭代 器鏈表中
刪除迭代器時,如果系統(tǒng)使用的是數(shù)組,將本次使用的迭代器各個分 量清0即可。
如果使用的是鏈表,則從鏈表中刪除該迭代器結(jié)點。
所述方法,其中方法所述步驟203中設(shè)置迭代器,并使用迭代器進行 分批查詢,包括以下幾個步驟
3.1) 通過迭代器獲取每次查詢的記錄條數(shù)N,并計算出本次查詢的 起始記錄編號。因為采用了定長的主鍵字段,所以可以根據(jù)起始記錄編號 直接定位到文件中對應(yīng)主鍵的位置,順序讀取N個主鍵值;
3.2 )使用獲取到的主鍵值構(gòu)造sql語句,sql語句的where子句采用主 鍵名稱in(主鍵l,主鍵2…主鍵N)的方式構(gòu)造;
3.3) 執(zhí)行構(gòu)造好的sql語句,獲取本次查詢的記錄集,并更新迭代器;
3.4) 重復(fù)步驟3.1)到3.3)分批獲耳又記錄,直到迭代器中剩余迭代 次數(shù)為0。
所述方法,其中方法所述步驟204中迭代查詢完成,刪除迭代器和保 存主鍵值的二進制文件,包括以下幾個步驟
4.1 )根據(jù)迭代器id從全局迭代器緩沖池中查找并刪除本次使用的迭 代器結(jié)點 ,
4.2) 刪除步驟2)中創(chuàng)建的保存主4建值的二進制文件。
下面實施例以電信網(wǎng)絡(luò)管理系統(tǒng)中的常見表一一 "歷史告警"為例, 結(jié)合圖3詳細說明本發(fā)明優(yōu)化后的迭代查詢的步驟。
1、 創(chuàng)建一個歷史告警表HistoryAlarm,表中包括一個id字段,并在 該字段上建立索引或者將該字段作為主鍵。
2、 從數(shù)據(jù)庫中獲取所有符合條件的記錄并存放在磁盤文件中。
2.1 )根據(jù)網(wǎng)管系統(tǒng)具體應(yīng)用要求構(gòu)造查詢歷史告警表的where條件, 然后通過where條件構(gòu)造sql語句查詢符合條件的記錄的id信息。
2.2)將步驟1)中查詢出來的id信息按照二進制方式寫入文件中, 因為id的長度一定,所以每個值在二進制文件中占用相同的字節(jié)數(shù)。具 體實現(xiàn)中采用FILE方式打開二進制文件,因為如果采用fstream方式打開 二進制文件寫入速度會慢很多。
3、 設(shè)置迭代器,并使用迭代器進行分批查詢
3.1) 從迭代器中獲取本次查詢的記錄個數(shù)N并計算出獲取本次查詢 的開始位置;
3.2) 以只讀方式打開保存id信息的二進制文件;
3.3 )根據(jù)步驟3.1)中獲取的本次查詢開始位置和主鍵字段的長度計 算出本次查詢所需主鍵在文件中的起始位置;
3.4) 根據(jù)步驟3.3)計算出來的文件起始位置定位二進制文件到指定 id,然后順序讀取N個id值;
3.5) 使用步驟3.4)獲取到的id構(gòu)造如下sql語句
select * from History Alarm where id in (id—1,id一2,id一3.. .id—N)
3.6) 使用構(gòu)造好的sql語句打開結(jié)果集獲取本次查詢的記錄;
3.7) 按照上述步驟分批獲取歷史告警數(shù)據(jù),直到迭代器中剩余查詢 次數(shù)為0。
4、根據(jù)迭代器id號刪除迭代器。
5 、刪除保存歷史告警表主鍵值的二進制文件。
按照本發(fā)明所述的迭代查詢方法,應(yīng)用于電信網(wǎng)絡(luò)管理系統(tǒng)歷史告警 查詢。與普通的迭代獲取方式相對比,在查詢20萬條記錄的時候效率提 高2倍,在數(shù)據(jù)量達到百萬以上的時候可以提高幾十倍,數(shù)據(jù)量越大的時 候效率提高越明顯。
當(dāng)然,本發(fā)明還可有其他多種實施例,在不背離本發(fā)明精神及其實質(zhì) 的情況下,熟悉本領(lǐng)域的技術(shù)人員可根據(jù)本發(fā)明做出各種相應(yīng)的改變和變 形,但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護范圍。
權(quán)利要求
1、一種利用定長字段優(yōu)化迭代查詢的方法,其特征在于,包括以下步驟(1)在數(shù)據(jù)庫表中設(shè)置一個定長的主鍵字段;(2)根據(jù)具體要求從數(shù)據(jù)庫中取出所有符合條件的記錄的主鍵字段的值并保存在一個磁盤文件中;(3)設(shè)置迭代器,并通過迭代器對數(shù)據(jù)庫表進行分批查詢,查詢過程中通過讀取磁盤文件中的主鍵字段的值來構(gòu)造SQL語句;(4)迭代查詢完成后,刪除所述迭代器和保存在磁盤文件中的值。
2、 如權(quán)利要求l所述的方法,其特征在于,所述步驟(2)為根據(jù)網(wǎng)管系統(tǒng)的具體要求構(gòu)造SQL語句從數(shù)據(jù)庫中取出所有符合條 件的記錄的主鍵字段的值,并按照二進制方式保存在一個磁盤文件中。
3、 如權(quán)利要求2所述的方法,其特征在于,所述步驟(3)包括(31) 設(shè)置迭代器,并通過迭代器獲取每次查詢的記錄條數(shù)N,計算 出本次查詢的起始記錄編號,根據(jù)所述定長的主鍵字段,所述起始記錄編 號直接定位到磁盤文件中對應(yīng)主鍵字段的值的位置,順序讀取N個主鍵 字段的值;(32) 使用獲取到的主鍵字段的值構(gòu)造SQL語句;(33) 執(zhí)行構(gòu)造好的SQL語句,獲取本次查詢的記錄集,并更新迭代器;(34) 重復(fù)步驟(31 )到(33)分批查詢獲取記錄,直到迭代器中剩 余迭代次^:為0。
4、 如權(quán)利要求2或3所述的方法,其特征在于,所述SQL語句,其 中的where子句采用所述主鍵字段的名稱in (主鍵1,主鍵2...主鍵N)的方式構(gòu)造。
5、 如權(quán)利要求3所述的方法,其特征在于,所述步驟(4)包括(41) 迭代查詢完成后,刪除所述迭代器;(42) 刪除步驟(2)中創(chuàng)建的以二進制方式保存在^f茲盤文件中的主 鍵字段的值。
6、 如權(quán)利要求1所述的方法,其特征在于,步驟(1 )中所述數(shù)據(jù)庫 表為歷史告警表。
7、 如權(quán)利要求2所述的方法,其特征在于,所述二進制為,file方式 的二進制。
8、 如權(quán)利要求1所述的方法,其特征在于,步驟(3 )中所述迭代器, 為數(shù)組型迭代器或者鏈表型迭代器。
全文摘要
本發(fā)明公開了一種利用定長字段優(yōu)化迭代查詢的方法,包括(1)在數(shù)據(jù)庫表中設(shè)置一個定長的主鍵字段;(2)根據(jù)具體要求從數(shù)據(jù)庫中取出所有符合條件的記錄的主鍵字段的值并保存在一個磁盤文件中;(3)設(shè)置迭代器,并通過迭代器對數(shù)據(jù)庫表進行分批查詢,查詢過程中通過讀取磁盤文件中的主鍵字段的值來構(gòu)造SQL語句;(4)迭代查詢完成后,刪除所述迭代器和保存在磁盤文件中的值。本發(fā)明以優(yōu)化目前廣泛使用的迭代查詢方法,解決用戶在進行大數(shù)據(jù)量查詢時無法獲得較快的查詢速度,并且會耗費大量內(nèi)存等問題。
文檔編號G06F17/30GK101149738SQ20071011063
公開日2008年3月26日 申請日期2007年6月6日 優(yōu)先權(quán)日2007年6月6日
發(fā)明者魯春懷 申請人:中興通訊股份有限公司