本發(fā)明一般而言涉及數據庫技術。更具體而言,本發(fā)明針對用于響應于請求而訪問數據庫表的索引以及確定符合請求的數據庫表的最明確的數據記錄(行)。
背景技術:
給數據庫表加索引以便以直接或加速的方式訪問數據記錄是已知的。索引是一種元數據結構,它提高了對數據庫表的數據檢索操作的速度,但是以維護索引數據結構的存儲空間為代價。索引被用來快速定位數據,而不必在每次數據庫表被訪問時搜索數據庫表中的每一行。索引可以利用數據庫表的一個或多個列來創(chuàng)建,從而為快速隨機查找和有序記錄的高效訪問都提供基礎。
各種數據庫相關的應用中的特定任務是僅檢索數據庫表中作為滿足檢索請求的最明確行的行。因此,響應于請求,數據庫應用以最明確的方式確定數據庫表中對應于輸入參數或標準的一行。為此,一般在數據庫表中給出行之間明確性的層次結構。
用于確定數據庫表中最明確的一行的已知做法使用rete算法。rete算法是用于例如實現生產規(guī)則系統(tǒng)(例如,自動規(guī)劃、專家系統(tǒng)和行動選擇系統(tǒng))的模式匹配算法。它的使用是為了確定與輸入標準匹配的所有規(guī)則。之后,執(zhí)行所謂的“沖突解決”,其使用所確定的規(guī)則中的次序來識別要返回的一個規(guī)則。
技術實現要素:
本發(fā)明的目標是提供特別促進確定滿足檢索請求的輸入參數的一個最明確的數據庫表行的數據庫表索引。另一個目標是提供具有特別緊湊的數據表示的數據庫表索引,從而最小化存儲器需求。另一個目標是提供明確地解決現有技術水平的計算機系統(tǒng)的內部體系架構和存儲器維度并且被優(yōu)化以在處理器高速緩存中維護的數據庫表索引,從而促進最明確的數據庫表行的高性能確定。還有一個目標是提供使得能夠進行確定性響應處理的數據庫表索引。
根據一方面,通過確定數據庫表中最明確的一行的方法來解決這些目標。數據庫表由計算機系統(tǒng)維護。數據庫表由多行和多列形成。數據庫表的行和列形成單元格。每個單元格包括至少一個值或者不包括值。計算機系統(tǒng)還維護用于數據庫表的索引。
索引包括用于數據庫表的每一列的相應索引結構。每個索引結構包括兩種類型的子結構,即,用于在相應列中出現的每個值的相應指針元組陣列和與該列的沒有值的單元格相關的位圖。每個指針元組包括指示在列中出現的值之一的第一指針和指示該值在其中出現的數據庫表的行的第二指針。位圖指示相應列中沒有值的所有單元格。索引還指示數據庫表的行的明確性次序。
確定最明確的一行的方法包括以下活動:
計算機系統(tǒng)接收指示與相應輸入值相關聯(lián)的數據庫表的列的請求。然后,計算機系統(tǒng)以遞增方式針對請求中指示的每個列處理請求。對于每一列,計算機系統(tǒng)使用用于該列的索引結構的位圖來維護數據庫表中在所考慮列的單元格中不包含值的所有行。此外,對于每一列,計算機系統(tǒng)使用用于該列的索引結構的指針元組來過濾數據庫表中不包括相應輸入值的所有行。在已經處理了具有請求的相應輸入值的所有列之后,計算機系統(tǒng)從剩余的行(即,在列的遞增處理期間沒有被過濾的行)中選擇明確性次序中最高的一行。最后,計算機系統(tǒng)返回所確定的行的至少一個單元格的值。
根據另一方面,提供了一種布置成執(zhí)行確定數據庫表中最明確的一行的相應方法的計算機系統(tǒng)。
根據還有的另一方面,提供了一種用于指示計算機系統(tǒng)執(zhí)行確定數據庫表中最明確的一行的方法的計算機程序。
其它方面由從屬權利要求闡述。
附圖說明
本發(fā)明將參考附圖進行描述。類似的標號一般指示完全相同或功能相似的元件。
圖1示出了具有數據庫表的數據庫。
圖2是數據庫表和請求的通用例子。
圖3示出了如本文所述的索引的結構。
圖4示出了用于圖2的數據庫表的索引的通用例子。
圖5給出了利用索引的請求處理的通用例子。
圖6是示例性請求處理的流程圖。
圖7示出了存儲器中的指針元組的陣列的示例性布置。
圖8示出了指針元組的陣列上的二分搜索。
圖9示出了示例性索引生成。
圖10是包括索引生成和最明確行確定的整個過程的高級流程圖。
圖11示意性地示出了計算機系統(tǒng)的存儲器中數據庫表和索引的維護。
圖12示出了作為數據庫表的例子的路由表。
圖13是實現數據庫的計算機系統(tǒng)和/或請求客戶端的內部體系架構的示例性示意圖。
具體實施方式
本文描述的索引促進訪問由數據庫系統(tǒng)維護的數據庫表。本文使用的術語“數據庫”涵蓋以表的形式保存靜態(tài)或動態(tài)數據的所有種類的數據存儲庫。這些種類的數據存儲庫包括例如關系數據庫系統(tǒng)(諸如oracle數據庫、microsoftsqlserver、microsoftaccess),諸如postgresql的對象關系數據庫系統(tǒng),諸如專家系統(tǒng)和動作選擇系統(tǒng)引擎的生產規(guī)則系統(tǒng)(例如,維護用于技術設備的修復和維護動作的專家系統(tǒng)),網絡和控制元件,諸如路由器(具有路由表),網絡管理節(jié)點(具有在表中維護的日志和/或控制數據)或scada系統(tǒng)(也以表的形式維護日志和/或控制數據),以及在諸如microsoftexcel電子表格或制表符文本文件(例如,csv文件)等簡單表中保存數據的專有系統(tǒng)。
一般而言,數據庫在諸如數據庫服務器或網絡節(jié)點的計算機系統(tǒng)上實現。數據庫被布置成接收指定搜索標準(下文中稱為“輸入值”)的檢索請求(下文中簡稱為“請求”),以通過對照至少一個數據庫表檢查輸入值來處理請求、確定數據庫表中滿足輸入值的數據記錄并且返回這個數據記錄的一個或多個值。為此,數據庫使用任何類型的數據庫語言并且配備有本領域中已知的任何類型的通信接口。請求的發(fā)起者是例如查詢數據庫1的局域網(lan)中或遠程網絡中的客戶端(計算機、移動站、應用等)。
如圖1所示,數據庫1維護至少一個數據庫表2。數據庫表2由多個行3和多個列4構成。數據庫表的每個行3包括數據記錄,數據庫表的每個列4構成數據記錄的屬性,一般是根據數據模型(諸如關系數據庫管理模型)。行3和列4的組合形成單元格5。一般而言,數據庫表2中可以存在任何數量的行3和列4。由于可以添加或刪除數據記錄,因此尤其是行3的數量是不固定,而且可能隨時間變化。數據庫2還可以包括重新定義或更改數據模型的機制,即,列的數量也可以改變。
數據庫表的單元格5或者包含至少一個值或者不包含值(圖2)。單元格中的值一般是根據如數據模型規(guī)定的為相應列定義的數據類型。數據類型包括例如布爾(即,值為“真”和“假”)、整數、浮點數、字符、字符串、指針以及復雜的功能數據類型,諸如日期。在單元格5中可以存在多于一個值,即,單元格5可以包括值的向量或列表,例如,根據數據類型,以值的數組、記錄、集合、枚舉或的對象的形式。
沒有值的單元格5可以包括通配符,諸如null或*。這些通配符指定值不存在,即,相應的單元格被認為包括對于如數據模型規(guī)定的對應列的數據類型所允許的值范圍的任何值。利用通配符的數據記錄的例子是ip路由表中的標準路由,其在目的地地址列中利用網絡地址“0.0.0.0”并在子網掩碼列中利用子網掩碼“0.0.0.0”作為用于任何可能的目的地ip地址的通配符(參見圖12的路由表例子)。
圖2示出了具有六個行3(即,六個數據記錄)和七個列4(即,數據記錄具有七個屬性)的數據庫表2的通用例子。這個示例性數據庫表的列定義了由行保持的數據記錄的任何類型的屬性。第一列4a定義數據記錄的鍵屬性。第一行3a定義例如在列4b至4f中具有通配符“*”的默認數據記錄,并且最后一列4g中的“是”是布爾數據類型。因此,第一行3a指定“是”作為默認響應。其它行定義更明確的數據記錄。例如,第二行3b指定值“a,b”的元組作為第二列4b中的屬性,并且“否”作為數據記錄的最后一個屬性,而所有其它單元格包含通配符(忽略鍵列4a),即,用于這些屬性的任何值都落在行3b的數據記錄內。例如,數據模型可以定義值f、g、h、i、j和k作為第三列4c的允許數據范圍。因此,第二數據記錄的第三單元格(行3b,列4c)中的通配符代表第二數據記錄的這個屬性的所有可能的值f、g、h、i、j和k.
數據庫表2一般存儲在計算機系統(tǒng)的存儲器中,例如存儲在主存儲器(ram)中。
如開頭所闡述的,本文描述的數據庫表索引尤其被布置成允許確定對應于請求的最明確行。一般而言,比其它行包含更多通配符(即,更多單元格沒有值,更少單元格有值)的行被認為比包括更少通配符(即,更少單元格沒有值,更多單元格有值)的行更不明確。換句話說,包括更一般數據記錄的行被定義為比具有更明確內容的行更不明確,后者被定義為更明確。為了促進確定與請求的輸入值匹配的最明確行,給出或建立數據庫表2的行之間的明確性次序??蛇x地,明確性次序在行的排序中是隱含的。例如,如在圖2所示的數據庫表的例子中,在表內從不明確到非常明確對行進行排序。在一些實施例中,明確定義明確性次序,例如,通過指示行的明確性的相應級別的明確性列,諸如圖2中的數據庫表2的鍵列4a中的鍵值??蛇x地,明確性次序嚴格單調,即,數據庫表的每一行具有唯一的明確性次序。在其它例子中,定義明確性類,并且多行可以共享共同的明確性級別。在后面的例子中,給出一種機制,以確保作為具有相同明確性級別的成員的多行中僅一行滿足請求中的輸入值,例如,行定義互斥的數據記錄,并且在請求中指示用于數據庫表的最小行數的值。
響應于接收指示至少列和相應輸入值的請求,數據庫1利用包括在請求中的輸入值來處理請求,并將該輸入值與數據庫表2進行比較,以便確定滿足輸入值的最明確行。返回去參考圖2,接收通用示例性請求9。在圖2的例子中,明確性次序由列4a根據鍵值對行的排序來明確定義,行3a是最不明確的行(因為它包含五個通配符,并且僅在列4g中有一個值),而行3f是最明確的值(因為它不包含任何通配符,所有單元格都具有值)。在圖2的例子中,請求9指示五個列4b、4c、4d、4e和4f以及相應的輸入值。數據庫1確定最后一行3f是對應于請求9的最明確行,因為單元格4b/3f中的值“a”與用于列4b的輸入值a匹配,單元格4c/3f中的值“f”與用于列4c的輸入值f匹配,單元格4d/3f中的值“p,r”與用于列4d的輸入值p匹配,單元4e/3f中的值“w”與用于列4e的輸入值w匹配,并且單元4f/3f中的值“z”與用于列4f的輸入值z匹配。也與請求9的輸入值6相對應的另外兩行3a和3b不如行3f明確,因為它們在數據庫表2的隱式定義的明確性次序中排名較低。
在確定最明確行3之后,返回最明確行的至少一個值(屬性)。在圖2的例子中,返回行3f的列4g的值,即,布爾值“否”。
與請求相對應的最明確行的確定利用本文描述的索引10(圖3)。用于數據庫表2的索引包括以下組成部分:
-對于數據庫表的每一列4都有一個索引結構11,對于該索引結構,請求中的輸入值是預期的。因此,索引結構11在下文中也被稱為特定于列的索引結構。每個特定于列的索引結構11具有兩個元素,即
o指針元組12的陣列,及
o位圖13(如技術人員通常理解的,位圖是連續(xù)位的集合,即,位陣列)。
-指針元組12的陣列具有參考由相應特定于列的索引結構11所參考的列的列的單元格中的所有值的功能。陣列12中的每個指針元組14包括第一指針15和第二指針16。
o第一指針15參考(reference)包括在列中的值之一。該值存儲在托管數據庫1的計算機系統(tǒng)的存儲器中的某個特定位置。第一指針參考這個存儲器位置。
o第二指針16指示數據庫表2中出現該值的行。例如,該行由鍵值識別,鍵值也存儲在托管數據庫1的計算機系統(tǒng)的存儲器中的特定存儲器位置。第二指針參考這個存儲器位置。
因此,包括在陣列12中的指針元組14的數量對應于由相應特定于列的索引結構11參考的列中出現的值的數量。
-位圖13指定由相應特定于列的索引結構11參考的列中那些不具有值(即,包括通配符)的單元格。因此,位圖13也被稱為“無值位圖”。無值位圖13中的位數對應于數據庫表2的行3的數量。
圖4示出了索引10的例子。圖4所示的示例性索引涉及圖2的通用數據庫表例子。圖4所示的索引10由對應于圖2的數據庫表2的列4b至4f的五個索引結構11組成,對這些列預期輸入值6(在圖2的例子中具有布爾數據類型的列4g不能被請求–這個列的值是返回值)。每個索引結構11包含指針元組的陣列12和無值位圖13。
每一個特定于列的索引結構11中的指針元組的陣列12構成包括在數據庫表2的相應列中的所有值的緊湊列表。例如,索引結構11b中的陣列12b列出出現在列4b中的所有值a、b和c的存在。值a出現在具有鍵值r2、r4和r6的行中,值b出現在具有鍵值r2和r5的行中,值c出現在具有鍵值r3和r4的行中(參見圖2)。如上面所提到的,指針元組中的第一指針參考計算機存儲器中的值a、b和c的相應存儲器地址,而指針元組中的第二指針指示對應的行,即,在這個例子中參考行鍵值。對于索引結構11c至11f中的其它陣列12c至12f也是如此。
可選地,陣列12中的指針元組14通過由第一指針參考的值排序。在圖4中,例如,陣列12b中的指針元組通過出現在列4b中的值a、b和c排序。因此,陣列12b中的前三個指針元組定義值a在列4b中的出現,接下來的兩個指針元組定義值b在列4b中的出現,并且兩個最后指針元組定義值c在列4b中的出現。當利用索引10例如對指針元組執(zhí)行線性搜索時,對陣列12內的指針元組14進行排序促進了高效的存儲器訪問,因為當處理定義值的出現的第一指針元組時,相應的值僅需要從存儲器加載一次,然后在例如處理器高速緩存中可用于仍然與相同的值相關的后續(xù)指針元組。對指針元組14進行排序還促進對在一些實施例中使用的指針元組的二分搜索(下面參考圖8進一步解釋)。
位圖13提供了數據庫表2中沒有值的單元格的出現的緊湊表示。每個位圖13包括六個位,與圖2的例子中的數據庫表2中的行3的數量一致。通過定義,相應位圖中的位的序列對應于具有鍵值r1至r6的行的序列,即,每個位圖13中的第一位指的是具有鍵值r1的行,每個位圖中的第二位指的是具有鍵值r2的行,依此類推,并且每個位圖13中的最后一位指的是具有鍵值r6的最后一行。在圖4的例子中,被設置為“1”的位表示相應列中沒有值(即,具有通配符)的所有行,而被設置為“0”的位表示相應列中具有值(即,沒有通配符)的行。例如,位圖13b指示列4b中僅第一行(鍵值r1)不包括值,而其它行(鍵值r2至r6)包括值。這以類似的方式適用于對于列4c至4f中的無值單元格的其它位圖13c至13f。
如上所述的索引10表示特別緊湊的元數據結構(當與當前已知的現有技術索引相比時)。沒有值的單元格的位置不被存儲為指針元組14,而是以減少指針元組14的數量的位圖13的形式存儲。一個指針元組14的尺寸總是2的冪。例如,在現代64位存儲器體系架構中指針具有8字節(jié)的尺寸,相當于一個指針元組14是16字節(jié)的尺寸。由于對于2的冪大小的數字的整數乘法比對于不是2的冪大小的數字更加高效,因此索引10中的隨機訪問是高效的。對于某些類別的數據庫表(例如,具有1000個條目或更少條目的表),索引10將適合放在l1和/或l2cpu高速緩存中,并且因此可以使其在非??焖僭L問的存儲器中永久可用,并且因此有總體改進的請求處理和行確定的性能。此外,索引10促進用于確定最明確行的二分搜索算法,如下面(參考圖8)將進一步描述的。
索引10還指示數據庫表2的行3的明確性次序。為這種指示設想了各種方式。例如,如上面參考圖2所提到的,數據庫表2本身已經根據其明確性次序進行了排序,例如,從最低到最高明確性(也參見圖9中的活動38和圖10中的活動17)。在此類實施例中,數據庫表行的明確性次序隱含地存在于無值位圖13內的索引10中。如上面所解釋的,無值位圖13包括用于數據庫表2的每一行3的位并且位圖13中的位的次序對應于數據庫表2的行3的次序。因此,位圖13中相應的第一位指的是第一行(例如,圖2中的行3a),該行是例如最不明確的行,并且無值位圖13中相應的最后一位指的是最后一行(例如,圖2中的行3f),該行是例如數據庫表2的最明確行。在其它實施例中,數據庫表2的行不是通過明確性排序,而是索引10包括定義行3的明確性次序的單獨數據結構。例如,當生成索引10(參見圖9中的活動44)時,權重值7(參見圖3)與行3相關聯(lián),并且作為定義索引7內行3的明確性次序的元數據被明顯地維持。
響應于接收到請求9,托管數據庫1的計算機系統(tǒng)利用索引10如下確定最明確行。一般而言,對于在請求9中指示的每一列(以及相應的輸入值6),執(zhí)行按列處理請求的遞增過程。
從請求9中指示的第一列4(圖2的例子中具有輸入值“a”的列4b)開始,計算機系統(tǒng)使用用于第一列的索引結構11的位圖13(在圖2的例子中具有位圖13b的索引結構11b),以確保數據庫表2中不包含值的所有行3不被丟棄,因為這些行包括涵蓋任何輸入值的通配符。因此,在圖2和4的例子中,行r1(在位圖13b中由“1”指示)被明確地維持。就此,不關于位圖13b中標記有“0”的其它行做出維持或丟棄的決定。
接下來,除了根據無值位圖利用來維持行之外,用于第一列的索引結構11(在圖2的例子中具有指針元組12b的陣列的索引結構11b)的指針元組14被用來維護包括相應輸入值(圖2的例子中的輸入值“a”)的所有行3并且過濾掉數據庫表1中不包括輸入值6的所有行3。在圖2和4的例子中,維持在列4b中包括值“a”的所有行(即,行r2、r4和r6),而丟棄不包含輸入值“a”的其余行(行r3和r5)。
在一些實施例中,貫穿這個遞增過程簿記(book-keeping)維持和丟棄決定是基于指示仍然維持的行和已經丟棄的行的附加臨時位圖(被稱為結果位圖,在下面進一步詳細描述)的。
對于在請求9中指示的每個列4,重復這個過程。在每次迭代時,丟棄數據庫表2的零個、一個或多個行3。在請求9中指示的所有列4都已經被處理之后,符合請求中指示的輸入值的一個或多個行3保留。然后計算機系統(tǒng)通過利用索引10從剩余行中選擇明確性次序最高的一行3。在圖2和4的例子中,行3a、3b和3f(即,具有鍵值r1、r2和r6的行)滿足圖2中所示的示例性請求9的輸入值6。最明確行是行3f(鍵值r6)。在圖2和4的例子中,明確性次序通過也在索引10中(在位圖13中,以及在下面描述的結果位圖中)反映的行的排序來給出。因此,在圖2和4的例子中,計算機系統(tǒng)挑選具有最高鍵值的剩余行(其在位圖13中和下面描述的結果位圖中位于最右側)。
接下來,參考圖5描述遞增請求處理和行確定過程的實現例。這個例子再次重新使用圖2的示例性數據庫表2和如圖4中所示的對應索引10,后者在圖5的左手側繪出。一般而言,請求處理例基于兩個附加位圖來利用指針元組14和無值位圖,即,列位圖23和結果位圖25。列位圖23和結果位圖25都包括對應于數據庫表2中的行數的位數。列位圖23的目的是在通過列4和請求9中指示的對應輸入值6的每次迭代期間指示數據庫表2中包括相應輸入值的那些行3。結果位圖25的目的是貫穿整個遞增請求處理指示數據庫表中仍然是有可能滿足包括在請求9中的所有輸入值6的候選行的剩余行3并且,同時,指示數據庫表2中已經被過濾掉的所有行3,因為它們不與一個或多個輸入值6相對應。
請求處理開始于初始化結果位圖25,例如,將結果位圖25的所有位設置成“1”,而每個“1”指示與結果位圖25中的相應位相關聯(lián)的行3尚未被過濾掉,即,仍然是有可能滿足包括在請求9中的所有輸入值6的候選行。因此,在請求處理開始時,數據庫表2的所有行3都是有效候選。
接下來,通過關于第一列和相應輸入值6(在圖2和4的例子中:具有輸入值6b=“a”的列4b)的第一次迭代,這由利用相應索引結構(在這里:索引結構11b)的兩個活動形成。第一活動涉及確定數據庫表2的哪些行3滿足當前輸入值6b。第二活動涉及貫穿所有迭代被維持的剩余候選行的簿記。
關于第一活動,列位圖23b利用在當前迭代期間考慮的列4的無值位圖13(在這里:列4b,無值位圖13b)的位值來初始化。因此,在該例中,列位圖23b被設置成1-0-0-0-0-0并且因此指示行3a(鍵值r1)被明確地維持(因為它在列4b中包括通配符)。接下來,對于包括輸入值“a”的所有行,搜遍指針元組12b的陣列。在一些實施例中,這個搜索是二分搜索(以下參考圖8進一步解釋)。關于其它實施例,這個搜索是線性搜索。在該例中,在指針元組12b的陣列中的搜索產生具有鍵值r2、r4和r6的行在當前考慮的列4b中包括“a”。因此,對應于已經被確定為包括輸入值6b的行的列位圖23b中的位也被設置成“1”,因為它們滿足第一輸入值6b并且因此被維持。因此,在該例中,列位圖23b的第二、第四和第六位被設置成“1”,現在列位圖23b被設置成1-1-0-1-0-1,意味著第一、第二、第四和第六行(鍵值r1、r2、r4和r6)仍然是候選行,而第三和第五行(鍵值r3和r5)被過濾掉。就此,列位圖23b對于當前迭代指示滿足包括在請求9中的第一輸入值6b的所有行。
關于第二活動,所建立的列位圖23b與結果位圖25的當前版本組合,以便將當前迭代的行確定結果包括到候選行的整體簿記中。在該例中,所有剩余候選行都由設置成“1”的位指示,而所有過濾掉的行由設置成“0”的位指示。因此,在列位圖23b與結果位圖25的當前版本之間執(zhí)行邏輯按位and操作,從而導致結果位圖的更新版本25b。因此,在該例中,結果位圖的更新版本25b被設置成1-1-0-1-0-1。
這結束了關于請求9中指示的第一列和對應的輸入值6的第一次迭代。以相同的方式執(zhí)行后續(xù)的迭代。再次,在每次后續(xù)迭代期間,列位圖23利用相應無值位圖的位值(在該例中,無值位圖13c至13f,列位圖的初始化版本23c至23f)被重新初始化。然后,搜索指針元組的相應陣列(在該例中,陣列12c至12f)包括在請求9中的相應輸入值(在該例中,輸入值6c至6f)的出現。在列位圖23中將與包括相應輸入值6的行相對應的相應位設置成“1”。列位圖的相應結果版本23c-23f通過按位and運算與結果位圖的相應當前版本25c-25f組合。
在該例中,結果位圖25f的最終版本指示第一行、第二行和第六行滿足包括在請求9中的所有輸入值6。請求處理的最后活動涉及在迭代結束之后選擇剩余行中的最明確行。為此,利用索引10中明確性次序的指示。在該例中,明確性次序是通過數據庫表2的行3的排序給出的,這在無值位圖13中、列位圖23中和結果位圖25中的位(對應于行)的序列中反映。因此,在該例中,剩余候選行中最明確行由結果位圖的最終版本25f中最右邊的“1”(標號27)給出。
雖然這個請求處理涉及具有復雜度o(n)的多個操作,但是它具有若干有利的技術特性。僅需要有限量的存儲器空間來執(zhí)行操作。兩個附加位圖(列位圖23和結果位圖25)包括與數據庫表2的行數相對應的多個位。因此,對于具有1024行的數據庫表,列位圖23和結果位圖25各自具有128字節(jié)的尺寸。此外,請求處理是確定性的,因為數據庫列迭代的次數分別由數據庫表的列和請求中指示的列的數量來預定。因此,對于具有一定數量的行的數據庫表,每個請求處理的響應時間是確定性的。
此外,減少了用于從指針元組12的陣列搜索輸入值6的存在的查找操作和值比較操作(將輸入值與由相應的第一指針15參考的值進行比較)的次數,這有利于位圖操作(諸如邏輯按位and運算)。雖然位圖操作涉及o(n)次操作,但是n相對較小(對應于行3的數量),并且位圖操作一般充分利用現代計算機硬件的能力。例如,64位體系架構的各個匯編指令一次處理64位。此外,本請求處理具體地適用于配備有ooo(無序)計算單元的cpu,其具有在單個核心上每個時鐘周期執(zhí)行若干計算的能力,只要那些計算之間沒有依賴性。后一條件適用于位圖操作,因為在列位圖23和結果位圖25之間的整個and操作內每位的每個單獨and操作彼此獨立。
為了位圖操作的增加部分而減少搜索和查找操作的部分也具體地針對cpu的向量擴展布置,尤其是cpu配備了sse2(流simd擴展,simd=單指令多數據)指令集以便提供在一條匯編指令中處理128位的能力,配備了avx2(高級向量擴展)指令集以便在一條匯編指令中處理256位,或者avx-512(例如,intel的“knightslanding”一代)以便在一條匯編指令中啟用512位處理。例如,對于后一指令集,對于具有1000行的數據庫表2,在列位圖23和結果位圖25之間的按位and操作可以在兩個cpu周期內執(zhí)行。
這個請求處理的操作通過圖6的流程圖可視化。首先,在20,托管數據庫1的計算機系統(tǒng)接收請求9。響應于請求接收,在22初始化結果位圖25。然后,執(zhí)行遞增過程24。在針對每一列和在請求9中指示的相應輸入值6的逐列迭代中,基于相應的無值位圖13,在24a初始化列位圖23。然后,在24b,搜索指針元組的陣列12,以尋找包括相應輸入值6的當前列4的所有行3,并且相應地更新列位圖23。然后,在24c,列位圖23和結果位圖25的當前版本被組合,例如,通過邏輯按位and運算,以便獲得更新的結果位圖。在以這種遞增方式處理了請求9中指示的所有列4和相應輸入值6之后,在26選擇在結果位圖25的最終版本中指示的剩余行中的最明確行。最后,在35,返回所確定的最明確行的至少一個值。還有可能結果位圖在請求處理的最后一次迭代之后僅包含“0”位。在這種情況下,數據庫表的所有行都不滿足請求,因此返回值是“不匹配”值。
在一些實施例中,無值位圖13中的位指派是相反的(與圖4的例子相比),即,設置成“0”的位表示相應列中沒有值(即,具有通配符)的所有行,而設置成“1”的位表示相應列中具有值(即,沒有通配符)的行。在這些實施例中,列位圖23和結果位圖25中的位指派也被反轉,即,列位圖23中設置成“0”的所有位指示所考慮的列包括相應輸入值6的行3,并且結果位圖25中的每個“0”指示與相應位相關聯(lián)的行3尚未被過濾掉,即,仍然是有可能滿足包括在請求9中的所有輸入值6的候選行。因此,在這些實施例中,列位圖23和結果位圖25通過按位邏輯or運算組合。
在一些實施例中,遞增請求處理(圖6中的活動24)以及,特別地,搜索指針元組的陣列12以尋找輸入值的存在(圖6中的活動24b)包括在指針元組14內的二分搜索被連續(xù)地存儲在托管數據庫1(圖7和8)的計算機系統(tǒng)的存儲器中。圖7示出了指針元組14的通用例子,其在托管數據庫1的計算機系統(tǒng)的存儲器28中的某個位置處連續(xù)存儲。如由圖7的示意性表示可視化的,每個單指針元組14被連續(xù)地布置在存儲器28中指針元組12的陣列內,其間沒有間隙。指針元組14在存儲器28中的這種布置促進對第n個指針元組(即,關于陣列12的任何任意指針元組)的直接訪問,并因此促進對請求9的每次按列迭代的二分搜索。
圖8示出了用于圖6的活動24b的通用二分搜索例。如上面參考圖4所提到的,陣列12內的指針元組14通過由第一指針15參考的值排序(對于列4的相應數據類型排序,例如,對于字符和字符串的字母次序),從而使得能夠對指針元組14執(zhí)行二分搜索。根據分治原則,二分搜索算法進入陣列12的中間并且檢查由位于陣列12中間的指針元組14d的第一指針15d參考的值是否對應于輸入值6。因此,在圖8的例子中,輸入值“a”與由第一指針15d參考的值“d”進行比較。如果輸入值6低于由所考慮的第一指針15參考的值,則在上半部分(圖8中的陣列12的左半部分,即,具有第一指針15b)中重復相同的過程。如果輸入值6大于由所考慮的第一指針15參考的值,則在陣列12的下半部分中(圖8中的陣列12的右半部分,即,具有第一指針15f)重復相同的過程。
如由圖4和5的例子所示,有可能多個第一指針15參考相同的值。在圖7和8的例子中,第一指針15a和15b都參考值“a”。因此,如果輸入值6與由當前在二分搜索的特定階段所考慮的第一指針15參考的值之間的比較示出兩個值相等,則二分搜索在該點處尚未終止。相反,二分搜索繼續(xù)確定也參考輸入值6的潛在的另外的指針元組14和第一指針15。因此,在發(fā)現輸入值6與由第一指針15參考的值之間的匹配之后,檢查位于當前考慮的指針元組的左邊和右邊的相鄰指針元組14(只要它們存在),直到確定輸入值6與由相應的第一指針參考的值之間的不匹配,或者算法到達之前已經考慮過的指針元組14。在圖8的例子中,第一指針15b的檢查(在檢查第一指針15d之后執(zhí)行)產生輸入值“a”與由第一指針15b參考的值“a”之間的匹配。在這種情況下,然后確定第一指針15a和15c是否也參考值“a”。這對于第一指針15a是肯定的,而對于第一指針15c是否定的。因此,圖8的例子中的二分搜索8在已經發(fā)現值“a”存在于所考慮的列4的行r1和r4中之后終止。在二分搜索的執(zhí)行期間已經檢查了第一指針15d、15b、15a和15c。
由一些實施例采用的二分搜索具有o(logn)的計算復雜度,因此一般而言更高效,因為例如線性搜索具有復雜度o(n)。在一些實施例中,二分搜索以遞歸方式實現。在其它實施例中,二分搜索以迭代方式實現。
在一些實施例中,托管數據庫1的計算機系統(tǒng)被布置成從數據庫表2生成索引10。索引在數據庫表2第一次建立之后生成并且隨后響應于數據庫表2的變化(諸如單元格5中的一個或多個值的改變、一個或多個值被通配符替換或者反過來、添加或刪除行3或列4,等等)生成。
一般而言,索引生成包括為數據庫表2的每一列4建立索引結構11,對于這些列,請求9可以包括輸入值6。與索引10的結構相對應,這個過程主要包括兩個活動,即,每個索引結構11的無值位圖13的初始化和建立,并且利用指針元組14中相應的第一指針15和第二指針16建立指針元組的陣列12。
索引生成的例子由圖9示出??蛇x地,對于具有通過使數據庫表2的行3根據明確性次序排序而給出的明確或隱含明確性次序的實施例,在38,數據庫表2的行被排序(如果這沒有預先完成的話)。一般而言,數據庫表的行的排序取決于每一行3中沒有值(即,具有通配符)的單元格的數量和/或行3的單元格5中的值的明確性。更具體而言,在一些實施例中,數據庫表2的行3被加權。每個單元格有助于行的權重,其中沒有值的行添加比具有至少一個值的每個單元格更少的權重,并且在一些更具體的實施例中,具有更大量的值/更明確的值的單元格將向行添加比具有更少量的值/更不明確的值的單元格更少的權重。具有完全相同權重值的行的序列以任意方式選擇。在一些實施例中,明確性次序的指示由指示經排序的行的唯一行次序給出,諸如在圖2的例子中(列4a)。這種行次序指示可以充當數據庫表2的主鍵。
然后,實際的索引生成以可以由請求9參考的第一無值位圖13(例如,回頭參考圖4b的例子,涉及列4b的位圖13b)的初始化開始。位圖初始化涉及在例如托管數據庫1的計算機系統(tǒng)的主存儲器中例如分配所需的存儲器量并且例如將位圖13中的所有位最初設置成指示列4中沒有單元格沒有值的“0”。然后,在40,用指針元組填充指針元組的陣列12(例如,圖4的陣列12b)。對于出現在所考慮的列4的行3中的每個值,有一個指針元組14被添加到陣列12。在41,無值位圖13被更新,以便反映列中沒有值的所有單元格。例如,對應于沒有值的單元格的所有位被設置成“1”??蛇x地,在42,通過由相應的第一指針15參考的值來對陣列12中的指針元組14進行排序。在那時,用于第一列的索引結構11(即,例如,在圖4的例子中的索引結構11b)完全生成。在43,檢查數據庫表2是否具有要為其建立索引結構11的另一列。如果這是肯定的,則以相同的方式對這個另一列4(例如,圖4的例子中的列4c)重復活動39至42,直到已經為在請求9中指示的數據庫表的所有列4生成索引結構11。
可選地,在沒有經排序的行3的實施例中(即,未執(zhí)行活動38),在44創(chuàng)建明確指示行3的明確性次序的權重值7的陣列。在允許若干行共享相同權重值并且具有相同權重的若干行與請求9相對應的實施例中,具有相同權重的行中的任意一行被選擇為最明確行,或者給出僅允許具有相同權重的行的不相交的(disjoint)值組合的機制,其效果是在特定權重級別總是只有一行與請求9相對應。
圖10給出由托管具有至少一個數據庫表2的數據庫1的計算機系統(tǒng)執(zhí)行的整個過程的示例性高級流程。在17,數據庫表的行被排序,以便構成在索引10中反映的行的明確性次序。在18,生成索引10(參見圖9的例子)。在稍后的時間點,計算機系統(tǒng)接收請求9,該請求指示用于數據庫表2的列4的至少一個輸入值6。在19,基于索引10來處理請求,以便確定與請求9的(一個或多個)輸入值相對應的數據庫表2的所有行3,例如,通過圖6中所示的活動22和遞增活動24。在34,通過利用在索引10中反映的明確性次序,從作為活動19的輸出的剩余行中選擇最明確行,例如,以圖6所示的活動26的方式。在21,返回所選擇的最明確行的一個或多個值。
圖11繪出了在托管數據庫1的計算機系統(tǒng)100的存儲器內的數據庫1的各種數據的布置。計算機系統(tǒng)100具有可尋址存儲器30,其包括例如計算機系統(tǒng)100的主存儲器或操作存儲器(ram)。計算機系統(tǒng)100在可尋址存儲器30中維持數據庫表2,在一些實施例中是在ram中。請求處理和最明確行的確定由中央處理單元(cpu)31執(zhí)行。cpu31包括至少一級處理器高速緩存32,在一些實施例中包括具有不同尺寸和訪問速度的至少三級(l1高速緩存、l2高速緩存、l3高速緩存)。具有用于數據庫表2的列4的索引結構11的索引10也位于計算機系統(tǒng)100的可尋址存儲器30中,在一些實施例中位于至少一個處理器高速緩存級別之一當中。
本文給出的索引實現就存儲器要求/緊湊性而言優(yōu)于其它索引機制,如從以下與現有技術的索引實現的比較將變得清楚的。比較是基于具有1024行和5列的數據庫表2,其可以經受具有任意值的請求9。被用于比較的數據庫表包括66%無值單元格數量、10%具有多于一個值的單元格數量的典型比率,以及這些值的平均尺寸。相同的數據庫表2被用于要比較的所有實現。本文給出的索引實現與給數據庫表行加索引的兩種其它已知方式進行比較:
-紅黑樹(red-blacktree),這是一種已知的用于加索引的相關數據結構。實現基于c++std::map,具有gcc4.3.2stl。
-b-樹(b-tree),這是用于加索引的另一個相關數據結構,被用來改善存儲器中或盤上的數據位置。實現是基于“klib”的有吸引力的混亂(attractivechaos),已知其具有良好的性能(參見https://github.com/attractivechaos/klib/blob/master/kbtree.h)。選擇256個項的聚集因子,這是效率和緊湊性之間的良好折衷。
這三種做法示出用于不同索引的以下存儲器占用(所有值以字節(jié)表示)(1字節(jié)的精度):
當前技術發(fā)展水平的intelcpu的l1高速緩存的尺寸為32kb。因此,如本文針對具有1024及更多的數據庫表2給出的索引10的每個索引結構適合這個尺寸的l1高速緩存,而對于紅黑樹和b樹實現不是這種情況。
當前可用的l2高速緩存的尺寸是256kb。因此,本文針對具有1024及更多的數據庫表2給出的索引10的所有索引結構一起適合這個尺寸的l2高速緩存,而對于紅黑樹實現不是這種情況。雖然具有1024行的數據庫表2的基于b樹的索引適合這個尺寸的l2高速緩存,但是在l2高速緩存中實際上沒有剩余空間用于數據庫表2的值和簿記數據結構(諸如列位圖23和結果位圖25)。
雖然對于上面比較的所有三種索引實現,完整的索引元數據和完整的數據庫表2都適合l3高速緩存(幾mb,取決于cpu模型),但是應當指出,l3高速緩存在cpu核心之間共享并且經受同步開銷。因此,對l3高速緩存的訪問一般比對l1高速緩存的訪問(一般慢10至20倍)和對l2高速緩存的訪問(一般慢4至8倍)慢得多。因此,本文給出的索引10中固有的存儲器緊湊性允許在l1和/或l2高速緩存中維持完整的索引或至少索引的顯著增加的部分(與上面提到的其它兩個已知的索引實現相比),這構成請求處理機制的實質上增加的性能,以便確定與請求9相對應的數據庫表2的最明確行。
本文給出的索引10和基于索引10的請求處理機制可以應用到各種不同的數據庫和類似數據庫的系統(tǒng),例如具有路由表的路由器。圖12示出了ip路由器(即,位于osi參考模型的網絡層的路由器)的示例性路由表33,但是本索引10也可應用到任何其它或更明確類型的路由器,諸如邏輯路由器和軟件路由器(例如,企業(yè)服務總線,esb)、硬件路由器和主干路由器、高端交換機、dsl路由器、wifi路由器等。
圖12的路由表33是數據庫表2的簡單例子,具有五行五列。列從左到右定義目的地地址、子網掩碼、下一跳(例如,下一個路由器)、路由器的輸出網絡接口以及度量指示。如技術人員所知,目的地地址和子網掩碼一起形成網絡地址(子網掩碼指示構成網絡地址的前綴位范圍,而其余位形成主機地址)。傳入的要路由到目的地的ip分組形成請求9。路由器檢查傳入的ip分組的目的地ip地址并對照路由表33對其進行檢查。在這點上,路由器確定路由表中具有涵蓋傳入的ip分組的目的地地址的網絡地址(即,第一列中的目的地地址與第二列中的子網掩碼重疊)的最明確行33。具有至少一個表示目的地網絡地址(由與路由表33的第二列中的子網掩碼重疊的第一列的目的地地址形成)的索引結構11的索引10和上面詳細描述的請求處理被用來執(zhí)行與傳入的請求中的目的地ip地址相對應的最明確行的這種確定。例如,具有目的地地址192.168.1.23的ip分組被辨別為指向網絡192.168.1.0/24(24=子網掩碼225.225.225.0),即,第四行是與這個請求9相對應的路由表33的最明確行。另一方面,對于具有目的地號為123.123.123.123的ip分組,指定標準路由的路由表33的第一行將被確定為與這個請求9相對應的路由表33的最明確行。因此,這個ip分組將經由輸出網絡接口192.168.1.2被路由到下一跳192.168.1.1。
本文給出的索引10和基于索引10的請求處理機制也適用于其它數據庫或類似數據庫的系統(tǒng),諸如具有過濾表(例如,具有或不具有狀態(tài)檢查的分組過濾器、代理過濾器、內容過濾器)的防火墻、生產引擎、規(guī)則引擎(例如,指定用于技術設備的任何種類的錯誤癥狀的修復過程的修復存儲庫)、流引擎、事務驗證引擎等。
因此,計算機系統(tǒng)100是例如托管防火墻的網絡節(jié)點,在這種情況下,數據庫表2是過濾表,請求9是傳入的數據分組,并且過濾表的每一行構成用于允許或防止傳入的數據分組朝目的地被轉發(fā)的過濾規(guī)則。傳入的數據分組(例如,攜帶tcp或upd片段的ip分組,其攜帶應用層分組,諸如http請求)的值(諸如源和目的地ip地址、源和目的地端口地址)以及數據分組的特性(諸如數據分組是否屬于現有連接)對照由過濾表的行定義的過濾規(guī)則進行檢查。過濾表包括例如具有可能的目的地地址(諸如ip地址和/或端口地址)的至少一個目的地列,例如具有可能的源地址(諸如ip地址和/或端口地址)的一個或多個源列,例如具有指定傳入的數據分組的特性的值(諸如“已建立”指的是屬于已建立的連接的分組)的一個或多個列以及具有指示傳入數據分組是要轉發(fā)還是要丟棄的布爾值的列。最適用的(即,最明確的)過濾規(guī)則(即,行)是基于數據分組中的輸入值6確定的并且最后提及的列的對應值(即,是或否=接受或拒絕)被返回。
在計算機系統(tǒng)100是例如規(guī)則引擎的情況下,數據庫表2是規(guī)則表并且規(guī)則表的每一行構成回答請求的規(guī)則。規(guī)則表的列定義規(guī)則的標準。定義特定規(guī)則標準的請求的輸入值6對照規(guī)則表進行檢查,確定符合輸入值6的最明確的規(guī)則并返回所確定的規(guī)則表的最明確行的所請求的返回值。
最后,圖13是計算機系統(tǒng)100的圖解表示,其提供具有至少一個數據庫表2的數據庫1的功能。數據庫1可以包括指令集,以使計算機系統(tǒng)執(zhí)行如上所述由數據庫表1執(zhí)行的任何方法和活動。計算機系統(tǒng)100包括處理器101、主存儲器102和網絡接口設備103,它們經由總線104彼此通信。處理器101包括保持索引10的至少一部分的至少一個cpu高速緩存,如圖11和圖13中所示。主存儲器102包括數據庫1(即,實現數據庫系統(tǒng)的執(zhí)行軟件以及至少一個數據庫表2),并且可選地,數據庫表2的部分也被保持在處理器101的cpu高速緩存中??蛇x地,計算機系統(tǒng)100還可以包括靜態(tài)存儲器105和盤驅動單元106。視頻顯示器107、字母數字輸入設備108和光標控制設備109構成人機接口,以便操作計算機系統(tǒng)100。網絡接口設備103是將數據庫1連接到向數據庫1發(fā)出請求9的任何數量和種類的客戶端設備和應用的有線和/或無線接口??蛻舳丝梢择v留在互聯(lián)網和/或任何其它網絡上。網絡接口設備103利用諸如http/tcp/ip協(xié)議棧、ieee802.11和/或專用通信協(xié)議之類的標準通信協(xié)議。體現上述方法中任何一個或全部的指令集(即,軟件)110完全或至少部分地駐留在機器可讀介質中或機器可讀介質上,例如主存儲器102和/或具有至少一個cpu高速緩存的處理器101。除其它之外,指令尤其可以實現數據庫1處理傳入的請求9的功能,以確定與請求9相對應的數據庫表2的最明確行3,如圖6中所示,以及圖9的索引生成。軟件110駐留在其上的機器可讀介質還可以是作為盤驅動單元106的一部分的非易失性數據載體111(例如,不可移動磁性硬盤或者光學或磁性可移動盤)。軟件110還可以經由互聯(lián)網通過網絡接口設備103作為傳播信號112被發(fā)送或接收。
雖然本文已經描述了根據本發(fā)明的教導構造的某些產品和方法,但是本專利的覆蓋范圍不限于此。相反,本專利覆蓋字面上或按等同原則完全落入所附權利要求書的范圍內的本發(fā)明的教導的所有實施例。