專利名稱::存儲(chǔ)和訪問數(shù)據(jù),以及提高數(shù)據(jù)庫查詢語言語句性能的方法和機(jī)制的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及數(shù)據(jù)庫管理系統(tǒng)領(lǐng)域。更具體地,本發(fā)明涉及在計(jì)算機(jī)系統(tǒng)中存儲(chǔ)和檢索數(shù)據(jù),以及提高數(shù)據(jù)庫查詢語言語句的性能的方法和機(jī)制。
背景技術(shù):
:隨著許多現(xiàn)代商業(yè)和組織對訪問更為大量信息的需求的增加,必須存儲(chǔ)在數(shù)據(jù)庫和計(jì)算機(jī)系統(tǒng)中的數(shù)據(jù)量也在增加。存儲(chǔ)大量信息的費(fèi)用的一個(gè)重要部分與購買和維護(hù)數(shù)據(jù)存儲(chǔ)系統(tǒng)的成本有關(guān)。給定這樣的費(fèi)用,建議采用適當(dāng)?shù)姆椒▉頊p少存儲(chǔ)給定數(shù)據(jù)量所需要的空間量。數(shù)據(jù)壓縮是在許多現(xiàn)代計(jì)算機(jī)系統(tǒng)中用來減少數(shù)據(jù)的存儲(chǔ)成本的一種技術(shù)。實(shí)現(xiàn)壓縮的一種普通方法是以文件的粒度(granularity)壓縮數(shù)據(jù)。例如,常規(guī)壓縮方法,如基于Unix的gzip和基于DOS的zip,將整個(gè)文件壓縮成該文件的更加緊湊版本。這種類型的方法的缺點(diǎn)是,如果整個(gè)文件被壓縮,那么在使用其任何一部分之前,必須解壓縮全部文件或大部分文件,即使是用戶實(shí)際上只需要很小的一部分。特別對于壓縮數(shù)據(jù)庫系統(tǒng)中的文件存在問題,其中單個(gè)數(shù)據(jù)庫文件可能包含大量的數(shù)據(jù)庫記錄,但是在任何時(shí)候可能只需要各個(gè)記錄的一小部分。于是壓縮或解壓縮的粒度可能實(shí)際上并不與在系統(tǒng)中期望使用和訪問數(shù)據(jù)的粒度匹配。然而,以其它粒度壓縮可能導(dǎo)致存儲(chǔ)效率低下。例如,某些一次一頁的壓縮方法可能會(huì)導(dǎo)致壓縮頁面大小不同,其映射到物理頁面的效率低下。另外,許多常規(guī)壓縮技術(shù)甚至不能保證壓縮后數(shù)據(jù)大小不會(huì)增加。而且,壓縮和解壓縮數(shù)據(jù)這樣的操作可能會(huì)消耗大量的系統(tǒng)開銷。系統(tǒng)開銷典型地與所使用的具體壓縮算法以及被壓縮和解壓縮的數(shù)據(jù)量相關(guān)。當(dāng)試圖在數(shù)據(jù)庫系統(tǒng)中存儲(chǔ)、檢索、或更新信息時(shí),該系統(tǒng)開銷就使等待時(shí)間顯著地增加。例如某些壓縮技術(shù)將壓縮信息與被壓縮的數(shù)據(jù)分開存儲(chǔ)。因此,對于簡單的讀訪問,就需要訪問數(shù)據(jù)庫中的多個(gè)位置,并且可能需要進(jìn)行復(fù)雜的解壓縮操作。給定等待時(shí)間問題,以及低于某一壓縮增益,在數(shù)據(jù)庫或其它類型的計(jì)算系統(tǒng)中,壓縮的時(shí)間和空間之間的權(quán)衡并不總是令人滿意。因此需要一種壓縮技術(shù),其不僅會(huì)使得減少所使用的磁盤空間,而且對查詢壓縮數(shù)據(jù)的數(shù)據(jù)庫查詢語言語句的性能沒有負(fù)面影響。
發(fā)明內(nèi)容本發(fā)明提供一種存儲(chǔ)和檢索壓縮格式的數(shù)據(jù)的方法和機(jī)制。在一個(gè)實(shí)施例中,通過減少或去除在數(shù)據(jù)塊或其它存儲(chǔ)單元中的重復(fù)數(shù)據(jù)值,對所存儲(chǔ)的數(shù)據(jù)進(jìn)行數(shù)據(jù)壓縮。在另一個(gè)實(shí)施例中,保持有描述該數(shù)據(jù)塊內(nèi)的數(shù)據(jù)重復(fù)的信息。本發(fā)明也提供一種用于改進(jìn)數(shù)據(jù)庫查詢語言語句的性能的方法和機(jī)制。在一個(gè)實(shí)施例中,維護(hù)并使用所保持的數(shù)據(jù)重復(fù)信息,以減少謂詞(predicate)評估的數(shù)目。在另一個(gè)實(shí)施例中,使用該數(shù)據(jù)重復(fù)信息以減少通過數(shù)據(jù)庫查詢語言語句訪問的數(shù)據(jù)的量。下面在說明書、附圖和權(quán)利要求中對本發(fā)明的各方面、目的和優(yōu)點(diǎn)進(jìn)行更詳細(xì)的描述。前面的一般性說明和下面的詳細(xì)說明都是示范性的和解釋性的,并不意欲對本發(fā)明的范圍進(jìn)行限定。所包括的附圖與發(fā)明詳述一起提供對本發(fā)明更進(jìn)一步的理解,并且用于解釋本發(fā)明。圖1所示為根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)。圖2所示為存儲(chǔ)數(shù)據(jù)過程的實(shí)施例的流程圖。圖3所示為檢索數(shù)據(jù)過程的實(shí)施例的流程圖。圖4描述了根據(jù)本發(fā)明實(shí)施例的符號表格中的條目的遞歸引用。圖5描述了根據(jù)本發(fā)明實(shí)施例的符號表格中的條目的遞歸引用和列的重新排序。圖6所示為存儲(chǔ)數(shù)據(jù)過程的可選實(shí)施例的流程圖。圖7描述了根據(jù)本發(fā)明實(shí)施例的NULL尾值的刪除。圖8描述了根據(jù)本發(fā)明實(shí)施例的NULL尾值的刪除和列的重新排序。圖9所示為根據(jù)本發(fā)明的實(shí)施例,將解壓縮的數(shù)據(jù)塊轉(zhuǎn)換成壓縮數(shù)據(jù)塊的過程。圖10的流程圖為根據(jù)本發(fā)明的實(shí)施例,提高數(shù)據(jù)庫查詢語言語句性能的方法。圖11說明了根據(jù)本發(fā)明的實(shí)施例,保持?jǐn)?shù)據(jù)重復(fù)信息的過程。圖12描述了根據(jù)本發(fā)明一個(gè)實(shí)施例的數(shù)據(jù)重復(fù)信息的保持。圖13所示的流程圖為根據(jù)本發(fā)明的另一個(gè)實(shí)施例,保持?jǐn)?shù)據(jù)重復(fù)信息的方法。圖14描述了根據(jù)本發(fā)明的一個(gè)實(shí)施例,對數(shù)據(jù)重復(fù)信息的更新。圖15的處理流程為根據(jù)本發(fā)明的實(shí)施例,提高數(shù)據(jù)庫查詢語言語句性能的方法。圖16所說明的流程圖為提高數(shù)據(jù)庫查詢語言語句性能的另一個(gè)方法。圖17描述了根據(jù)本發(fā)明的一個(gè)實(shí)施例,數(shù)據(jù)庫查詢語言語句的性能是如何提高的范例。圖18所示的處理流程為根據(jù)本發(fā)明的另一個(gè)實(shí)施例,提高數(shù)據(jù)庫查詢語言語句性能的方法。圖19說明的是根據(jù)本發(fā)明的實(shí)施例,減少通過數(shù)據(jù)庫查詢語言語句訪問的數(shù)據(jù)量的過程。圖20為根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何可以使用數(shù)據(jù)重復(fù)信息來提高數(shù)據(jù)庫查詢語言語句的性能的范例。圖21描述的流程圖為根據(jù)本發(fā)明進(jìn)一步實(shí)施例的提高數(shù)據(jù)庫查詢語言語句性能的方法。圖22為根據(jù)本發(fā)明的一個(gè)實(shí)施例,如何可以使用數(shù)據(jù)重復(fù)信息來滿足數(shù)據(jù)庫查詢語言語句的范例。圖23為可以用來實(shí)施本發(fā)明實(shí)施例的計(jì)算機(jī)系統(tǒng)的框圖。圖24所示為根據(jù)本發(fā)明實(shí)施例的查找樹的范例。具體實(shí)施例方式本發(fā)明公開了從數(shù)據(jù)存儲(chǔ)系統(tǒng)存儲(chǔ)和檢索數(shù)據(jù)。不是以文件級別或某一其它粒度壓縮數(shù)據(jù),這類數(shù)據(jù)壓縮可能會(huì)導(dǎo)致存儲(chǔ)效率低下和/或增加數(shù)據(jù)庫查詢語言語句的執(zhí)行時(shí)間,而是通過減少或去除數(shù)據(jù)塊或其它存儲(chǔ)單元中的重復(fù)值來實(shí)現(xiàn)數(shù)據(jù)壓縮。本發(fā)明還公開了提高數(shù)據(jù)庫查詢語言語句的性能。通過保存描述數(shù)據(jù)塊內(nèi)的數(shù)據(jù)重復(fù)的信息(以前在每次訪問數(shù)據(jù)塊時(shí)都必須對其重新計(jì)算),可以使用數(shù)據(jù)重復(fù)信息來提高數(shù)據(jù)庫查詢語言語句的性能。數(shù)據(jù)庫查詢語言語句常被用于創(chuàng)建、查找、訪問、檢索、修改、組織、維護(hù)、操作、定義、控制、添加、和/或刪除數(shù)據(jù)庫中的數(shù)據(jù)和結(jié)構(gòu)。一種流行的數(shù)據(jù)庫查詢語言稱為結(jié)構(gòu)化查詢語言(SQL)。只用于解釋目的,而不是通過限制的方式,特別參考包括SQL的數(shù)據(jù)庫語句進(jìn)行下面的說明。整個(gè)文章中所使用的術(shù)語“盤”和“盤系統(tǒng)”指的是數(shù)據(jù)存儲(chǔ)系統(tǒng)。此處所公開的發(fā)明概念也可以應(yīng)用于除了基于盤的系統(tǒng)之外的其它類型的存儲(chǔ)系統(tǒng)。另外將關(guān)于從數(shù)據(jù)庫中存儲(chǔ)或檢索關(guān)系數(shù)據(jù)做出下面的說明。然而要注意到,本發(fā)明可以用于在計(jì)算機(jī)系統(tǒng)中管理其它類型和粒度的數(shù)據(jù),于是本發(fā)明并不局限于壓縮關(guān)系數(shù)據(jù)。根據(jù)本發(fā)明的實(shí)施例,對將要存儲(chǔ)在特定數(shù)據(jù)存儲(chǔ)單元內(nèi)的一組數(shù)據(jù)內(nèi)的重復(fù)值做出標(biāo)識。不是將所有的這些重復(fù)數(shù)據(jù)值寫入到該數(shù)據(jù)存儲(chǔ)單元,而是創(chuàng)建一個(gè)符號表來存儲(chǔ)每一重復(fù)的數(shù)據(jù)值的一個(gè)拷貝。重復(fù)數(shù)據(jù)值的每一次出現(xiàn)被配置成引用該符號表中的對應(yīng)的重復(fù)數(shù)據(jù)值。如此處所述,數(shù)據(jù)存儲(chǔ)單元被顯示為數(shù)據(jù)塊或盤頁面。然而,也可以使用其它數(shù)據(jù)存儲(chǔ)單元。在一個(gè)實(shí)施例中,數(shù)據(jù)塊是自含式的,例如,重新創(chuàng)建數(shù)據(jù)塊中的解壓縮數(shù)據(jù)所需要的信息在該數(shù)據(jù)塊內(nèi)可獲得。圖1所示的數(shù)據(jù)庫表格100將要被存儲(chǔ)到盤112上的塊114內(nèi)。表格100中的每一行包括4列信息,包括“序號”列120、“客戶”列122、“項(xiàng)目”列124、和“價(jià)格”列126。表格100中顯示有3行數(shù)據(jù)。行102a在“序號”列120的值為“1251”、在“客戶”列122的值為“Joe”、在“項(xiàng)目”列124的值為“Book”、并且在“價(jià)格”列126的值為“10”。行104a在“序號”列120的值為“1252”、在“客戶”列122的值為“Tom”、在“項(xiàng)目”列124的值為“Book”、并且在“價(jià)格”列126的值為“10”。行106a在“序號”列120的值為“1253”、在“客戶”列122的值為“Joe”、在“項(xiàng)目”列124的值為“Tape”、并且在“價(jià)格”列126的值為“20”。注意到,值“Joe”在行102a和106a的“客戶”列122重復(fù)。類似地,值“Book”在行102a和104a的“項(xiàng)目”列124重復(fù)。值“10”在行102a和104a的“價(jià)格”列126重復(fù)。創(chuàng)建符號表110以存儲(chǔ)每一重復(fù)的數(shù)據(jù)值。特別地,重復(fù)值“Joe”存儲(chǔ)在符號表?xiàng)l目(entry)130中,重復(fù)值“10”存儲(chǔ)在符號表?xiàng)l目132中,并且重復(fù)值“Book”存儲(chǔ)在符號表?xiàng)l目134中。當(dāng)表格100中的每一行數(shù)據(jù)存儲(chǔ)到盤112上的塊114時(shí),重復(fù)的數(shù)據(jù)值不再寫入盤中。相反,例如使用指針或鏈接結(jié)構(gòu),每一行的相應(yīng)部分被配置成引用包含正確數(shù)據(jù)值的符號表110中的適當(dāng)符號表?xiàng)l目。為了示意起見,考慮表格100中的行102a。行102a包括下面的列值“1251”、“Joe”、“Book”和“10”。注意到,符號表110包括用于值“Joe”、“Book”和“10”的條目,它們是出現(xiàn)在行102a中的表格100中的重復(fù)數(shù)據(jù)值。當(dāng)將行102a寫到盤時(shí),只有唯一值“1251”單獨(dú)地寫到盤。這在盤上行結(jié)構(gòu)102中b顯示,對應(yīng)于表格100中行102a。盤上行結(jié)構(gòu)102b包括對應(yīng)于行102a中的“序號”列120的第一部分142,其包括唯一數(shù)據(jù)值“1251”。對于重復(fù)數(shù)據(jù)值,可以將指針或鏈接插入到盤上行結(jié)構(gòu)的適當(dāng)部分,以指向符號表110中的適當(dāng)條目。盤上行結(jié)構(gòu)102b包括對應(yīng)于行102a中的“客戶”列122的部分144,其被配置成包括指向符號表?xiàng)l目130的指針136,其與行102a的“客戶”列122中的重復(fù)數(shù)據(jù)值“Joe”匹配。盤上行結(jié)構(gòu)102b還包括對應(yīng)于行102a中的“項(xiàng)目”列124的部分146,其被配置成包括指向符號表?xiàng)l目134的指針138,其與行102a的“項(xiàng)目”列124中的重復(fù)數(shù)據(jù)值“Book”匹配。盤上行結(jié)構(gòu)102b進(jìn)一步包括對應(yīng)于行102a中“價(jià)格”列126的部分148,其被配置成包括指向符號表?xiàng)l目132的指針140,其與行102a的“價(jià)格”列126中的重復(fù)數(shù)據(jù)值“10”匹配。表格100中的行104a和106a在被存儲(chǔ)到盤112上的塊114內(nèi)時(shí)的表現(xiàn)相似。于是,表格100中的行104a作為盤上行結(jié)構(gòu)104b被寫到盤。行104a的唯一數(shù)據(jù)值“1252”和“Tom”被單獨(dú)地寫入盤上行結(jié)構(gòu)104b中。行104a還包括分別列124和126中的重復(fù)行值“Book”和“10”。對應(yīng)于行104a中列124的盤上行結(jié)構(gòu)104b的部分150被配置成包括指向符號表110中的條目134的指針154,其與重復(fù)數(shù)據(jù)值“Book”匹配。對應(yīng)于行104a中列126的盤上行結(jié)構(gòu)104b的部分152被配置成包括指向符號表110中的條目132的指針156,其與重復(fù)數(shù)據(jù)值“10”匹配。表格100中的行106a作為盤上行結(jié)構(gòu)106b被寫入盤。在行106a中,唯一數(shù)據(jù)值是“1253”、“Tape”和“20”,它們被單獨(dú)地寫入到盤上行結(jié)構(gòu)106b中。行106a還包括列122中的重復(fù)行值“Joe”。對應(yīng)于行106a中列122的盤上行結(jié)構(gòu)106b的部分160被配置成包括指向符號表110中的條目130的指針162,其與重復(fù)數(shù)據(jù)值“Joe”匹配。圖2示出用于將數(shù)據(jù)存儲(chǔ)到盤上的過程的實(shí)施例流程圖。在202,收到將數(shù)據(jù)存儲(chǔ)到盤上的請求。在一個(gè)實(shí)施例中,是否壓縮數(shù)據(jù)是用戶或系統(tǒng)選擇的一個(gè)選項(xiàng)。如果選擇壓縮,那么在204,就對將要存儲(chǔ)到給定數(shù)據(jù)塊中的數(shù)據(jù)的各部分進(jìn)行數(shù)據(jù)分析以標(biāo)識重復(fù)數(shù)據(jù)值。根據(jù)所標(biāo)識的數(shù)據(jù)重復(fù),創(chuàng)建一個(gè)符號表,其包括某些或全部重復(fù)數(shù)據(jù)值(206)。從而創(chuàng)建了該數(shù)據(jù)塊中的每一盤上行結(jié)構(gòu)。盤上行結(jié)構(gòu)被格式化以排除某些或全部重復(fù)數(shù)據(jù)值(208)。特別地,與重復(fù)數(shù)據(jù)值相關(guān)聯(lián)的盤上行結(jié)構(gòu)被設(shè)置成引用存儲(chǔ)關(guān)系數(shù)據(jù)值的符號表中的一個(gè)或多個(gè)適當(dāng)條目。如果離線執(zhí)行該壓縮方法,那么就以批處理模式執(zhí)行行的分析和格式化,使得數(shù)據(jù)庫塊的全部內(nèi)容在寫到盤之前被預(yù)先組織過。離線處理使得可以精確地確定填入給定數(shù)據(jù)塊的行數(shù)??商鎿Q地,可以在線執(zhí)行該壓縮方法,單獨(dú)地準(zhǔn)備每一盤上行結(jié)構(gòu),并將其寫到盤上。在任何一種情況下,設(shè)置塊元數(shù)據(jù)以指示該塊中的數(shù)據(jù)、或該塊中的部分?jǐn)?shù)據(jù)是否已經(jīng)被壓縮。在一個(gè)實(shí)施例中,塊的首部包括指示該塊或該塊中的數(shù)據(jù)是否已經(jīng)被壓縮的數(shù)據(jù)結(jié)構(gòu)。在一個(gè)實(shí)施例中,單個(gè)比特足以用于指示該塊中的數(shù)據(jù)是否被壓縮。在另一個(gè)實(shí)施例中,不是在數(shù)據(jù)被裝載到數(shù)據(jù)塊中時(shí)將數(shù)據(jù)壓縮,而是將未壓縮的數(shù)據(jù)塊轉(zhuǎn)換為壓縮數(shù)據(jù)。如圖9中所示,對數(shù)據(jù)塊進(jìn)行分析,以標(biāo)識重復(fù)數(shù)據(jù)值(9002)。根據(jù)所標(biāo)識的數(shù)據(jù)重復(fù),創(chuàng)建包括某些或全部重復(fù)數(shù)據(jù)值的符號表(9004)。將該符號表中數(shù)據(jù)值的某些或全部重復(fù)從該數(shù)據(jù)塊中去除或刪除(9006)。然后數(shù)據(jù)塊中的盤上行結(jié)構(gòu)被配置成引用存儲(chǔ)該關(guān)系數(shù)據(jù)值的符號表中的一個(gè)或多個(gè)適當(dāng)條目(9008)。如果單個(gè)塊內(nèi)數(shù)據(jù)重復(fù)的可能性較低,那么所期望的壓縮比也可能較低。如果這種重復(fù)的可能性較高,則所期望的壓縮比也可能較高。于是,可以對行進(jìn)行重組以增加這種重復(fù)的可能性。對于單列表格,這樣做的一種方法就是按照列值對表格的行進(jìn)行排序。在結(jié)構(gòu)化查詢語言(SQL)中,這可以通過執(zhí)行帶有排序子句(clause)的語句“CREATETABLEASSELECT”實(shí)現(xiàn)。通過按照較低基數(shù)(cardinality)列對表格的行進(jìn)行排序,也可以將這種類型的技術(shù)應(yīng)用于一列基數(shù)較低,而其它列的基數(shù)較高的表格。對于具有多個(gè)較低基數(shù)列的表格,可以通過首先確定具有最低基數(shù)的列來執(zhí)行調(diào)節(jié)以實(shí)現(xiàn)更好的壓縮比??梢酝ㄟ^執(zhí)行語句“SELECTCOUNT(DISTINCT(c))fromT;”來確定列的基數(shù)。一旦確定了最低基數(shù)的列(假定為列C1),對于所選列的固定值,就確定了其它列的基數(shù)。對于除了C1之外的所有列cK,其可以通過執(zhí)行語句“SELECTSUM(count(*)*COUNT(DISTINCT(cK)))fromTgroupbyC1”測得。假定列C2具有最低的這種測量值。于是在固定了頭2列之后確定具有最低基數(shù)的列。對于除了C1和C2之外的所有列cK,可以通過執(zhí)行語句“SELECTSUM(count(*)*COUNT(DISTINCT(cK)))fromTgroupbyC1,C2”測得。通過繼續(xù)進(jìn)行該過程,就可以確定某個(gè)列序列Cl,C2,...,Cn。該序列可以用作創(chuàng)建表格壓縮語句的ORDEREDBY子句中的列序列。圖3示出了用于從盤檢索數(shù)據(jù)的過程的實(shí)施例的流程圖。在302,接收到從盤檢索數(shù)據(jù)的請求。在304,標(biāo)識正被搜索的特定塊或行??梢允褂萌魏纬R?guī)的定索引或查找技術(shù)來執(zhí)行操作304。在306,判定該關(guān)系數(shù)據(jù)庫塊是否以壓縮格式存儲(chǔ)。在一個(gè)實(shí)施例中,訪問該塊的首部來做出該判定。如果塊沒有被壓縮,那么就立即從盤檢索該請求的行信息(310),并返回到請求實(shí)體(312)。如果塊被壓縮,那么就訪問所請求行的關(guān)系盤上行結(jié)構(gòu),以從符號表中檢索重復(fù)數(shù)據(jù)值(308)。另外,也從盤上行結(jié)構(gòu)檢索單獨(dú)存儲(chǔ)的數(shù)據(jù)值(310)。在312,將該組完整的請求數(shù)據(jù)返回到請求實(shí)體。在符號表中可以使用遞歸符號條目。遞歸符號條目是在符號表中本身引用一個(gè)或多個(gè)其它符號表?xiàng)l目的條目。圖4示意了使用遞歸符號條目對數(shù)據(jù)塊格式化,以存儲(chǔ)圖1的表格100。類似于圖1的符號表110,遞歸符號表410包括存儲(chǔ)數(shù)據(jù)值“Joe”的條目430、存儲(chǔ)數(shù)據(jù)值“10”的條目432、和存儲(chǔ)數(shù)據(jù)值“Book”的條目434。與圖1的符號表110有所不同,遞歸符號表410包括引用符號表410內(nèi)其它條目的遞歸符號表?xiàng)l目480。特別地,遞歸符號表?xiàng)l目480包括第一部分482,其與指向條目434中的數(shù)據(jù)值“Book”的鏈結(jié)486相關(guān)聯(lián)。遞歸符號表?xiàng)l目480也包括第二部分482,其與指向條目432中的數(shù)據(jù)值“10”的鏈接488相關(guān)聯(lián)。通過組合第一部分482和第二部分484,條目480邏輯地創(chuàng)建了順序包括兩個(gè)引用數(shù)據(jù)值的條目,即在數(shù)據(jù)值“10”之前直接具有數(shù)據(jù)值“Book”。通過這種方式組合多個(gè)條目的一個(gè)優(yōu)點(diǎn)是,對于存儲(chǔ)在塊中的行,存在可能與這些組合匹配的列值序列。在盤上行結(jié)構(gòu)與符號表中的單個(gè)數(shù)據(jù)值之間不是具有多個(gè)鏈接或指針結(jié)構(gòu),而是可以使用單個(gè)鏈接或指針結(jié)構(gòu)來指向遞歸地鏈接到多個(gè)其它條目的組合條目。參照圖1的表格100,行102a和行104a中的列124和126依次具有數(shù)據(jù)值“Book”和“10”。在圖1中,盤上行結(jié)構(gòu)102b(其對應(yīng)于行102a)包括指向數(shù)據(jù)值“Book”的鏈接138,和指向數(shù)據(jù)值“10”的單獨(dú)鏈接140。類似地,盤上行結(jié)構(gòu)104b(其對應(yīng)于行104a)包括指向數(shù)據(jù)值“Book”的鏈接154,和指向數(shù)據(jù)值“10”的單獨(dú)鏈接156。從這些盤上行結(jié)構(gòu)到符號表110中的條目共有4個(gè)鏈接。在圖4的遞歸方法中,盤上行結(jié)構(gòu)402b(對應(yīng)于行102a)包括要單個(gè)鏈接472,其指向由遞歸符號表?xiàng)l目480表示的組合的順序數(shù)據(jù)值“Book”和“10”。這使得可以使用單個(gè)鏈接或指針結(jié)構(gòu)表示盤上行結(jié)構(gòu)402b中的兩部分446和448的值(對應(yīng)于行102a的列124和126)。類似地,盤上行結(jié)構(gòu)404b(對應(yīng)于行104a)包括單個(gè)鏈接476,其指向由遞歸符號表?xiàng)l目480表示的組合的順序數(shù)據(jù)值“Book”和“10”。這同樣使得可以使用單個(gè)鏈接或指針結(jié)構(gòu)表示盤上行結(jié)構(gòu)404b中的兩部分450和452的值(對應(yīng)于行104a的列124和126)。最終結(jié)果就是,圖4的方法在盤上行結(jié)構(gòu)與符號表之間所需要的鏈接或指針比圖1的方法所需的少。圖4減少鏈接或指針的數(shù)目的方法也可以采用符號表410中的非遞歸組合條目。特別地,可以配置條目480,使得部分482明確地存儲(chǔ)數(shù)據(jù)值“Book”,而不是將其與指向條目434的遞歸鏈接486相關(guān)聯(lián)。也可以配置條目480的部分484以明確地存儲(chǔ)數(shù)據(jù)值“10”,而不是將其與指向條目432的鏈接488相關(guān)聯(lián)。該方法還可以減少盤上行結(jié)構(gòu)與符號表410之間的鏈接數(shù)目,但代價(jià)是可能會(huì)增加在符號表410中明確地存儲(chǔ)重復(fù)數(shù)據(jù)值所需要的盤空間量。符號表410中的條目也可以包括各種遞歸鏈接的組合,和明確存儲(chǔ)的數(shù)據(jù)值。雖然圖4所示的范例只有2個(gè)數(shù)據(jù)值組合為遞歸符號條目480,但是可以擴(kuò)展該發(fā)明概念,以在組合符號表?xiàng)l目中包括任何數(shù)目的數(shù)據(jù)值。在一個(gè)實(shí)施例中,可以進(jìn)行列的重新排序以提高壓縮比。如在最后章節(jié)中所提到的,對于存儲(chǔ)在給定塊中的行,如果存在重復(fù)的列值序列,那么可以通過創(chuàng)建指向符號表中的組合條目的鏈接,來減少符號表與盤上行結(jié)構(gòu)之間的鏈接數(shù)目。可以進(jìn)行列的重新排序,以增加列值的重復(fù)序列的數(shù)目。在一個(gè)實(shí)施例中,可以以數(shù)據(jù)塊的粒度級別進(jìn)行列的重新排序?;蛘撸梢砸云渌6冗M(jìn)行列的重新排序,例如跨多個(gè)塊進(jìn)行。為了示意,考慮圖5中所示的數(shù)據(jù)庫表格600。表格600包括3行數(shù)據(jù),每一行具有“序號”列、“價(jià)格”列、“項(xiàng)目”列、和“數(shù)量”列。行602a具有如下數(shù)據(jù)值序列“1254”、“5”、“Book”和“2”。行604a具有如下數(shù)據(jù)值序列“1255”、“10”、“Tape”和“3”。行606a具有如下數(shù)據(jù)值序列“1256”、“10”、“Movie”和“3”??紤]列沒有重新排序的第一種情況。注意到數(shù)據(jù)值“10”和“3”在這些行中重復(fù)。于是,當(dāng)將該表格寫到盤680時(shí),可以創(chuàng)建符號表650,其具有第一條目652,數(shù)據(jù)值為“10”,第二條目654,數(shù)據(jù)值為“3”。當(dāng)將行602a、604a和606a寫到盤時(shí),與這些重復(fù)數(shù)據(jù)值相關(guān)聯(lián)的這些行的每一盤上行結(jié)構(gòu)被配置成引用符號表650中的適當(dāng)條目。于是對應(yīng)于行604a的盤上行結(jié)構(gòu)604b具有部分641(對應(yīng)于“價(jià)格”列中的數(shù)據(jù)值),其與指向符號表650中數(shù)據(jù)值“10”的條目652的鏈接640相關(guān)聯(lián)。盤上行結(jié)構(gòu)604b也具有部分643(對應(yīng)于“數(shù)量”列中的數(shù)據(jù)值),其與指向符號表650中數(shù)據(jù)值“3”的條目654的鏈接642相關(guān)聯(lián)。對應(yīng)于行606a的盤上行結(jié)構(gòu)606b具有部分645(對應(yīng)于“價(jià)格”列中的數(shù)據(jù)值),其與指向符號表650中數(shù)據(jù)值“10”的條目652的鏈接646相關(guān)聯(lián)。盤上行結(jié)構(gòu)606b也具有部分647(對應(yīng)于“數(shù)量”列中的數(shù)據(jù)值),其與指向符號表650中數(shù)據(jù)值“3”的條目654的鏈接644相關(guān)聯(lián)。因?yàn)樾?02a并不包括任何重復(fù)數(shù)據(jù)值,因此其相關(guān)聯(lián)的盤上行結(jié)構(gòu)602b明確地存儲(chǔ)每一列值,并且不包括到符號表的任何引用??紤]如果對表格600進(jìn)行列的重新排序。對表格中的行執(zhí)行列的重新排序,以增加列值的序列重復(fù)的可能性。在本范例中,通過交換表格600中“項(xiàng)目”列和“數(shù)量”列之間的順序,可以看到在“價(jià)格”列與“數(shù)量”列之間出現(xiàn)了值的序列的重復(fù)。這種列的重新排序的結(jié)果如圖5中的表格620所示。特別地,對于“價(jià)格”和“數(shù)量”列,現(xiàn)在行624a與626a都具有相同序列的數(shù)據(jù)值“10”和“3”。于是,當(dāng)在盤682上創(chuàng)建符號表660時(shí),可以插入組合條目666,其對于行624a和626a,在表格620中所示的序列中直接或間接地包括數(shù)據(jù)值“10”和“3”。如果組合條目666間接地包括這些值,那么條目666包括遞歸地引用條目662的第一部分668,和遞歸地引用條目664的第二部分670。當(dāng)將行624a寫到盤時(shí),其盤上行結(jié)構(gòu)624b與指向序列值“10”和“3”的組合條目666的單個(gè)鏈接632相關(guān)聯(lián)。這與盤上行結(jié)構(gòu)604b所采用的方式相反,后者對于相同的行沒有進(jìn)行列的重新排序,使用兩個(gè)鏈接640和642來引用相同的兩個(gè)數(shù)據(jù)值。同樣的,當(dāng)將行626a寫到盤時(shí),其盤上行結(jié)構(gòu)626b與用于序列值“10”和“3”的單個(gè)鏈接636相關(guān)聯(lián)。這與盤上行結(jié)構(gòu)606b所采用的方式也相反,后者對于相同的行沒有進(jìn)行列的重新排序,使用兩個(gè)鏈接646和644來引用相同的兩個(gè)數(shù)據(jù)值。圖6示出了利用列的重新排序?qū)?shù)據(jù)存儲(chǔ)到盤的過程的實(shí)施例的流程圖。在602接收到將數(shù)據(jù)存儲(chǔ)到盤上的請求。如果壓縮開啟,那么在604就對將要存儲(chǔ)到給定數(shù)據(jù)塊內(nèi)的數(shù)據(jù)部分進(jìn)行數(shù)據(jù)分析以標(biāo)識重復(fù)的數(shù)據(jù)值。該數(shù)據(jù)分析也包括對可能的列的重新排序組合進(jìn)行分析,執(zhí)行其可以用來增加數(shù)據(jù)值的序列重復(fù)的可能性。對是否存在可能有利地通過列的重新排序而獲得的列序列做出判決(606)。如果存在,那么就對適當(dāng)?shù)牧羞M(jìn)行重新排序(608)。根據(jù)所標(biāo)識的數(shù)據(jù)重復(fù),創(chuàng)建包括某些或全部重復(fù)數(shù)據(jù)值的符號表(610)。從而創(chuàng)建了該數(shù)據(jù)庫塊中的每一盤上行結(jié)構(gòu),并且將其格式化以排除重復(fù)數(shù)據(jù)值(612),并將其寫到盤(614)。特別地,與重復(fù)數(shù)據(jù)值相關(guān)聯(lián)的每一盤上行結(jié)構(gòu)被設(shè)置成包括或引用指向符號表中存儲(chǔ)關(guān)系數(shù)據(jù)值的一個(gè)或多個(gè)適當(dāng)條目的鏈接。設(shè)置塊元數(shù)據(jù)以指示該塊中的數(shù)據(jù)、或該塊中的部分?jǐn)?shù)據(jù)是否已經(jīng)被壓縮。另外,也設(shè)置塊元數(shù)據(jù),以指示是否和如何對所存儲(chǔ)的數(shù)據(jù)執(zhí)行列的重新排序。在一個(gè)實(shí)施例中,塊的首部包括指示該塊或該塊中的數(shù)據(jù)是否被壓縮和/或被重新排序過的數(shù)據(jù)結(jié)構(gòu)。當(dāng)從該塊中檢索到數(shù)據(jù)的時(shí)候,訪問該首部信息以能夠?qū)υ摂?shù)據(jù)重新排序,和未壓縮地回到其原始形式。可以進(jìn)行優(yōu)化,從存儲(chǔ)行的盤上版本中除去NULL尾值。數(shù)據(jù)庫表格中的行可以在行的末尾處的一列或多列中包括NULL值。當(dāng)將這些行寫到盤時(shí),通過對于這些NULL值不分配、或不寫任何空間到盤中,可以實(shí)現(xiàn)附加的壓縮。相反,設(shè)置該存儲(chǔ)系統(tǒng)以識別如果特定數(shù)據(jù)庫行的盤上版本在該行的末尾并不包括列的一個(gè)或多個(gè)存儲(chǔ)值,那么這些列值被假定為NULL值。為了示意起見,考慮圖7的表格700,其將被存儲(chǔ)到盤720上的塊722。注意到,行702a和706a在行的最后一列都具有NULL值。當(dāng)將這些行寫到盤720時(shí),這些行的盤上行結(jié)構(gòu)被配置成排除NULL尾值。對應(yīng)于行702a的盤上行結(jié)構(gòu)702b并不包含為“首選”列中的NULL尾值分配的空間。相反,其只包括為出現(xiàn)在行702a中前導(dǎo)值“1260”、“Tom”和“10”分配的空間。對應(yīng)于行706a的盤上行結(jié)構(gòu)706b并不包含為NULL尾值分配的空間。相反,其只包括為出現(xiàn)在行706a中前導(dǎo)值“1262”、“Harry”和“30”分配的空間??梢詧?zhí)行列的重新排序,以增加NULL尾值在要存儲(chǔ)到盤的行中出現(xiàn)的可能性。分析一組數(shù)據(jù)的列值,以根據(jù)每一列中NULL值的數(shù)目對該列分類。重新排序該列,使得具有較多NULL值的列排在行的末尾,而具有越少NULL值的列排在越靠近行的開始。于是,具有最多NULL值的列會(huì)被重新排序到表格的末尾。具有其次多NULL值的列會(huì)被重新排序到表格的次尾,按照這樣的順序繼續(xù),直至得到有效排序的列。為了示意如果不進(jìn)行列的重新排序可能會(huì)出現(xiàn)的效率低下,參照圖8中的表格800。表格800包括要被寫到盤的一組行802a、804a和806a。每一行包括一個(gè)或多個(gè)NULL值。行802a和806a在“樣式”列和“首選”列中包括NULL值。行804a在“樣式”列中包括NULL值。由于這些行中的NULL值都不是結(jié)尾的NULL,當(dāng)將這些行寫到盤時(shí),由于NULL值可能會(huì)在每一對應(yīng)的盤上行結(jié)構(gòu)中浪費(fèi)空間。如圖所示,對應(yīng)于行802a的盤上行結(jié)構(gòu)802b包括兩個(gè)空間810和812,其分配給對應(yīng)于行802a的“樣式”和“首選”列中的值的NULL值。對應(yīng)于行804a的盤上行結(jié)構(gòu)804b包括空間814,其分配給對應(yīng)于行804a的“樣式”列中的值的NULL值。對應(yīng)于行806a的盤上行結(jié)構(gòu)806b包括兩個(gè)空間816和818,其分配給對應(yīng)于行806a的“樣式”和“首選”列中的值的NULL值??梢詧?zhí)行列的重新排序,以增加將表格800存儲(chǔ)到盤的壓縮效率。第一步是將列分類,以標(biāo)識具有較多NULL值的特定列。這里可以看到,表格800中的“樣式”列具有最多的NULL值(每一行都是NULL值)?!笆走x”列具有其次多的NULL值(行802a和806a中是NULL值)。其它列都不包括NULL值。對這些列進(jìn)行重新排序,將具有越多NULL值的列放在越靠近行的末尾。表格900示意了對表格800執(zhí)行該操作得到的結(jié)果。特別地,重新排序這些列,使得具有最多NULL值的“樣式”列放置在行的末尾。具有其次多NULL值的“首選”列放置在列序列中的次尾。由于其它列都不包含NULL值,它們都不重新排序。這種類型的重新排序使表格中的NULL尾值數(shù)量最多?,F(xiàn)在,分別對應(yīng)于表格800中行802a和806a的行902a和906a都包括兩個(gè)NULL尾值。行802a和806a都不包含任何NULL尾值。表格900中的行904a對應(yīng)于表格800中的行804a,其包括一個(gè)NULL尾值。行804a并不包含任何NULL尾值。當(dāng)將表格900中的行902a、904a和906a寫到盤時(shí),可以從每一行的盤上版本中去除NULL尾值。于是,對應(yīng)于表格900中的行902a的盤上行結(jié)構(gòu)902b排除了“首選”和“樣式”列的NULL值。盤上行結(jié)構(gòu)902b只包括3個(gè)字段,用于分別存儲(chǔ)“序號”、“客戶”和“價(jià)格”列的數(shù)據(jù)值“1270”、“Tom”和“5”。相反,盤上行結(jié)構(gòu)802b等同于在進(jìn)行列的重新排序之前,其包括5個(gè)字段,用于分別存儲(chǔ)“序號”、“客戶”、“樣式”、“首選”和“價(jià)格”列的數(shù)據(jù)值“1270”、“Tom”、“NULL”、“NULL”和“5”。盤上行結(jié)構(gòu)904b對應(yīng)于表格900中的行904a,其排除了“樣式”列的NULL值。盤上行結(jié)構(gòu)904b只包括4個(gè)字段,用于分別存儲(chǔ)“序號”、“客戶”、“價(jià)格”和“首選”列的數(shù)據(jù)值“1271”、“Dick”、“10”和“GroundShip”。相反,盤上行結(jié)構(gòu)804b等同于在進(jìn)行列的重新排序之前,其包括5個(gè)字段,用于分別存儲(chǔ)“序號”、“客戶”、“樣式”、“首選”和“價(jià)格”列的數(shù)據(jù)值“1271”、“Dick”、“NULL”、“GroundShip”和“10”。類似于盤上行結(jié)構(gòu)902b,對應(yīng)于表格900中的行906a的盤上行結(jié)構(gòu)906b排除了“首選”和“樣式”列的NULL值。盤上行結(jié)構(gòu)906b只包括3個(gè)字段,用于分別存儲(chǔ)“序號”、“客戶”和“價(jià)格”列的數(shù)據(jù)值。相反,盤上行結(jié)構(gòu)806b等同于在進(jìn)行列的重新排序之前,其包括5個(gè)字段,用于分別存儲(chǔ)“序號”、“客戶”、“樣式”、“首選”和“價(jià)格”列的數(shù)據(jù)值。圖10中所示是提高數(shù)據(jù)庫查詢語言語句性能的方法。在1002,保持有描述數(shù)據(jù)塊中數(shù)據(jù)重復(fù)的信息。如前所述,有幾個(gè)方法可以保持?jǐn)?shù)據(jù)重復(fù)信息,例如使用符號表。為了保持該數(shù)據(jù)重復(fù)信息,并不需要壓縮數(shù)據(jù)塊內(nèi)的數(shù)據(jù)。在1004,對于數(shù)據(jù)塊中的數(shù)據(jù)接收帶有至少一個(gè)謂詞的數(shù)據(jù)庫查詢語言語句。使用該數(shù)據(jù)重復(fù)信息降低謂詞評估的數(shù)目(1006)。通過減少謂詞評估的數(shù)目,就提高了數(shù)據(jù)庫查詢語言語句的性能。圖11中所示為一種保持?jǐn)?shù)據(jù)重復(fù)信息的方法。標(biāo)識一個(gè)或多個(gè)重復(fù)數(shù)據(jù)值(1102),并計(jì)算每一重復(fù)數(shù)據(jù)值出現(xiàn)的次數(shù)(1104)。在符號結(jié)構(gòu)的條目中存儲(chǔ)每一重復(fù)數(shù)據(jù)值及其相應(yīng)的出現(xiàn)次數(shù)(1106)。從數(shù)據(jù)塊中去除或刪除至少一個(gè)重復(fù)數(shù)據(jù)值的一次或多次出現(xiàn)(1108)。對應(yīng)于所去除的出現(xiàn)的數(shù)據(jù)塊部分被配置成引用適當(dāng)?shù)姆柦Y(jié)構(gòu)條目(1110)。可以使用鏈接或指針來引用該適當(dāng)?shù)姆柦Y(jié)構(gòu)條目。圖12中描繪了維持?jǐn)?shù)據(jù)重復(fù)信息的范例。盤1202上的數(shù)據(jù)塊1204包含4個(gè)盤上行結(jié)構(gòu)1206-1212。每一盤上行結(jié)構(gòu)對應(yīng)于表格中的一行(未示出)。在數(shù)據(jù)塊1204中標(biāo)識兩個(gè)重復(fù)數(shù)據(jù)值“HR”和“LA”,并將其連同每一重復(fù)數(shù)據(jù)值出現(xiàn)的次數(shù)一起存儲(chǔ)在符號結(jié)構(gòu)1214中。在實(shí)施例中,符號結(jié)構(gòu)1214連同行結(jié)構(gòu)1206-1212一起存儲(chǔ)在數(shù)據(jù)塊1204中。數(shù)據(jù)值“HR”出現(xiàn)兩次一次在行結(jié)構(gòu)1206的部分1216中,一次在行結(jié)構(gòu)1208的部分1220中。數(shù)據(jù)值“LA”出現(xiàn)三次一次在行結(jié)構(gòu)1206的部分1218中,一次在行結(jié)構(gòu)1210的部分1222中,還有一次在行結(jié)構(gòu)1212的部分1224中。如圖12中所示,刪除數(shù)據(jù)塊1204中的重復(fù)數(shù)據(jù)值,并且部分1216-1224被配置成引用符號結(jié)構(gòu)1214中的適當(dāng)條目。圖13示意了保持?jǐn)?shù)據(jù)重復(fù)信息的另一個(gè)方法。在1302,標(biāo)識一個(gè)或多個(gè)重復(fù)數(shù)據(jù)值。計(jì)算每一重復(fù)數(shù)據(jù)值出現(xiàn)的次數(shù)(1304)。在符號結(jié)構(gòu)的條目中存儲(chǔ)每一重復(fù)數(shù)據(jù)值及其相應(yīng)的出現(xiàn)次數(shù)(1306)。當(dāng)添加或刪除一個(gè)重復(fù)數(shù)據(jù)值的出現(xiàn)時(shí),更新該重復(fù)數(shù)據(jù)值出現(xiàn)的次數(shù)(1308)。當(dāng)該符號結(jié)構(gòu)條目中重復(fù)數(shù)據(jù)值的出現(xiàn)次數(shù)為零時(shí),去除該符號結(jié)構(gòu)條目(1310)。在圖14中,關(guān)于盤1402上的數(shù)據(jù)塊1404的數(shù)據(jù)重復(fù)的信息保持在符號結(jié)構(gòu)1406中。在范例中,盤上行結(jié)構(gòu)1416的部分1418從數(shù)據(jù)值“LA”更新為數(shù)據(jù)值“SF”。相應(yīng)的,符號結(jié)構(gòu)1406中的條目1420對應(yīng)于重復(fù)數(shù)據(jù)值“LA”,將其更新以反映出將數(shù)據(jù)值“LA”從數(shù)據(jù)塊1404中刪除。圖15中所示的實(shí)施例為提高數(shù)據(jù)庫查詢語言語句性能的方法。在1502,保持?jǐn)?shù)據(jù)重復(fù)的信息。接收數(shù)據(jù)庫查詢語言語句(1504)。該數(shù)據(jù)庫查詢語言語句包括至少一個(gè)謂詞。在重復(fù)數(shù)據(jù)值上至多對謂詞進(jìn)行一次評估(1506)。圖16示意的處理流程是提高數(shù)據(jù)庫查詢語言語句性能的另一個(gè)方法。在該實(shí)施例中,保持?jǐn)?shù)據(jù)重復(fù)信息(1602)。接收帶有至少一個(gè)謂詞的數(shù)據(jù)庫查詢語言語句(1604),并訪問數(shù)據(jù)值(1606)。在該數(shù)據(jù)值上評估該至少一個(gè)謂詞之前,判定以前是否已經(jīng)在該數(shù)據(jù)值的重復(fù)上評估過該謂詞(1608)。如果以前還沒有在該數(shù)據(jù)值的重復(fù)上評估過該謂詞,就在該數(shù)據(jù)值上評估該謂詞(1610)。如果以前已經(jīng)在該數(shù)據(jù)值的重復(fù)上評估過該謂詞,就使用先前謂詞評估的結(jié)果,而不是在該同一數(shù)據(jù)值上評估該謂詞(1612)。圖17中所示的范例為如何可以提高數(shù)據(jù)庫查詢語言語句的性能。針對表格1704中的數(shù)據(jù)接收數(shù)據(jù)庫查詢語言語句1702。數(shù)據(jù)庫查詢語言語句1702搜索以查找表格1704中滿足謂詞1706的所有記錄,即數(shù)據(jù)庫查詢語言語句1702搜索以查找表格1704中在列1708中具有數(shù)據(jù)值“LA”的所有記錄。首先訪問行1710。由于還沒有任何先前的謂詞評估,在行1710中的數(shù)據(jù)值1718上評估謂詞1706。將謂詞評估的結(jié)果存儲(chǔ)在上下文1726中。由于該謂詞評估的結(jié)果是真,返回行1710。然后訪問行1712。在行1712中的數(shù)據(jù)值1720上評估謂詞1706之前,判定以前是否已經(jīng)在該數(shù)據(jù)值1720的重復(fù)上評估過謂詞1706。在一個(gè)實(shí)施例中,檢查上下文1726,以確定是否存在數(shù)據(jù)值1720的重復(fù)——數(shù)據(jù)值“DC”的先前謂詞評估結(jié)果。由于謂詞1706先前被評估所基于的僅有數(shù)據(jù)值是“LA”,所以在數(shù)據(jù)值1720上評估謂詞1706。將謂詞評估的結(jié)果存儲(chǔ)在上下文1726中。由于該謂詞評估的結(jié)果是假,不返回行1712。接著訪問行1714。在行1714中的數(shù)據(jù)值1722上評估謂詞1706之前,判定以前是否已經(jīng)在數(shù)據(jù)值1722的重復(fù)上評估過謂詞1706。由于上下文1726包括對數(shù)據(jù)值“LA”的先前謂詞評估結(jié)果,其是數(shù)據(jù)值1722的重復(fù),所以不在數(shù)據(jù)值1722上評估謂詞1706。相反,使用上下文1726中的先前謂詞評估結(jié)果。由于謂詞評估的結(jié)果是真,返回行1714。以類似的方式訪問和處理行1716。這樣,由于只是在2個(gè)數(shù)據(jù)值上、而不是在4個(gè)數(shù)據(jù)值上評估謂詞1706,提高了數(shù)據(jù)庫查詢語言語句的性能。圖18中所述是根據(jù)本發(fā)明的一個(gè)實(shí)施例,提高數(shù)據(jù)庫查詢語言語句的性能的方法。保持?jǐn)?shù)據(jù)塊中數(shù)據(jù)重復(fù)的信息(1802)。在1804,接收帶有至少一個(gè)謂詞的數(shù)據(jù)庫查詢語言語句。使用該數(shù)據(jù)重復(fù)信息,減少謂詞評估的次數(shù)(1806)和被數(shù)據(jù)庫查詢語言語句訪問的數(shù)據(jù)量(1808)。圖19說明了一種減少被數(shù)據(jù)庫查詢語言語句訪問的數(shù)據(jù)量的方法。在1902計(jì)算該謂詞評估為真所基于的數(shù)據(jù)值的總數(shù)。然后在1904設(shè)置計(jì)數(shù)器等于所計(jì)算的該總數(shù)。訪問數(shù)據(jù)值(1906),并且在該數(shù)據(jù)值上評估該謂詞(1908)。如果謂詞評估的結(jié)果是假,那么該過程返回,并在1906訪問另一個(gè)數(shù)據(jù)值。如果謂詞評估的結(jié)果是真,那么該計(jì)數(shù)器減1(1910)。在1912,判定計(jì)數(shù)器現(xiàn)在是否等于零。如果該計(jì)數(shù)器不等于零,那么該過程返回到1906,并訪問另一個(gè)數(shù)據(jù)值。如果該計(jì)數(shù)器等于零,那么該過程就結(jié)束。在圖20中所示為如何使用數(shù)據(jù)重復(fù)信息來提高數(shù)據(jù)庫查詢語言語句的性能的范例。在圖20中,針對表格2004中的數(shù)據(jù)接收到數(shù)據(jù)庫查詢語言語句2002,將其存儲(chǔ)在數(shù)據(jù)塊2006中。數(shù)據(jù)庫查詢語言語句2002搜索以查找并返回表格2004的所有行,表格2004在“辦公室”列2016中包括數(shù)據(jù)值“LA”。表格2004包括10行4列——“ID”列2010、“姓名”列2012、“部門”列2014和“辦公室”列2016。在“ID”列2010和“姓名”列2012中都沒有重復(fù)數(shù)據(jù)值。“部門”列2014和“辦公室”列2016分別具有3個(gè)重復(fù)數(shù)據(jù)值。在圖20的實(shí)施例中,數(shù)據(jù)重復(fù)信息存儲(chǔ)在符號表2008中。符號表2008包括表格2004中每一重復(fù)數(shù)據(jù)值的拷貝,以及該重復(fù)數(shù)據(jù)值出現(xiàn)的對應(yīng)次數(shù)。符號表2008中的每一條目也包括條目編號,其可以在數(shù)據(jù)塊2006中用來引用符號表?xiàng)l目。如圖20中所述,使用對應(yīng)的符號表?xiàng)l目編號、而不是指向?qū)?yīng)符號表?xiàng)l目的指針或鏈接代替重復(fù)數(shù)據(jù)值在數(shù)據(jù)塊2006中的每次出現(xiàn)。為了評估數(shù)據(jù)庫查詢語言語句2002,訪問數(shù)據(jù)塊2006中的行結(jié)構(gòu)2018b,其對應(yīng)于表格2004中的行2018a。行結(jié)構(gòu)2018b的部分2020對應(yīng)于行2018a的列2016,由于其飲用符號表2008中的條目編號#3,所以從符號表2008中檢索重復(fù)數(shù)據(jù)值“LA”,并針對數(shù)據(jù)庫查詢語言語句2002中的謂詞進(jìn)行評估。將謂詞評估的結(jié)果存儲(chǔ)在上下文2024中。然后將計(jì)數(shù)器2026設(shè)置為“3”,其等于重復(fù)數(shù)據(jù)值“LA”在表格2004中出現(xiàn)的次數(shù),由于“LA”是其中謂詞評估為真的僅有數(shù)據(jù)值。然后返回表格2004的行2018a,并且計(jì)數(shù)器2026減1。當(dāng)計(jì)數(shù)器2026變?yōu)榱銜r(shí),數(shù)據(jù)塊2006的順序行訪問可以結(jié)束,因?yàn)橐呀?jīng)返回了滿足該數(shù)據(jù)庫查詢語言語句的最大數(shù)目的行。接著訪問數(shù)據(jù)塊2006中的行結(jié)構(gòu)2028b,其對應(yīng)于表格2004中的行2028a。行結(jié)構(gòu)2028b的部分2030對應(yīng)于行2028a的列2016,其引用符號表2008中的條目編號#4。在從符號表2008中檢索重復(fù)數(shù)據(jù)值“DC”,并針對數(shù)據(jù)庫查詢語言語句2002中的謂詞進(jìn)行評估之前,檢查上下文2024,以確定是否存在條目編號#4的先前謂詞評估結(jié)果。由于上下文2024并不包含條目編號#4的先前謂詞評估結(jié)果,所以從符號表2008中檢索重復(fù)數(shù)據(jù)值“DC”,并針對數(shù)據(jù)庫查詢語言語句2002中的謂詞進(jìn)行評估。然后將謂詞評估的結(jié)果存儲(chǔ)在上下文2024中。因?yàn)橹^詞評估的結(jié)果是假,所以不返回行2028a,并且計(jì)數(shù)器2026不減小。訪問數(shù)據(jù)塊2006中的行結(jié)構(gòu)2032b,其對應(yīng)于表格2004中的行2032a。行結(jié)構(gòu)2032b的部分2034對應(yīng)于行2032a的列2016,其引用符號表2008中的條目編號#3。由于上下文2024已經(jīng)包含條目編號#3的先前謂詞評估結(jié)果,所以并不需要再次評估該謂詞。假定條目編號#3的先前謂詞評估結(jié)果是真,那么返回行2032a,并且計(jì)數(shù)器2026減1。訪問數(shù)據(jù)塊2006中的行結(jié)構(gòu)2036b,其對應(yīng)于表格2004中的行2036a。類似于行結(jié)構(gòu)2032b的部分2034,行結(jié)構(gòu)2036b的部分2038對應(yīng)于行2036a的列2016,其引用符號表2008中的條目編號#3。由于上下文2024已經(jīng)包含條目編號#3的先前謂詞評估結(jié)果,所以并不需要再次評估該謂詞。假定條目編號#3的先前謂詞評估結(jié)果是真,那么返回行2036a,并且計(jì)數(shù)器2026減1。然后結(jié)束數(shù)據(jù)塊2006的順序行訪問,因?yàn)樗袧M足數(shù)據(jù)庫查詢語言語句2002的行都已經(jīng)返回。在圖20中所示的范例中,不僅謂詞評估的次數(shù)從4減為2,而且所訪問的行數(shù)也從10減少到4,其是使用數(shù)據(jù)重復(fù)信息的結(jié)果。于是,通過保持?jǐn)?shù)據(jù)塊內(nèi)數(shù)據(jù)重復(fù)的信息可以大大地提高數(shù)據(jù)庫查詢語言語句的性能。由于在圖20中只有唯一一個(gè)數(shù)據(jù)值可以滿足數(shù)據(jù)庫查詢語言語句的謂詞,通過簡單地查看符號表2008,就可以計(jì)算該數(shù)據(jù)塊中謂詞評估為真所基于的數(shù)據(jù)值的總數(shù)。當(dāng)不止唯一一個(gè)數(shù)據(jù)值滿足數(shù)據(jù)庫查詢語言語句的謂詞時(shí),通過累加數(shù)據(jù)塊中滿足該謂詞的每一唯一數(shù)據(jù)值出現(xiàn)的次數(shù),計(jì)算該數(shù)據(jù)塊中謂詞評估為真所基于的數(shù)據(jù)值的總數(shù)。例如,如果3個(gè)不同的唯一數(shù)據(jù)值X、Y和Z滿足該謂詞,并且X在數(shù)據(jù)塊中出現(xiàn)5次,Y在數(shù)據(jù)塊中出現(xiàn)8次,Z在數(shù)據(jù)塊中出現(xiàn)3次,那么數(shù)據(jù)塊中謂詞評估為真所基于的數(shù)據(jù)值的總數(shù)等于5加8加3,等于16。因此,圖20中的計(jì)數(shù)器2026設(shè)置為16,并且每次返回滿足的數(shù)據(jù)時(shí)減1。所以,可以顯著地減少滿足數(shù)據(jù)庫查詢語言語句所訪問的數(shù)據(jù)量。圖21所述的處理流程是提高數(shù)據(jù)庫查詢語言語句性能的另一個(gè)方法。保持?jǐn)?shù)據(jù)塊中數(shù)據(jù)重復(fù)的信息(2102)。在2104,接收帶有至少一個(gè)謂詞的數(shù)據(jù)庫查詢語言語句。使用該數(shù)據(jù)重復(fù)信息減少謂詞評估的次數(shù)(2106)。另外,不是訪問數(shù)據(jù)值來滿足該數(shù)據(jù)庫查詢語言語句,而是更新該數(shù)據(jù)重復(fù)信息(2108)。圖22中所示的范例為如何可以通過更新數(shù)據(jù)重復(fù)信息、而不是通過訪問數(shù)據(jù)值來滿足數(shù)據(jù)庫查詢語言語句。針對表格2204接收數(shù)據(jù)庫查詢語言語句2202,其存儲(chǔ)在盤2208的數(shù)據(jù)塊2206中。數(shù)據(jù)庫查詢語言語句2202進(jìn)行查找,以將表格2004的“辦公室”列中的數(shù)據(jù)值“LA”從“LA”改變?yōu)椤癝F”。由于在符號結(jié)構(gòu)2212中已經(jīng)保持有數(shù)據(jù)重復(fù)信息,如上關(guān)于圖12的描述,所以只有符號結(jié)構(gòu)2212中的條目2214需要從“LA”更新為“SF”以滿足數(shù)據(jù)庫查詢語言語句2202。這樣,當(dāng)使用數(shù)據(jù)重復(fù)信息時(shí),數(shù)據(jù)庫查詢語言語句的性能大大地提高了。系統(tǒng)體系結(jié)構(gòu)概述在圖23的方框圖所描述的計(jì)算機(jī)系統(tǒng)2300上可以實(shí)施本發(fā)明提高數(shù)據(jù)庫查詢語言語句的方法。計(jì)算機(jī)系統(tǒng)2300包括總線2302、或其它用于傳遞信息的通信機(jī)制,和與總線2302耦合用于處理信息的處理器2304。計(jì)算機(jī)系統(tǒng)2300也包括主存儲(chǔ)器2306,諸如隨機(jī)訪問存儲(chǔ)器(RAM)或其它動(dòng)態(tài)存儲(chǔ)器件,其與總線2302耦合,用于存儲(chǔ)信息和由處理器2304執(zhí)行的指令。主存儲(chǔ)器2306在處理器2304執(zhí)行指令期間也可以用于存儲(chǔ)臨時(shí)變量或其它中間信息。計(jì)算機(jī)系統(tǒng)2300進(jìn)一步包括與總線2302耦合的只讀存儲(chǔ)器(ROM)2308或其它靜態(tài)存儲(chǔ)器件,用于存儲(chǔ)靜態(tài)信息和處理器2304的指令。提供有存儲(chǔ)器件2310、諸如磁盤或光盤,并且其與總線2302耦合用于存儲(chǔ)信息和指令。計(jì)算機(jī)系統(tǒng)2300也可以通過總線2302與顯示器2312、諸如陰極射線管(CRT)耦合,用于向計(jì)算機(jī)用戶顯示信息。輸入設(shè)備2314、包括字母數(shù)字和其它鍵,與總線2302耦合,用于向處理器2304傳遞信息和命令選擇。另一種類型的用戶輸入設(shè)備是光標(biāo)控制2316,諸如鼠標(biāo)、軌跡球、光標(biāo)方向鍵,用于向處理器2304傳遞方向信息和命令選擇,以及用于控制顯示器2312上的光標(biāo)移動(dòng)。該輸入設(shè)備典型地具有兩個(gè)軸向上的自由度,第一軸(例如x)和第二軸(例如y),可以讓該設(shè)備指定平面中的位置。在一個(gè)實(shí)施例中,計(jì)算機(jī)系統(tǒng)2300用來提高數(shù)據(jù)庫查詢語言語句的性能。根據(jù)一個(gè)實(shí)施例,通過計(jì)算機(jī)系統(tǒng)2300響應(yīng)于處理器2304,執(zhí)行包含在主存儲(chǔ)器2306中的一個(gè)或多個(gè)指令的一個(gè)或多個(gè)序列而提供這種用途。這種指令可以從另一個(gè)計(jì)算機(jī)可讀介質(zhì)、諸如存儲(chǔ)器件2310讀入到主存儲(chǔ)器2306中。對包含在主存儲(chǔ)器2306中的指令序列的執(zhí)行使得處理器2304執(zhí)行此處所描述的處理步驟。在多處理設(shè)備中也可以采用一個(gè)或多個(gè)處理器來執(zhí)行包含在主存儲(chǔ)器2306中的指令序列。在其它實(shí)施例中,可以使用硬線電路來代替軟件指令、或與其結(jié)合使用。于是,本發(fā)明的實(shí)施例并不局限于硬件電路與軟件的任何具體組合。此處所使用的詞語“計(jì)算機(jī)可讀介質(zhì)”指的是在用于向處理器2304提供執(zhí)行指令的任何介質(zhì)。這種介質(zhì)可以是多種形式,包括但并不限于非易失性介質(zhì)、易失性介質(zhì)、和傳輸介質(zhì)。非易失性介質(zhì)例如包括光盤或磁盤,諸如存儲(chǔ)器件2310。易失性介質(zhì)包括動(dòng)態(tài)存儲(chǔ)器、諸如主存儲(chǔ)器2306。傳輸介質(zhì)包括同軸電纜、銅線和纖維光學(xué)、以及包括總線2302的線。傳輸介質(zhì)也可以是聲波或光波的形式,諸如在無線電波和紅外數(shù)據(jù)通信中所產(chǎn)生的。普通形式的計(jì)算機(jī)可讀介質(zhì)例如包括軟盤、軟磁盤、硬盤、磁帶、或任何其它磁介質(zhì)、CD-ROM、任何其它光介質(zhì)、穿孔卡、紙帶、帶有孔圖案的任何其它物理介質(zhì)、RAM、PROM和EPROM、FLASH-EPROM、任何其它存儲(chǔ)芯片或磁帶、如此后所描述的載波、或計(jì)算機(jī)可讀取的任何其它介質(zhì)??梢允褂酶鞣N形式的計(jì)算機(jī)可讀介質(zhì)攜帶處理器2304執(zhí)行的一個(gè)或多個(gè)指令的一個(gè)或多個(gè)序列。例如,指令初始可以攜帶在遠(yuǎn)程計(jì)算機(jī)的磁盤上。該遠(yuǎn)程計(jì)算機(jī)可以將指令裝載到其動(dòng)態(tài)存儲(chǔ)器中,并使用調(diào)制解調(diào)器在電話線上發(fā)送指令。位于計(jì)算機(jī)系統(tǒng)2300中的調(diào)制解調(diào)器可以接收電話線上的數(shù)據(jù),并使用紅外發(fā)射器將該數(shù)據(jù)轉(zhuǎn)換為紅外信號。與總線2302耦合的紅外檢測器可以接收紅外信號中攜帶的數(shù)據(jù),并將該數(shù)據(jù)放置在總線2302上??偩€2302將該數(shù)據(jù)傳送給主存儲(chǔ)器2306,處理器2304從其中檢索并執(zhí)行該指令。由主存儲(chǔ)器2306接收到的指令可以在被處理器2304執(zhí)行之前或之后,可選的存儲(chǔ)在存儲(chǔ)器件2310中。計(jì)算機(jī)系統(tǒng)2300也包括與總線2302耦合的通信接口2318。通信接口2318提供與網(wǎng)絡(luò)鏈路2320耦合的雙向數(shù)據(jù)通信,該鏈路與本地網(wǎng)絡(luò)2322連接。例如,通信接口2318可以是綜合業(yè)務(wù)數(shù)字網(wǎng)(ISDN)卡或調(diào)制解調(diào)器,提供到對應(yīng)類型電話線的數(shù)據(jù)通信連接。作為另一個(gè)范例,通信接口2318可以是提供到兼容LAN的數(shù)據(jù)通信連接的局域網(wǎng)(LAN)卡。也可以通過無線鏈路實(shí)施。在任何這種實(shí)施方式中,通信接口2318發(fā)送和接收電子、電磁或光學(xué)信號,其攜帶表示各種類型的信息的數(shù)字?jǐn)?shù)據(jù)流。網(wǎng)絡(luò)鏈路2320典型地提供通過一個(gè)或多個(gè)網(wǎng)絡(luò)到其它設(shè)備的數(shù)據(jù)通信。網(wǎng)絡(luò)鏈路2320例如可以提供通過網(wǎng)絡(luò)2322到主計(jì)算機(jī)2324、或者到由互聯(lián)網(wǎng)服務(wù)提供商(ISP)2326操作的數(shù)據(jù)設(shè)備的連接。ISP2326最終提供通過全球網(wǎng)包數(shù)據(jù)通信網(wǎng)絡(luò)、現(xiàn)在一般稱為“互聯(lián)網(wǎng)”的2328的數(shù)據(jù)通信業(yè)務(wù)。本地網(wǎng)絡(luò)2322和互聯(lián)網(wǎng)2328都使用攜帶數(shù)字?jǐn)?shù)據(jù)流的電子、電磁或光學(xué)信號。通過各種網(wǎng)絡(luò)的信號和網(wǎng)絡(luò)鏈路2320上并通過通信接口2318的信號將數(shù)字?jǐn)?shù)據(jù)攜帶至計(jì)算機(jī)系統(tǒng)2300、或從其帶走,它們都是范例形式的傳輸信息的載波。計(jì)算機(jī)系統(tǒng)2300可以通過網(wǎng)絡(luò)鏈路2320和通信接口2318發(fā)送和接收數(shù)據(jù),包括程序編碼。在互聯(lián)網(wǎng)的范例中,服務(wù)器2330可以通過互聯(lián)網(wǎng)2328、ISP2326、本地網(wǎng)絡(luò)2322和通信接口2318傳送應(yīng)用程序的請求編碼。根據(jù)本發(fā)明,這樣下載的一個(gè)應(yīng)用可以管理、存儲(chǔ)和從包含多個(gè)數(shù)據(jù)存儲(chǔ)器件的存儲(chǔ)系統(tǒng)中檢索數(shù)據(jù)。當(dāng)接收到編碼時(shí),其可以通過處理器2304執(zhí)行,和/或存儲(chǔ)到存儲(chǔ)器件2310、或其它非易失性存儲(chǔ)器中,用于以后執(zhí)行。通過這種方式,計(jì)算機(jī)系統(tǒng)2300可以獲得載波形式的應(yīng)用編碼。說明性實(shí)施例下面提供本發(fā)明實(shí)施例的詳細(xì)實(shí)施方式。在該實(shí)施例中,采用允許各種數(shù)據(jù)壓縮方式的塊數(shù)據(jù)格式。該數(shù)據(jù)塊格式可以用作現(xiàn)存系統(tǒng)的現(xiàn)存塊格式的擴(kuò)展。該數(shù)據(jù)塊格式定義了如何將行片段存儲(chǔ)在數(shù)據(jù)塊中。塊的首部包括用于指示在特定塊中是否使用了任何或全部下面特征的字段塊級壓縮塊級列的重新排序行內(nèi)游程長度的NULL壓縮列的重新排序如果設(shè)置了列的重新排序的指示符,那么該塊使用塊級列的重新排序。如果N列分別具有一組行片段,那么對列編號進(jìn)行塊級列的置換就可以對列重新排序。如果塊使用了列的重新排序,那么可以在塊的首部之后直接存儲(chǔ)兩個(gè)數(shù)組。第一數(shù)組存儲(chǔ)前導(dǎo)列的長度(fixed_width_column_count)。在本實(shí)施例中,塊中首先滿足fixed_width_column_count>=0的列是該塊中固定長度的列。在該實(shí)施例中,值fixed_width_column_count可以為零。第二數(shù)組存儲(chǔ)塊的列編號置換(ub1Perms[block-level_column_count])。列的重新排序至少有兩個(gè)優(yōu)點(diǎn)。第一,通過將適當(dāng)?shù)牧蟹纸M在一起,列的重新排序可以產(chǎn)生更高的壓縮。第二,通過將固定長度的列移動(dòng)到可變長度的列前面,列的重新排序提高了對第N列的訪問。如果第一組列在塊中具有固定的長度,可以將這些長度一次存儲(chǔ)在該塊中,而不是存儲(chǔ)在每一行中。這些長度可以存儲(chǔ)在長度數(shù)組中。這些數(shù)組可以被看作用于空間計(jì)算的塊首部的一部分。對列進(jìn)行重新排序的另一個(gè)優(yōu)點(diǎn)就是,如果列在塊的所有行中都是NULL,那么可以有效地將其從所有行片段中“壓縮出”,因?yàn)镹ULL列并沒有任何數(shù)據(jù),并且將其長度存儲(chǔ)在該長度數(shù)組中。將塊級固定列的長度從行片段移動(dòng)到塊級數(shù)組可以提供相對便宜的壓縮,如果列值較短這樣就特別有效,這種情況出現(xiàn)在數(shù)據(jù)是較高的數(shù)字的時(shí)候。在一個(gè)實(shí)施例中,對列進(jìn)行重新排序后的行應(yīng)該具有相等的列數(shù),并且對應(yīng)的列應(yīng)該具有相等的長度。然而,并不是在所有的實(shí)施例中,給定塊中的所有行片段都必須具有這些屬性,因?yàn)樵谶@種情況下,破壞這種要求的插入(Insert)和更新(Update)操作可能變得效率不高。因此在可選實(shí)施例中,在并不滿足重新排序要求的、對列重新排序后的塊中允許有行片段。對于對列重新排序后的塊,不對這些行片段的列進(jìn)行重新排序。如果塊被重新排序并且壓縮,那么這些行片段要進(jìn)行壓縮。因此,允許有只是部分滿足固定長度要求的行。列重新排序后的塊中的每一行與指定的字段關(guān)聯(lián),該字段標(biāo)識該行中有多少前導(dǎo)列的長度符合塊級列長度數(shù)組參數(shù)。在一個(gè)實(shí)施例中,并不對轉(zhuǎn)發(fā)的行片段和刪除的行片段的列進(jìn)行重新排序。也不對明確排除在列的重新排序之外的行片段的列進(jìn)行重新排序。新數(shù)據(jù)層報(bào)頭的可變化部分包括存儲(chǔ)在perms數(shù)組中的置換和存儲(chǔ)在lens數(shù)組中的固定寬度列的長度。對于N列的塊中具有M個(gè)固定長度的列的行,變化部分占sizeof(ub1)×N+sizeof(ub2)×M個(gè)字節(jié)。假定sizeof(ub1)×N+sizeof(ub2)×M-3×N所占的空間(參考VARSPACE(M,N))不超過3×N。通過不存儲(chǔ)行片段內(nèi)固定寬度列的長度,每行至少可以節(jié)省M字節(jié)。對于具有K列被重新排序過的塊中的行,至少可以節(jié)省(M-1)×K字節(jié)(因?yàn)樵趗b1中有每行片段的固定長度列的計(jì)數(shù),所以是M-1)。在實(shí)施例中,平衡點(diǎn)是在K=5的時(shí)候,對于K>5就會(huì)開始有節(jié)省。在一個(gè)實(shí)施例中,應(yīng)該配置該過程,使得列重新排序后的數(shù)據(jù)不比未壓縮的數(shù)據(jù)占用更多的空間。如上所述,第一數(shù)組lens(ub2lens[fixed_width_column_count])包含塊的前n列的固定列長度(其中n=fixed_width_column_count)。不是在數(shù)組的每一元素中存儲(chǔ)列的長度,可以使用非交換求和對周圍可能的NULL值進(jìn)行處理,存儲(chǔ)列長度的前綴和(prefixsum),如下lens←SIZEOF(column),lens[k]←lens[k-1]SIZEOF(column[k]),k>0其中如果該列是NULL,SIZEOF(col)≡0x8000,并且求和操作只占用右邊的操作數(shù)0x8000個(gè)比特,即不是可交換的。例如,考慮10個(gè)固定寬度列長度的序列,如下5,5,12,7,NULL,NULL,4,NULL,4,6,該數(shù)組會(huì)包含下列值5,10,22,29,32797,32797,33,32801,37,43。從該數(shù)組中提取第N列的長度的操作如下。首先,如果k<fixed_width_column_count,測試lens[k]&0x8000,以檢測列k是否是NULL。如果不是NULL,那么其長度為len←lens[k]-(1ens[k-1]&0x7FFF),k>0或len←lens,k=0如果塊中有多個(gè)固定寬度的列,那么該數(shù)組可以占用大量的空間。對于使用固定長度列的重新排序所可能存在的優(yōu)點(diǎn)就是,例如通過將NULL列全局地轉(zhuǎn)動(dòng)到末尾并接著進(jìn)行截取NULL尾值,可以壓縮出長序列的NULL列。通常,塊中固定長度的列越多,多個(gè)列具有相同列長度的可能性就越高。塊格式如果在塊的首部設(shè)置行壓縮指示符,那么其可以指示出塊中的全部或部分行被壓縮。僅僅是為了下面的解釋,假定給定塊的列已經(jīng)被重新排序過,該塊的第0至第(fixed_width_column_count-1)列都是固定長度,并且其余列的長度可變。進(jìn)一步假定第0至第(fixed_width_column_count-1)列已經(jīng)將它們的長度刪除并將其存儲(chǔ)在塊級數(shù)組lens中。其余的列將它們的長度存儲(chǔ)在該列自己中。在實(shí)施例中,對該塊的行片段格式進(jìn)行如下定義#defineSHORT_INDEX200#defineSHORT_LENGTH250#defineLONG_INDEX251#defineLONG_LENGTHSHORT_LENGTHSHORT_INDEX的值是指向符號表中的索引。對于值L∈[SHORT_INDEX,SHORT_LENGTH),len←(L-KDRCSSHORTINDEX)就是現(xiàn)場存儲(chǔ)的列(即未壓縮的列)的長度。LONG_INDEX的值指示后2個(gè)字節(jié)包含指向符號表中的索引值。值LONG_LENGTH指示隨后是一個(gè)未壓縮的列(首先是長度字節(jié))。行首部中的列計(jì)數(shù)字段包含出現(xiàn)在行中列長度前幾個(gè)字節(jié)的計(jì)數(shù)。在一個(gè)實(shí)施例中,符號表是table,其具有數(shù)據(jù)層的行。該符號表中的行并不具有標(biāo)志字節(jié)或鎖定字節(jié)。對于標(biāo)志字節(jié),例如可以通過獲取數(shù)據(jù)塊鎖定來對符號表?xiàng)l目進(jìn)行鎖定。在一個(gè)實(shí)施例中,如果多符號表的操作非常不頻繁,可能會(huì)導(dǎo)致符號表操作的同時(shí)丟失。符號表行的標(biāo)準(zhǔn)或鎖定字節(jié)可以包含參考字節(jié),將其存儲(chǔ)為ub2。在實(shí)施例中,除了下面用來將第一長度字節(jié)值進(jìn)行范圍劃分的常數(shù)之外,符號表行類似于行片段格式;#defineSYMTAB_SHORT_INDEX200#defineSYMTAB_SHORT_LENGTH250#defineSYMTAB_LONG_INDEX251#defineSYMTAB_LONG_LENGTHSYMTAB_SHORT_LENGTH對這些第一長度字節(jié)的解釋與如上對塊的行片段的相同。另外,在符號表中可以有多列條目。在實(shí)施例中,前綴、固定長度列的壓縮不同于其它列的壓縮。出現(xiàn)區(qū)別是因?yàn)閺倪@些列中刪除了長度??梢赃M(jìn)行下面的操作,通過使用停止字節(jié)Bi對前綴、固定長度的列進(jìn)行壓縮。如果B0<SHORT_INDEX,行片段數(shù)據(jù)的第一字節(jié)B0是到符號表中的索引。否則(B0-SHORT_INDEX)就是隨后的現(xiàn)場存儲(chǔ)(即未壓縮)的固定長度列的數(shù)目。下一字節(jié)B1或者直接在B0之后,或者相應(yīng)地直接跟隨在前的(B0-SHORT_INDEX)列的數(shù)據(jù)。在跟隨Bk的列還是固定長度時(shí),該定義繼續(xù)循環(huán)。壓縮器在實(shí)施例中,至少可以用兩個(gè)不同的壓縮方法。在線壓縮會(huì)遞增的形成被壓縮的塊。離線壓縮首先將足夠數(shù)目的行緩沖到緩沖器中,并然后盡實(shí)際可能的將足夠多的行放入壓縮區(qū)。在線壓縮的魅力是因?yàn)槠洳恍枰3至硗獾木彌_器,或執(zhí)行另外的存儲(chǔ)拷貝(memcopy)操作。然而在某些情況下,在線壓縮的壓縮質(zhì)量可能會(huì)遠(yuǎn)不如離線壓縮。例如,遞增地形成塊可能會(huì)在處理之前不對列進(jìn)行完整的預(yù)分析,這可能會(huì)對有效地執(zhí)行塊級列的重新排序產(chǎn)生負(fù)面的影響。通過在大部分塊已經(jīng)形成之后,執(zhí)行塊重組(再壓縮),以試圖改善這些限制,這樣的開銷可能非常高。下面的描述是關(guān)于離線壓縮,其中處理大批組的行,以形成一個(gè)或多個(gè)完整的塊。每一數(shù)據(jù)列可以描述為指向緩沖器中、例如指向源表格的數(shù)據(jù)塊中其數(shù)據(jù)的指針。使用下面的詞語描述本發(fā)明的壓縮器-SingleEntry(SE)表示具有指向數(shù)據(jù)、數(shù)據(jù)長度和幾個(gè)參考計(jì)數(shù)的指針的列。-RowModel(RM)表示作為指向SE的指針和SE(列計(jì)數(shù))的計(jì)數(shù)的數(shù)組的行。-RowSetModel(RSM)表示作為指向RM的指針和行計(jì)數(shù)的數(shù)組的一組行。RSM構(gòu)造對于離線壓縮,由于壓縮器模塊對行進(jìn)行緩沖,所以其建立一組行的RSM。在哈希表格中查找每一行列,并且如果沒有,為該列分配新的SE,否則使用指向現(xiàn)存SE的指針??梢允褂脛?dòng)態(tài)存儲(chǔ)管理器來減少碎片和存儲(chǔ)分配的開銷。在一個(gè)實(shí)施例中,該存儲(chǔ)管理器是用于只持續(xù)在單個(gè)塊壓縮期間的每塊臨時(shí)地分配,和持續(xù)在段壓縮期間的每段存儲(chǔ)。RSM表示作為SE指針的矩陣的一組行,其中相等的行指向相同的SE。每一SE將會(huì)成為單個(gè)列的符號表?xiàng)l目。一旦建立了RSM之后,可以根據(jù)SE參考計(jì)數(shù)產(chǎn)生由單個(gè)列條目組成的該符號表。對于某些數(shù)據(jù)集,這可以提供有效的壓縮,因?yàn)榭梢酝ㄟ^指向符號表中少量字節(jié)的索引對重復(fù)的SE編碼。為了得到更高的壓縮,可以使用指向符號表中的索引來代替列序列,并且創(chuàng)建多列符號表?xiàng)l目。MultiEntry(ME)表示多列符號表?xiàng)l目的候選值。使用其第一列的(row,column)對其進(jìn)行描述,列計(jì)數(shù)更多的字段。在本實(shí)施例中,壓縮操作涉及到為給定的RSM標(biāo)識一組有用的ME的操作。可以采取幾個(gè)步驟來執(zhí)行塊級列的重新排序的計(jì)算。在第一步(步驟A),可以使用經(jīng)驗(yàn)規(guī)則計(jì)算塊級列的重新排序通過(列基數(shù)、列長度基數(shù))對列進(jìn)行排序。RSM每使用該規(guī)則一次,壓縮器就確定列的重新排序一次。在一個(gè)實(shí)施例中,考慮下面的2列c1和c2,通過該排序規(guī)則使得c1≡c2,或者可認(rèn)為c1比c2更可接受一些111211121112111211121122一旦完成步驟(A),可以進(jìn)行字典建立(步驟(C))。該步驟包括標(biāo)識RSM的{ME}??梢哉J(rèn)為RSM是字母表上由指向SE的指針組成的文本。對于在8k塊的實(shí)施例中,該文本的長度大約在5000-10000個(gè)符號以內(nèi)(分別是200-400行25列),并且每塊的離散符號的數(shù)目大約在700-900個(gè)以內(nèi)。標(biāo)識{ME}的問題因此可以認(rèn)為是整數(shù)字母表上的替代壓縮問題,該字母表的大小大約是常規(guī)1字節(jié)字母表(256×32[700,900])的3倍。在實(shí)施例中,壓縮器在步驟A與步驟C之間另外執(zhí)行步驟B,并且此處將其稱為“前綴檢測”步驟。該步驟捕獲被壓縮的數(shù)據(jù)集的離散屬性,例如包括一組行的數(shù)據(jù)集的屬性。該數(shù)據(jù)集的離線屬性就是,其是一組行,其中列在步驟A中按照列基數(shù)對列進(jìn)行排序過??梢詾樾薪M{ri}i=1n建立N-ary數(shù)字壓縮查找樹。該查找樹剛好具有N行的N個(gè)葉、根節(jié)點(diǎn)和幾個(gè)分支結(jié)點(diǎn)??梢酝ㄟ^下面的樹構(gòu)建程序描述該樹·空樹只包含根節(jié)點(diǎn)?!ぴ谙驑涮砑拥谝恍衦1之后,該樹包含根節(jié)點(diǎn)、一個(gè)葉節(jié)點(diǎn)和一個(gè)連接根與葉的邊(edge)。該邊用r1中的所有符號標(biāo)記?!ぎ?dāng)向該樹添加行r2時(shí),添加一個(gè)葉節(jié)點(diǎn)。如果r2中的第一符號與r1中的第一符號相同,那么刪除舊的邊,向該樹添加新的分支節(jié)點(diǎn),連接根與新的分支、并連接新的分支節(jié)點(diǎn)與兩個(gè)葉。用行r1和r2的最長的共同前綴來標(biāo)記從根到新分支的邊。標(biāo)記將新分支節(jié)點(diǎn)對應(yīng)地與具有行r1和r2后綴的葉連接起來的邊。如果r2中的第一符號與r1中的第一符號不相同,那么簡單地添加從根到新葉的新邊,其用來自r2的所有符號標(biāo)記。對于RSM中的所有行循環(huán)地進(jìn)行樹構(gòu)建。作為范例,假定向該樹添加4行ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOIQRSTUVWXYZ1BCDEFGHUKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTAAAAAA該樹從根節(jié)點(diǎn)分出兩個(gè)邊,一個(gè)是用r3中的所有符號標(biāo)記的、連接根與r3的葉節(jié)點(diǎn),另一個(gè)邊連接根與分支節(jié)點(diǎn),標(biāo)記該邊的符號是ABCDEFGHIJKLMNO對從該分支節(jié)點(diǎn)出來的兩個(gè)邊進(jìn)行標(biāo)記的符號相應(yīng)的是1QRSTUVWXYZ和PQRST。第一邊連接該分支與行r2的葉,第二邊連接該分支與另一個(gè)分支。最終,另一分支具有將其與r1和r4的葉連接起來的兩個(gè)邊,分別標(biāo)記為UVWXYZ和AAAAAA。圖24所示的范例描述了該樹。該樹具有某些屬性·每一分支節(jié)點(diǎn)至少具有2個(gè)引出邊?!ぴ摌渲炼嗑哂?×N個(gè)節(jié)點(diǎn)和2×N個(gè)邊?!ゆ溄訌母饺~的邊標(biāo)記得到對應(yīng)葉的行符號?!と绻麅尚泄灿孟嗤那熬Y,那么從根到它們的葉的路徑共用相同的邊,其累加長度等于最大的共用前綴長度?!し种Ч?jié)點(diǎn)與至少兩行共用的前綴之間存在一一對應(yīng)關(guān)系。如果使用出自該節(jié)點(diǎn)的子樹中葉節(jié)點(diǎn)的數(shù)目和從根到該節(jié)點(diǎn)的累加邊的長度標(biāo)記該樹的每一分支節(jié)點(diǎn),那么對于每一分支節(jié)點(diǎn),我們可以立即說出有多少行共用終止于該節(jié)點(diǎn)的前綴。一旦構(gòu)建該樹,就可以在單樹深度優(yōu)先遍歷中進(jìn)行標(biāo)記,行數(shù)為N時(shí)其具有的復(fù)雜度為O(N)。一旦構(gòu)建并標(biāo)記了該樹之后,繼續(xù)進(jìn)行前綴檢測。根據(jù)簡單的遞歸程序進(jìn)行前綴檢測。考慮下面20行的范例ABCDEFGHUKLMNOPacABCDEFGHUKLMNOPadABCDEFGHIJKLMNOPaeABCDEFGHIJKLMNOPafABCDEFGHIJKLMNOPagABCDEFGHIJKLMNOPahABCDEFGHIJKLMNOPaiABCDEFGHIJKLMNOPajABCDEFGHIJKLMNOPakABCDEFGHIJKLMNOPalABCDEFGHIJKLMNOPbmABCDEFGHIJKLMNOPbnABCDEFGHIJKLMNOPboABCDEFGHIJKLMNOPbpABCDEFGHIJKLMNOPbqABCDEFGHIJKLMNOPbrABCDEFGHIJKLMNOPbsABCDEFGHIJKLMNOPbtABCDEFGHIJKLMNOPbuABCDEFGHIJKLMNOPbv該樹的根節(jié)點(diǎn)n0具有的出自其的一個(gè)邊(n0,n1),標(biāo)記為ABCDEFGHIJKLMNOP節(jié)點(diǎn)n1具有出自其的兩個(gè)邊(n1,n2)和(n1,n3),邊(n1,n2)標(biāo)記為a并且邊(n1,n3)標(biāo)記為b節(jié)點(diǎn)n2和n3標(biāo)記為計(jì)數(shù)為10的葉節(jié)點(diǎn),并且它們到根的距離為17。節(jié)點(diǎn)n1標(biāo)記為計(jì)數(shù)為20的葉節(jié)點(diǎn),并且它們到根的距離為16。對于該范例,在構(gòu)建{ME}中可以提供下面的選擇選擇1{ME}=(該符號表中沒有ME)選擇2{ME}={{ABCDEFGHIJKLMNOP}}(一個(gè)ME)選擇3{ME}={{ABCDEFGHIJKLMNOPa},{ABCDEFGHIJKLMNOPb}}(兩個(gè)ME)選擇4{ME}={{ABCDEFGHIJKLMNOP},{#0a},{#0b}}(三個(gè)ME)。執(zhí)行另一個(gè)樹的遍歷,以幫助選擇{ME}。該算法具有共同的步驟。在每一步驟時(shí),一個(gè)分支節(jié)點(diǎn)是當(dāng)前節(jié)點(diǎn)。該共同步驟由對下面選項(xiàng)進(jìn)行的選擇組成選項(xiàng)1對于當(dāng)前節(jié)點(diǎn)是適當(dāng)?shù)那熬Y時(shí),不創(chuàng)建另外的ME。選項(xiàng)2對于當(dāng)前節(jié)點(diǎn)是適當(dāng)?shù)那熬Y時(shí),創(chuàng)建另外的ME;將終止于當(dāng)前節(jié)點(diǎn)的前綴復(fù)制到這些ME中。選項(xiàng)3對于當(dāng)前節(jié)點(diǎn)是適當(dāng)?shù)那熬Y時(shí),創(chuàng)建另外的ME;將終止于當(dāng)前節(jié)點(diǎn)的前綴分解到單獨(dú)的ME中,并制造另一個(gè)指向其的指針。注意到對于上面20行的范例選擇1當(dāng)前節(jié)點(diǎn)是n0時(shí),由選項(xiàng)1給出;選擇2當(dāng)前節(jié)點(diǎn)是n0時(shí),由選項(xiàng)2給出,并且當(dāng)前節(jié)點(diǎn)是n1時(shí),由選項(xiàng)1給出;選擇3當(dāng)前節(jié)點(diǎn)是n0時(shí),由選項(xiàng)3給出,并且當(dāng)前節(jié)點(diǎn)是n1時(shí),由選項(xiàng)2給出;選擇4當(dāng)前節(jié)點(diǎn)是n0時(shí),由選項(xiàng)3給出,并且當(dāng)前節(jié)點(diǎn)是n1時(shí),由選項(xiàng)3給出。因此,前綴檢測算法遍歷該樹,在當(dāng)前分支節(jié)點(diǎn)從上面提到的3個(gè)選項(xiàng)進(jìn)行選擇,通過考慮·當(dāng)前節(jié)點(diǎn)的標(biāo)記;·在當(dāng)前節(jié)點(diǎn)子樹中的所有相鄰節(jié)點(diǎn)中的標(biāo)記;·創(chuàng)建新符號表?xiàng)l目的非零成本并且然后處理到該子樹。當(dāng)該子樹遍歷到達(dá)葉節(jié)點(diǎn)時(shí),如果對應(yīng)行的任何前綴壓縮了或者沒壓縮,其都“知道”,并且如果其壓縮了,其“知道”是使用哪一個(gè)MS壓縮的。這樣,在一個(gè)方法中,前置檢測從給定塊的一組最理想的{ME}中找到所有的前綴ME,或者如果該最理想的組是空或不包括任何前綴ME,其發(fā)現(xiàn)沒有ME。在實(shí)施例中,該壓縮器通過首先裝載標(biāo)準(zhǔn)的數(shù)據(jù)塊和其并行的RSM工作。在此之后,壓縮器通過試圖創(chuàng)建新的壓縮塊來壓縮RSM。如果來自該標(biāo)準(zhǔn)塊的行不能裝入到新壓縮塊(即沒有壓縮),那么該壓縮器將該壓縮塊寫入,并繼續(xù)對下一組行進(jìn)行處理。否則,通過比較標(biāo)準(zhǔn)塊中的自由空間與壓縮塊中的自由空間,對壓縮增益進(jìn)行估計(jì)。如果沒有壓縮增益或者壓縮壓縮最小,那么壓縮器將該壓縮塊寫入,并繼續(xù)對下一組行進(jìn)行處理。否則,如果壓縮增益較大,那么估計(jì)通過插入可以裝入到塊中的行數(shù),并切換到緩沖模式。在緩沖模式中,構(gòu)建RSM而不裝載任何數(shù)據(jù)到塊中。一旦所估計(jì)數(shù)目的行已經(jīng)緩沖進(jìn)入RSM中后,試圖再次壓縮RSM。存在3種可能的結(jié)果·RSM不能裝入單個(gè)壓縮塊中?!SM裝入了單個(gè)壓縮塊中,并且自由空間的浪費(fèi)最小?!SM裝入了單個(gè)壓縮塊中,并且還存在自由空間可以裝入更多的行。在第一種情況下,通過重復(fù)地將[known2fit,known2notfit]間隔二等分,其具有起始條件known2fit=未壓縮塊中的行數(shù),known2notfit=我們估計(jì)但是不能裝入的行數(shù),開始減少RSM中壓縮器試圖裝入到單個(gè)塊中的行數(shù)。在第二種情況下,將壓縮塊寫入,并繼續(xù)對下一組行進(jìn)行處理。在第三種情況下,重新估計(jì)行數(shù)并繼續(xù)緩沖RSM。每一單獨(dú)的塊壓縮都包括執(zhí)行步驟A、步驟B、替換RSM中檢測的前綴,并將得到的RSM饋送到步驟C。解壓縮器本發(fā)明能夠?qū)嚎s數(shù)據(jù)進(jìn)行非??焖?、低系統(tǒng)開銷的解壓縮。在實(shí)施例中,可以直接從塊中得到列值/長度。因此,解壓縮過程也就是通過解釋塊首部比特、固定列和列置換數(shù)組(如果存在的話)、以及第一長度字節(jié)和該行引用的符號表?xiàng)l目,查找這些值。可以返回這些引用的數(shù)據(jù)值,而不需要執(zhí)行任何代價(jià)較高的解壓縮和重建算法。在前面的說明中,已經(jīng)參照其具體的實(shí)施例描述了本發(fā)明。但是顯然,不脫離本發(fā)明廣闊的精神和范圍可以對其做出各種修改和變化。例如,參照特定的排序處理過程描述上述處理流程。然而,可以改變所描述的許多處理過程的順序,而不影響本發(fā)明操作的范圍。說明書和附圖相應(yīng)的看作是說明性的,而不是限制性的。權(quán)利要求1.一種用于以壓縮格式存儲(chǔ)數(shù)據(jù)的方法,包括接收將數(shù)據(jù)存儲(chǔ)到盤上的一個(gè)或多個(gè)數(shù)據(jù)庫塊上的請求;分析該數(shù)據(jù),以確定冗余數(shù)據(jù)項(xiàng)目的存在;創(chuàng)建一個(gè)符號結(jié)構(gòu),以存儲(chǔ)該冗余數(shù)據(jù)項(xiàng)目;格式化對應(yīng)于該數(shù)據(jù)的盤上數(shù)據(jù)結(jié)構(gòu);和使該盤上數(shù)據(jù)結(jié)構(gòu)與對存儲(chǔ)在該符號結(jié)構(gòu)中的冗余數(shù)據(jù)項(xiàng)目的引用相關(guān)聯(lián),其中該盤上數(shù)據(jù)結(jié)構(gòu)不顯式包含該冗余數(shù)據(jù)項(xiàng)目的拷貝。2.根據(jù)權(quán)利要求1的方法,其中使用鏈接或指針來引用存儲(chǔ)在該符號結(jié)構(gòu)中的冗余數(shù)據(jù)項(xiàng)目。3.根據(jù)權(quán)利要求1的方法,其中該數(shù)據(jù)包括具有一個(gè)或多個(gè)行的關(guān)系數(shù)據(jù)。4.根據(jù)權(quán)利要求3的方法,其中在線處理每一行。5.根據(jù)權(quán)利要求3的方法,其中離線處理一組行。6.根據(jù)權(quán)利要求1的方法,其中重組該數(shù)據(jù),以增加冗余數(shù)據(jù)項(xiàng)目的可能性。7.根據(jù)權(quán)利要求6的方法,其中對重組考慮該數(shù)據(jù)的基數(shù)。8.根據(jù)權(quán)利要求1的方法,其中該符號結(jié)構(gòu)包括遞歸地引用該符號結(jié)構(gòu)中的另一條目的條目。9.根據(jù)權(quán)利要求8的方法,其中該條目引用該符號結(jié)構(gòu)中的多個(gè)其它條目。10.根據(jù)權(quán)利要求8的方法,其中該條目包括所存儲(chǔ)的冗余數(shù)據(jù)項(xiàng)目和遞歸地引用該符號結(jié)構(gòu)中的另一條目的條目。11.根據(jù)權(quán)利要求8的方法,包括與遞歸地引用該符號結(jié)構(gòu)中另一條目的條目相關(guān)聯(lián)的第二盤上數(shù)據(jù)結(jié)構(gòu)。12.根據(jù)權(quán)利要求8的方法,進(jìn)一步包括第二盤上數(shù)據(jù)結(jié)構(gòu),其中該盤上數(shù)據(jù)結(jié)構(gòu)內(nèi)的多個(gè)字段共同地與一個(gè)引用相關(guān)聯(lián),該引用具有遞歸地引用該符號結(jié)構(gòu)中另一條目的條目。13.根據(jù)權(quán)利要求12的方法,其中數(shù)據(jù)列被重新排序。14.根據(jù)權(quán)利要求13的方法,其中數(shù)據(jù)列被重新排序,以增加該盤上數(shù)據(jù)結(jié)構(gòu)內(nèi)的多個(gè)字段的序列重復(fù)的可能性。15.根據(jù)權(quán)利要求12的方法,其中在數(shù)據(jù)庫塊的級別進(jìn)行列的重新排序。16.根據(jù)權(quán)利要求13的方法,其中NULL尾值不包括在該盤上數(shù)據(jù)結(jié)構(gòu)中。17.根據(jù)權(quán)利要求1的方法,其中該數(shù)據(jù)塊包括指示是否應(yīng)用了壓縮的元數(shù)據(jù)。18.根據(jù)權(quán)利要求17的方法,其中該元數(shù)據(jù)包括單個(gè)比特。19.根據(jù)權(quán)利要求1的方法,其中該數(shù)據(jù)塊包括指示列是否被重新排序的元數(shù)據(jù)。20.一種用于檢索以壓縮格式存儲(chǔ)的數(shù)據(jù)的方法,包括接收從盤上的一個(gè)或多個(gè)數(shù)據(jù)庫塊檢索數(shù)據(jù)的請求;分析該請求,以確定要訪問的一個(gè)或多個(gè)數(shù)據(jù)塊;分析該一個(gè)或多個(gè)數(shù)據(jù)塊,以確定是否應(yīng)用了壓縮;檢索對應(yīng)于該數(shù)據(jù)的盤上數(shù)據(jù)結(jié)構(gòu);和對于被該盤上數(shù)據(jù)結(jié)構(gòu)引用的冗余數(shù)據(jù)項(xiàng)目,從一個(gè)符號結(jié)構(gòu)中檢索該冗余數(shù)據(jù)項(xiàng)目。21.根據(jù)權(quán)利要求20的方法,其中使用鏈接或指針來引用存儲(chǔ)在該符號結(jié)構(gòu)中的冗余數(shù)據(jù)項(xiàng)目。22.根據(jù)權(quán)利要求20的方法,其中該數(shù)據(jù)包括具有一個(gè)或多個(gè)行的關(guān)系數(shù)據(jù)。23.根據(jù)權(quán)利要求20的方法,其中該符號結(jié)構(gòu)包括遞歸地引用該符號結(jié)構(gòu)中的另一條目的條目。24.根據(jù)權(quán)利要求23的方法,其中該條目引用該符號結(jié)構(gòu)中的多個(gè)其它條目。25.根據(jù)權(quán)利要求23的方法,其中該條目包括所存儲(chǔ)的冗余數(shù)據(jù)項(xiàng)目和遞歸地引用該符號結(jié)構(gòu)中另一條目的條目。26.根據(jù)權(quán)利要求23的方法,包括檢索與遞歸地引用該符號結(jié)構(gòu)中另一條目的條目相關(guān)聯(lián)的第二盤上數(shù)據(jù)結(jié)構(gòu)。27.根據(jù)權(quán)利要求23的方法,進(jìn)一步包括檢索第二盤上數(shù)據(jù)結(jié)構(gòu),其中該盤上數(shù)據(jù)結(jié)構(gòu)中的多個(gè)字段共同地與一個(gè)引用相關(guān)聯(lián),該引用具有遞歸地引用該符號結(jié)構(gòu)中另一條目的條目。28.根據(jù)權(quán)利要求20的方法,其中重新構(gòu)建先前被刪除的NULL尾值。29.一種用于存儲(chǔ)數(shù)據(jù)的方法,包括接收存儲(chǔ)數(shù)據(jù)的請求,該數(shù)據(jù)包括多個(gè)列;重新排序該多個(gè)列,以增加NULL尾值的可能性;和創(chuàng)建該數(shù)據(jù)的存儲(chǔ)版本,其中該數(shù)據(jù)的存儲(chǔ)版本不包括該NULL尾值。30.根據(jù)權(quán)利要求29的方法,其中將該數(shù)據(jù)的存儲(chǔ)版本寫到盤上。31.根據(jù)權(quán)利要求29的方法,進(jìn)一步包括創(chuàng)建元數(shù)據(jù)的操作,該元數(shù)據(jù)指示該NULL尾值不包括在該存儲(chǔ)版本中。32.一種用于在數(shù)據(jù)庫塊上存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu),包括用于在盤上存儲(chǔ)冗余數(shù)據(jù)項(xiàng)目的符號結(jié)構(gòu);和在盤上的盤上數(shù)據(jù)結(jié)構(gòu),其包括對該符號結(jié)構(gòu)中該冗余數(shù)據(jù)項(xiàng)目的引用。33.根據(jù)權(quán)利要求32的結(jié)構(gòu),其中使用鏈接或指針來引用存儲(chǔ)在該符號結(jié)構(gòu)中的冗余數(shù)據(jù)項(xiàng)目。34.根據(jù)權(quán)利要求32的結(jié)構(gòu),其中該數(shù)據(jù)包括具有一個(gè)或多個(gè)行的關(guān)系數(shù)據(jù)。35.根據(jù)權(quán)利要求32的結(jié)構(gòu),其中該符號結(jié)構(gòu)包括遞歸地引用該符號結(jié)構(gòu)中的另一條目的條目。36.根據(jù)權(quán)利要求35的結(jié)構(gòu),其中該條目引用該符號結(jié)構(gòu)中的多個(gè)其它條目。37.根據(jù)權(quán)利要求35的結(jié)構(gòu),其中該條目包括所存儲(chǔ)的冗余數(shù)據(jù)項(xiàng)目和遞歸地引用該符號結(jié)構(gòu)中的另一條目的條目。38.根據(jù)權(quán)利要求35的結(jié)構(gòu),包括與遞歸地引用該符號結(jié)構(gòu)中另一條目的條目相關(guān)聯(lián)的第二盤上數(shù)據(jù)結(jié)構(gòu)。39.根據(jù)權(quán)利要求35的結(jié)構(gòu),進(jìn)一步包括第二盤上數(shù)據(jù)結(jié)構(gòu),其中該盤上數(shù)據(jù)結(jié)構(gòu)中的多個(gè)字段共同地與一個(gè)引用相關(guān)聯(lián),該引用具有遞歸地引用該符號結(jié)構(gòu)中另一條目的條目。40.根據(jù)權(quán)利要求32的結(jié)構(gòu),其中數(shù)據(jù)列被重新排序。41.根據(jù)權(quán)利要求40的結(jié)構(gòu),其中數(shù)據(jù)列被重新排序,以增加該盤上數(shù)據(jù)結(jié)構(gòu)內(nèi)的多個(gè)字段的序列重復(fù)的可能性。42.根據(jù)權(quán)利要求32的結(jié)構(gòu),其中NULL尾值不包括在該盤上數(shù)據(jù)結(jié)構(gòu)中。43.根據(jù)權(quán)利要求32的結(jié)構(gòu),其中該數(shù)據(jù)塊包括指示是否應(yīng)用了壓縮的元數(shù)據(jù)。44.根據(jù)權(quán)利要求43的結(jié)構(gòu),其中該元數(shù)據(jù)包括單個(gè)比特。45.根據(jù)權(quán)利要求32的結(jié)構(gòu),其中該數(shù)據(jù)庫塊包括指示是否對列重新排序的元數(shù)據(jù)。46.一種用于提高數(shù)據(jù)庫查詢語言語句的性能的方法,該方法包括保持描述數(shù)據(jù)塊中的數(shù)據(jù)重復(fù)的信息;接收針對該數(shù)據(jù)塊中的數(shù)據(jù)的數(shù)據(jù)庫查詢語言語句,該數(shù)據(jù)庫查詢語言語句至少包括一個(gè)謂詞(predicate);和使用該數(shù)據(jù)重復(fù)信息減少在該數(shù)據(jù)塊中的數(shù)據(jù)上進(jìn)行謂詞評估的次數(shù)。47.根據(jù)權(quán)利要求46的方法,其中保持描述數(shù)據(jù)塊中的數(shù)據(jù)重復(fù)的信息包括標(biāo)識該數(shù)據(jù)塊中的一個(gè)或多個(gè)重復(fù)數(shù)據(jù)值;計(jì)算該一個(gè)或多個(gè)重復(fù)數(shù)據(jù)值中的每一個(gè)所出現(xiàn)的次數(shù);和存儲(chǔ)該一個(gè)或多個(gè)重復(fù)數(shù)據(jù)值中的每一個(gè),以及該重復(fù)數(shù)據(jù)值在一個(gè)符號結(jié)構(gòu)的條目中出現(xiàn)的對應(yīng)次數(shù)。48.根據(jù)權(quán)利要求47的方法,其中保持描述數(shù)據(jù)塊中的數(shù)據(jù)重復(fù)的信息進(jìn)一步包括從該數(shù)據(jù)塊中去除該一個(gè)或多個(gè)重復(fù)數(shù)據(jù)值的至少其中之一的一次或多次出現(xiàn);和配置該數(shù)據(jù)塊的對應(yīng)于所刪除的出現(xiàn)的部分,以引用該適當(dāng)?shù)姆柦Y(jié)構(gòu)條目。49.根據(jù)權(quán)利要求48的方法,其中使用鏈接或指針來引用該適當(dāng)?shù)姆柦Y(jié)構(gòu)條目。50.根據(jù)權(quán)利要求47的方法,其中保持描述數(shù)據(jù)塊中的數(shù)據(jù)重復(fù)的信息進(jìn)一步包括當(dāng)添加或刪除該重復(fù)數(shù)據(jù)值的出現(xiàn)時(shí),更新該一個(gè)或多個(gè)重復(fù)數(shù)據(jù)值的其中之一的出現(xiàn)次數(shù)。51.根據(jù)權(quán)利要求50的方法,其中保持描述數(shù)據(jù)塊中的數(shù)據(jù)重復(fù)的信息進(jìn)一步包括當(dāng)符號結(jié)構(gòu)條目中該重復(fù)數(shù)據(jù)值的出現(xiàn)次數(shù)為零時(shí),刪除該符號結(jié)構(gòu)條目。52.根據(jù)權(quán)利要求46的方法,其中減少在該數(shù)據(jù)塊中的數(shù)據(jù)上進(jìn)行謂詞評估的次數(shù)包括在該數(shù)據(jù)塊中的重復(fù)數(shù)據(jù)值上評估該至少一個(gè)謂詞至多一次。53.根據(jù)權(quán)利要求46的方法,其中減少在該數(shù)據(jù)塊中的數(shù)據(jù)上進(jìn)行謂詞評估的次數(shù)包括在數(shù)據(jù)值上評估該至少一個(gè)謂詞之前,判定是否先前已經(jīng)在該數(shù)據(jù)塊中的該數(shù)據(jù)值的重復(fù)上評估了該至少一個(gè)謂詞;當(dāng)先前已經(jīng)在該數(shù)據(jù)值的重復(fù)上評估了該至少一個(gè)謂詞時(shí),利用先前在該數(shù)據(jù)值的重復(fù)上評估該至少一個(gè)謂詞的結(jié)果;和當(dāng)先前沒有在該數(shù)據(jù)值的重復(fù)上評估該至少一個(gè)謂詞時(shí),在該數(shù)據(jù)值上評估該至少一個(gè)謂詞。54.根據(jù)權(quán)利要求53的方法,其中判定是否先前已經(jīng)在該數(shù)據(jù)值的重復(fù)上評估了該至少一個(gè)謂詞包括驗(yàn)證該數(shù)據(jù)值是否出現(xiàn)在上下文中,該上下文存儲(chǔ)該數(shù)據(jù)塊中先前評估該至少一個(gè)謂詞所基于的每一數(shù)據(jù)值,以及對應(yīng)的該先前謂詞評估的結(jié)果。55.根據(jù)權(quán)利要求46的方法,進(jìn)一步包括使用該數(shù)據(jù)重復(fù)信息減少被該數(shù)據(jù)庫查詢語言語句訪問的數(shù)據(jù)量。56.根據(jù)權(quán)利要求55的方法,其中減少被該數(shù)據(jù)庫查詢語言語句訪問的數(shù)據(jù)量包括計(jì)算該數(shù)據(jù)塊中對該至少一個(gè)謂詞評估為真所基于的數(shù)據(jù)值的總數(shù);設(shè)置計(jì)數(shù)器等于該總數(shù);當(dāng)訪問該數(shù)據(jù)塊中的對該至少一個(gè)謂詞評估為真所基于的數(shù)據(jù)值時(shí),減小該計(jì)數(shù)器;和訪問該數(shù)據(jù)塊中的數(shù)據(jù)值,直至該計(jì)數(shù)器等于零。57.根據(jù)權(quán)利要求55的方法,其中減少被該查詢訪問的數(shù)據(jù)量包括更新該數(shù)據(jù)重復(fù)信息,而不是訪問數(shù)據(jù)塊中的數(shù)據(jù)值。58.根據(jù)權(quán)利要求46的方法,其中在該數(shù)據(jù)塊中保持該數(shù)據(jù)重復(fù)信息。59.一種包括計(jì)算機(jī)可讀介質(zhì)的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)可讀介質(zhì)在其上存儲(chǔ)有指令序列,該指令在被處理器執(zhí)行時(shí),使得該處理器執(zhí)行用于以壓縮格式存儲(chǔ)數(shù)據(jù)的過程,該過程包括權(quán)利要求1-19中任何一項(xiàng)的操作。60.一種包括計(jì)算機(jī)可讀介質(zhì)的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)可讀介質(zhì)在其上存儲(chǔ)有指令序列,該指令在被處理器執(zhí)行時(shí),使得該處理器執(zhí)行用于檢索以壓縮格式存儲(chǔ)的數(shù)據(jù)的過程,該過程包括權(quán)利要求20-28中任何一項(xiàng)的操作。61.一種包括計(jì)算機(jī)可讀介質(zhì)的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)可讀介質(zhì)在其上存儲(chǔ)有指令序列,該指令在被處理器執(zhí)行時(shí),使得該處理器執(zhí)行用于存儲(chǔ)數(shù)據(jù)的過程,該過程包括權(quán)利要求29-31中任何一項(xiàng)的操作。62.一種包括計(jì)算機(jī)可讀介質(zhì)的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)可讀介質(zhì)在其上存儲(chǔ)有指令序列,該指令在被處理器執(zhí)行時(shí),使得該處理器執(zhí)行用于提高數(shù)據(jù)庫查詢語言語句性能的過程,該過程包括權(quán)利要求46-58中任何一項(xiàng)的操作。63.一種用于以壓縮格式存儲(chǔ)數(shù)據(jù)的系統(tǒng),該系統(tǒng)包括用于執(zhí)行權(quán)利要求1-19中任何一項(xiàng)操作的裝置。64.一種用于檢索以壓縮格式存儲(chǔ)的數(shù)據(jù)的系統(tǒng),該系統(tǒng)包括用于執(zhí)行權(quán)利要求20-28中任何一項(xiàng)操作的裝置。65.一種用于存儲(chǔ)數(shù)據(jù)的系統(tǒng),該系統(tǒng)包括用于執(zhí)行權(quán)利要求29-31中任何一項(xiàng)操作的裝置。66.一種用于提高數(shù)據(jù)庫查詢語言語句性能的系統(tǒng),該系統(tǒng)包括用于執(zhí)行權(quán)利要求46-58中任何一項(xiàng)操作的裝置。全文摘要公開了一種用于在計(jì)算系統(tǒng)中實(shí)施存儲(chǔ)和檢索數(shù)據(jù)的方法和機(jī)制。通過減少或去除數(shù)據(jù)庫塊中的重復(fù)值,對所存儲(chǔ)的數(shù)據(jù)進(jìn)行數(shù)據(jù)壓縮。不是將該重復(fù)數(shù)據(jù)值寫到該數(shù)據(jù)存儲(chǔ)單元,而是配置該盤上數(shù)據(jù),以引用存儲(chǔ)在符號表中的每一重復(fù)數(shù)據(jù)值的拷貝。也公開了一種用于提高數(shù)據(jù)庫查詢語言語句性能的方法和機(jī)制。保持描述數(shù)據(jù)塊內(nèi)數(shù)據(jù)重復(fù)的信息。在一個(gè)實(shí)施例中,當(dāng)接收到針對該數(shù)據(jù)塊中的該數(shù)據(jù)的數(shù)據(jù)庫查詢語言語句時(shí),使用該數(shù)據(jù)重復(fù)信息來減少在該數(shù)據(jù)塊中的數(shù)據(jù)上進(jìn)行謂詞評估的次數(shù)。在另一個(gè)實(shí)施例中,使用該數(shù)據(jù)重復(fù)信息以減少被數(shù)據(jù)庫查詢語言語句訪問的數(shù)據(jù)量。文檔編號G06F17/30GK1666196SQ03815269公開日2005年9月7日申請日期2003年5月12日優(yōu)先權(quán)日2002年5月10日發(fā)明者德米特里·M·波塔波夫,塞廷·奧茲布藤申請人:甲骨文國際公司