(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-02-01
(54)【発明の名称】高速スキップリストパージ
(51)【国際特許分類】
G06F 16/23 20190101AFI20240125BHJP
G06F 16/22 20190101ALI20240125BHJP
【FI】
G06F16/23
G06F16/22
【審査請求】有
【予備審査請求】未請求
(21)【出願番号】P 2023546105
(86)(22)【出願日】2021-12-07
(85)【翻訳文提出日】2023-07-28
(86)【国際出願番号】 US2021062155
(87)【国際公開番号】W WO2022164514
(87)【国際公開日】2022-08-04
(32)【優先日】2021-01-29
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
(71)【出願人】
【識別番号】506332063
【氏名又は名称】セールスフォース インコーポレイテッド
(74)【代理人】
【識別番号】100107766
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100135079
【氏名又は名称】宮崎 修
(72)【発明者】
【氏名】へランド,パトリック ジェームス
(72)【発明者】
【氏名】マーチェ,ジェームス イー.
(72)【発明者】
【氏名】マンチェイル,スリドハール,アクシャイ
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175CA09
5B175KA08
(57)【要約】
スキップリストデータ構造を効率的に管理することに関する技術を開示する。いくつかの実施形態において、コンピューティングシステムは、複数のキー・値レコードであり、複数のキー・値レコードのうちの他のキー・値レコードへの1つ以上のポインタを含む、複数のキー・値レコード、を含むスキップリストを記憶する。コンピューティングシステムは、複数のキー・値レコードをキー順に走査して、スキップリストからパージされるキー・値レコードを識別する。走査は、走査によりまだ走査されていないキー・値レコードを指し示すポインタを含むキー・値レコードのリストを維持することを含む。パージするキー・値レコードを識別したことに応答して、コンピューティングシステムは、リストのキー・値レコードに含まれるポインタを、パージされているキー・値レコードに含まれるポインタに置換することにより、キー・値レコードをパージする。
【特許請求の範囲】
【請求項1】
コンピューティングシステムに動作を実施させることができるプログラム命令を記憶した非一時的コンピュータ読取可能媒体であって、前記動作は、
複数のキー・値レコードであり、前記複数のキー・値レコードのうちの他のキー・値レコードへの1つ以上のポインタを含む、複数のキー・値レコード、を含むスキップリストを記憶することと、
前記複数のキー・値レコードをキー順に走査して前記スキップリストからパージされるキー・値レコードを識別することであり、前記走査は、
前記走査によりまだ走査されていないキー・値レコードを指し示すポインタを含むキー・値レコードのリストを維持することを含む、ことと、
パージするキー・値レコードを識別したことに応答して、前記リストの前記キー・値レコードに含まれる前記ポインタを、パージされている前記キー・値レコードに含まれるポインタに置換することにより、前記キー・値レコードをパージすることと、
を含む、コンピュータ読取可能媒体。
【請求項2】
前記動作は、
前記キー・値レコードに関連づけられたデータベーストランザクションを実行する要求に応答して、前記キー・値レコードを前記スキップリストに挿入することと、
前記データベーストランザクションがコミットし、前記キー・値レコードがデータベースの永続ストレージに記憶されたことに応答して、前記キー・値レコードにフラグを設定して、前記キー・値レコードがパージされることを認可されていることを示すことと、
をさらに含み、
前記走査は、前記設定されたフラグに基づいて、パージする前記キー・値レコードを識別することを含む、請求項1に記載のコンピュータ読取可能媒体。
【請求項3】
前記走査は、
前記リストに含まれる第1のキー・値レコードのポインタが、現在走査されている第2のキー・値レコードを指し示していると判断することと、
前記判断に応答して、
前記リスト内の前記第1のキー・値レコードを前記第2のキー・値レコードに置き換えることと、
前記第2のキー・値が前記リストに含まれている間、メモリ内の前記第2のキー・値レコードの再配置を防止することと、
を含む、請求項1に記載のコンピュータ読取可能媒体。
【請求項4】
前記動作は、
前記走査が実行されている間に1つ以上のキー・値レコードを前記スキップリストに挿入すること
をさらに含む、請求項1に記載のコンピュータ読取可能媒体。
【請求項5】
前記動作は、
パージする前記キー・値レコードを識別したことに応答して、キー・値レコードの前記リストの検証を実行することであり、前記検証は、
前記リストの前記キー・値レコードに含まれる前記ポインタが、パージする前記キー・値レコードを指し示しているかどうかを判断することを含む、こと
をさらに含む、請求項4に記載のコンピュータ読取可能媒体。
【請求項6】
前記動作は、
前記挿入が、前記リストの前記キー・値レコードに含まれる1つ以上のポインタに、パージする前記キー・値レコードを指し示さないようにさせたと判断したことに応答して、前記キー・値レコードの前記パージを、後続の走査が実行されるまで遅延させること
をさらに含む、請求項5に記載のコンピュータ読取可能媒体。
【請求項7】
前記検証は、
前記走査を実行するプロセス以外のプロセスによる前記キー・値レコードの修正を防止するためのラッチを獲得することと、
前記リストの前記キー・値レコードに含まれる前記ポインタの、パージされている前記キー・値レコードに含まれるポインタによる前記置換の後まで、前記ラッチの獲得を維持することと、
を含む、請求項5に記載のコンピュータ読取可能媒体。
【請求項8】
前記動作は、
キー順の前記複数のキー・値レコードの前記走査の前に、
前記スキップリストを下方へ渡って前記複数のキー・値レコードのサブセットを識別することと、
前記識別されたサブセット内の前記キー・値レコードに基づいて、前記スキップリストをセクションに分割することと、
前記セクションを、前記セクションを並列に走査するために実行可能な複数のスレッドに割り当てることと、
をさらに含む、請求項1に記載のコンピュータ読取可能媒体。
【請求項9】
前記動作は、
前記複数のスレッドのうちの1つにより、走査のために割り当てられたセクションを受け取ることと、
前記スレッドにより、前記割り当てられたセクションを走査することであり、前記割り当てられたセクションを走査することは、前記割り当てられたセクションについて、未解決ポインタを有するキー・値レコードのリストを維持することを含む、ことと、
前記割り当てられたセクション内のパージするキー・値レコードを識別したことに応答して、前記スレッドが、前記割り当てられたセクションについてのキー・値レコードの前記リストを使用して、前記割り当てられたセクション内の前記キー・値レコードをパージすることと、
をさらに含む、請求項8に記載のコンピュータ読取可能媒体。
【請求項10】
前記スキップリスト内の前記複数のキー・値レコードのうちの第1のキー・値レコードは、ハッシュテーブル内のバケットを指し示す第1のポインタを含むことにより、前記スキップリスト内の前記複数のキー・値レコードのうちの第2のキー・値レコードを指し示し、前記バケットは、前記第2のキー・値レコードへの第2のポインタを含む、請求項1に記載のコンピュータ読取可能媒体。
【請求項11】
コンピューティングシステムにより、データベースのキー・値レコードに対するキーの順序付けを維持するスキップリストを記憶するステップと、
前記コンピューティングシステムにより、前記スキップリストからパージされるキー・値レコードを識別するステップであり、
前記スキップリストをキー順に走査して、前記キー・値レコードのうちのキー・値レコードがパージが許可されているという指標を含むかどうかを判断することと、
前記スキップリスト内のキー・値レコードの未解決ポインタを記録することであり、前記未解決ポインタは、前記走査によりまだ走査されていない前記キー・値レコードのうちのキー・値レコードを指し示す、ことと、
を含む、ステップと、
パージされるキー・値レコードを識別したことに応答して、前記コンピューティングシステムが、前記未解決ポインタのうちの未解決ポインタを、パージされている前記キー・値レコードに含まれるポインタに置き換えることにより、前記キー・値レコードをパージするステップと、
を含む方法。
【請求項12】
前記走査の前に、前記コンピューティングシステムが、前記スキップリストの最上部分をトラバースして並列走査のための前記スキップリストの区分を決定するステップと、
前記コンピューティングシステムにより、前記区分を、互いに並列に前記区分を走査するために実行可能な複数のスレッドに割り当てるステップと、
をさらに含む、請求項11に記載の方法。
【請求項13】
前記走査の間、前記コンピューティングシステムが、1つ以上のキー・値レコードを前記スキップリストに挿入するステップと、
パージされる前記キー・値レコードを識別したことに応答して、前記コンピューティングシステムが、前記1つ以上のキー・値レコードを挿入した後に、前記未解決ポインタのうちの未解決ポインタがパージされる前記キー・値レコードを依然として指し示していることを検証するステップと、
をさらに含む、請求項11に記載の方法。
【請求項14】
少なくとも前記未解決ポインタのうちの1つがパージされる前記キー・値レコードをもはや指し示していないと判断したことに応答して、前記キー・値レコードの前記パージを、前記スキップリストの後続の走査が実行されるまで遅延させるステップ
をさらに含む、請求項13に記載の方法。
【請求項15】
前記スキップリストは、前記データベースによるコミットメントを待つデータベーストランザクションのキー・値レコードに対するキーの順序付けを維持する、請求項11に記載の方法。
【請求項16】
コンピューティングシステムに動作を実施させることができるプログラム命令を記憶した非一時的コンピュータ読取可能媒体であって、前記動作は、
複数のキー・値レコードに対するキーの順序を保持するスキップリストを維持することと、
前記スキップリストをセクションに分割することであり、前記セクションは、前記スキップリストの最上部分をトラバースして前記セクションの境界として使用される前記キー・値レコードのうちのキー・値レコードを識別することにより識別される、ことと、
前記セクションを、前記スキップリストの割り当てられたセクションをキー順に走査して前記スキップリストからパージするキー・値レコードを識別するために並列に各々実行可能である複数のスレッドに割り当てることと、
を含む、コンピュータ読取可能媒体。
【請求項17】
前記動作は、
前記複数のスレッドのうちの第1のスレッドにより、前記第1のスレッドに割り当てられた前記セクションについての未解決ポインタのリストを維持することであり、前記未解決ポインタは、前記第1のスレッドによりまだ走査されていないキー・値レコードを指し示す、前記第1のスレッドにより走査されたキー・値レコードに含まれるポインタである、ことと、
パージする前記割り当てられたセクション内のキー・値レコードを識別したことに応答して、前記第1のスレッドが、前記未解決ポインタのうちの未解決ポインタを、パージされる前記キー・値レコードに含まれるポインタに置き換えることと、
をさらに含む、請求項16に記載のコンピュータ読取可能媒体。
【請求項18】
前記動作は、
前記割り当てられたセクションが前記複数のスレッドにより走査されたことに続いて、
前記セクションの境界として使用される前記キー・値レコードにアクセスして、パージする境界キー・値レコードのうちの境界キー・値レコードを識別することと、
パージする境界キー・値レコードを識別したことに応答して、前記スキップリストを下方へトラバースして、前記境界キー・値レコードがパージされていることに応答して更新されるキー・値レコードを識別することと、
をさらに含む、請求項17に記載のコンピュータ読取可能媒体。
【請求項19】
前記動作は、
キー・値レコードを、挿入されたキー・値レコードに対応するデータベーストランザクションがコミットメントを待っているときに前記スキップリストに挿入することと、
前記挿入されたキー・値レコードのうちの1つに対応するデータベーストランザクションがコミットしたことに応答して、前記挿入されたキー・値レコードにフラグを設定して、前記挿入されたキー・値レコードが前記スキップリストからパージされることを許可されていることを示すことと、
をさらに含む、請求項16に記載のコンピュータ読取可能媒体。
【請求項20】
前記スキップリスト内の前記複数のキー・値レコードのうちの第1のキー・値レコードは、ハッシュテーブル内のバケットへの第1のポインタを含むことにより前記複数のキー・値レコードのうちの第2のキー・値レコードを間接的に指し示し、前記バケットは、前記第2のキー・値レコードへの第2のポインタを含む、請求項16に記載のコンピュータ読取可能媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、一般にデータ記憶に関し、より具体的には、スキップリストデータ構造を操作することに関する。
【背景技術】
【0002】
コンピュータサイエンス分野では、情報の記憶を容易にするために様々な複雑なデータ構造が開発されてきた。これらのデータ構造は、しばしば、レコードの集合を一緒に結合するために複数のポインタを使用して構成される。複雑な構造を設計するとき、開発者は、しばしば、全体的なデータ構造サイズだけでなく、情報の挿入及び取り出しの複雑さに関連する懸念を熟考する。スキップリストは、より複雑なデータ構造の一例であり、これは、O(log n)の挿入複雑度及びO(log n)の探索複雑度を依然として提供しながら大規模データセットを維持することができるため、一般的であり得る。このタイプのデータ構造では、レコードはキー順に基づいてソートされ、データレコードシーケンスのリンクされた階層を使用して関連づけられ、各連続シーケンスは、前のシーケンスより少ない要素をスキップする。このリンクされた階層は、様々な高さのポインタタワーを使用して実施され、それにより、所与のタワー内で、ポインタは、スキップされたレコードの数に基づいて配置され得る。スキップリストがトラバースされるときにレコードをスキップするこの能力は、レコードを順次走査するより迅速に所与のレコードが位置を特定されることを可能にし得る。
【図面の簡単な説明】
【0003】
【
図1】同時データベーストランザクションを処理するためにバッファデータ構造内でスキップリストを使用するデータベースシステムの1つの実施形態を示すブロック図である。
【
図2】バッファデータ構造内のレコードチェーンの1つの実施形態を示すブロック図である。
【
図3】バッファデータ構造内のスキップリストの1つの実施形態を示すブロック図である。
【
図4】スキップリストからレコードをパージするための低速パージプロセスの1つの実施形態を示すブロック図である。
【
図5A】スキップリストからレコードをパージするための高速パージプロセスの実施形態を示す図である。
【
図5B】スキップリストからレコードをパージするための高速パージプロセスの実施形態を示す図である。
【
図5C】スキップリストからレコードをパージするための高速パージプロセスの実施形態を示す図である。
【
図5D】スキップリストからレコードをパージするための高速パージプロセスの実施形態を示す図である。
【
図6】スキップリストのパージを実行するパージエンジンの1つの実施形態を示すブロック図である。
【
図7】スキップリストからレコードをパージするための並列高速パージプロセスの1つの実施形態を示す図である。
【
図8A】スキップリストからレコードをパージすることに関連する方法の実施形態を示すフロー図である。
【
図8B】スキップリストからレコードをパージすることに関連する方法の実施形態を示すフロー図である。
【
図8C】スキップリストからレコードをパージすることに関連する方法の実施形態を示すフロー図である。
【
図9】例示的なコンピュータシステムの1つの実施形態を示すブロック図である。
【発明を実施するための形態】
【0004】
いくつかの例において、スキップリストは、頻繁に操作される大量の情報を維持するために使用されることがある。例えば、以下でさらに詳細に説明するように、データベースシステムは、データベーストランザクションがコミットされ、それらのデータがデータベースシステムの永続ストレージにフラッシュされ得るまで、アクティブデータベーストランザクションのデータを記憶するためにバッファデータ構造を使用することがある。バッファデータ構造は、キー順でのトランザクションレコードの効率的な記憶及びルックアップを可能にするスキップリストデータ構造を含むことができる。このデータベースシステムがハイボリュームのトランザクションを並列に処理する可能性があるとき、スキップリストの効率的な維持は、データベース性能にとって重要であり得る。
【0005】
本開示は、高速パージアルゴリズムを用いて、レコードがもはや使用されなくなったときにそれらをスキップリストから効率的にパージする(purge)実施形態について説明する。様々な実施形態において以下に説明するように、スキップリストのキー・値レコードは、パージするキー・値レコードを識別するためにスキップリストの最も低いレベルを渡る(walking)ことによりキー順に走査される。(本明細書で用いられるとき、「キー・値レコード(key-value record)」は、キーにより識別され、対応する値を含むレコードを指し、キーと値は集合的に「キー・値ペア」と呼ばれる。)レコードが走査されるとき、レコードは、それらがパージされる準備ができているかどうかを判断するために、いくつかの実施形態では、パージが許容されているときを示すために設定されたフラグを調べることにより、調べられる。ポインタ情報が、ポインタタワーに含まれるポインタに対して記録され、これらのポインタが解決される(すなわち、これらのポインタにより指し示されるレコードが走査される)まで維持される。パージのためにレコードが識別された場合、そのキー・値レコードは、現在未解決のポインタのうちの1つ以上を、パージされているキー・値レコードに含まれるポインタに置換することにより、パージされる。論じられるように、スキップリストをキー順に走査し、未解決ポインタを追跡するこのアプローチは、レコードがパージされているときにどのポインタが更新されるべきかを判断するためにスキップリストを下方へトラバースする(traversing)ことに依存するアプローチなどの他のアプローチよりも有意により少ないメモリアクセスを結果としてもたらすことができる。
【0006】
さらに、スキップリストが複数のスレッドにより並列に走査されるセクションに分割される、高速並列パージアルゴリズムについても論じられる。(本明細書で用いられるとき、フレーズ「並列に」は、少なくとも一部分の時間の間に重なるように実行される2つ以上の動作(又は、同じ動作の2つ以上のインスタンス)を指す。)様々な実施形態で論じられるように、スキップリストセクションは、スキップリストの最上部分をトラバースして、これらのセクションの境界を形成することができるキー・値レコードを識別することにより、決定することができる。これらのセクションは、高速パージアルゴリズムを使用してそれらの割り当てられたセクションを並列に走査することができる別個のスレッドに割り当てることができる。セクションがスレッドにより走査された後、パージのために識別されているセクション境界におけるレコードは、スキップリストを下方へトラバースしてどのスキップリストポインタが更新されるべきかを識別することにより、パージすることができる。
【0007】
本開示は、スキップリストを維持し、高速パージアルゴリズムを使用することができる、
図1及び
図2に関連したデータベースシステムの議論で開始する。
図3に関連して、一例示的なスキップリストについて論じる。次いで、
図4に関して、レコードをパージするためのより効率的でないアルゴリズムについて論じる。
図5A~
図6に関して、高速パージアルゴリズムについて論じる。
図7で、複数のスレッドを使用する並列高速パージアルゴリズムについて論じる。最後、
図8A~
図9に関して、方法及び例示的なコンピューティングシステムについて論じる。
【0008】
次に
図1を参照し、データベースシステム10のブロック図を示す。例示の実施形態において、データベースシステム10は、トランザクションマネージャ104、バッファデータ構造106、及びデータベース108を含む。図示のように、バッファデータ構造106は、複数のレコードチェーン110、ハッシュテーブル120、アクティブトランザクションリスト130、及びスキップリスト140を含む。レコードチェーン110は、キー・値レコード112を含む。ハッシュテーブル120は、ハッシュ関数122と、各々がラッチ126を含むハッシュバケット124の配列とを含む。(本明細書で用いられるとき、用語「ラッチ」、「ロック」、及び「セマフォ」は、一般に、複数の潜在的な消費者間で共有されるリソースへのアクセスを制御する変数を指すために使用される。)例示の実施形態において、マネージャ104は、パージエンジン150をさらに含む。いくつかの実施形態において、データベースシステム10は、図示したものとは別様に実装されてもよい。例えば、いくつかの実施形態において、バッファデータ構造106は、より多くの(又は、より少ない)構造を含むことができる。
【0009】
トランザクションマネージャ104は、1つの実施形態において、受け取ったデータベーストランザクション102を処理するために実行可能であるプログラム命令を含む。一般に、トランザクション102は、データベース108に対してデータを読み取り又は書き込むために発行されることがあり、1つ以上のクライアントデバイス、アプリケーションサーバ、データベースシステム10上で実行されているソフトウェアなどの様々なソースのうちの任意のものから受け取ることができる。以下により詳細に説明するように、この処理は、マネージャ104が、トランザクション102のキー・値ペアのためのレコード112を、レコード112をデータベース108の永続ストレージにフラッシュできるまで、バッファデータ構造106に最初に記憶することを伴う。したがって、バッファデータ構造106に関して以下に説明する様々な機能は、トランザクションマネージャ104により実施することができ、例えば、キー・値レコード112をレコードチェーン110に追加すること、トランザクション102のためのハッシュバケットラッチ126の獲得を容易にすること、アクティブトランザクションリスト130及びスキップリスト140に対する修正等である。
【0010】
バッファデータ構造106は、1つの実施形態において、トランザクションがコミットする(commit)までアクティブトランザクションのためのキー・値ペアをバッファリングするデータ構造である。以下で説明するように、バッファデータ構造106は、キー・値ペアの迅速な挿入を可能にするように構造化され、これは、いくつかの例において同時に実行することができ、ハイボリュームのトランザクションが効率的に処理されることを可能にする。またさらに、バッファデータ構造106は、ローカルメモリ内に存在することができ、データが長期間存在するデータベース108の永続ストレージより高速な読み取り及び書き込みを可能にする。様々な実施形態において、バッファデータ構造106は、異なるトランザクション102のために同時修正がそれに対して実行されることを可能にするが、バッファデータ構造106内のデータに対してハッシュバケットラッチ126を介した同時制御メカニズムを提供する。いくつかの実施形態において、コミットされたトランザクションデータは、バッファデータ構造106からデータベース108の永続ストレージに非同期的にフラッシュされる。すなわち、各トランザクション102のデータについて、そのコミットメントに際しフラッシュを実行するのでなく、フラッシュは、周期的に、複数のコミットされたトランザクション102に対して実行される。例えば、1つの実施形態において、トランザクションマネージャ104は、バッファデータ構造106が特定のサイズ閾値を満たしていることに応答して、データベース108へのフラッシュを開始する。
【0011】
データベース108は、任意の適切な形態のデータベース実装に対応することができる。いくつかの実施形態において、データベース108は、永続ストレージのためのログ構造化マージ(log-structured merge、LSM)ツリーを使用して実装されている関係データベースである。いくつかの実施形態において、LSMツリーのレイヤは、永続ストレージを提供する複数の物理コンピュータシステムにわたって分散されてもよい。いくつかの実施形態において、これらのコンピュータシステムは、複数のクライアントにとってアクセス可能なクラウドベースのシステムを提供するコンピュータクラスタのクラスタノードである。いくつかの実施形態において、データベース108は、ソフトウェアアズアサービス(software as a service、SaaS)モデルの一部でもよく、他の実施形態において、データベース108は、ユーザにより直接操作されてもよい。
【0012】
上述したように、トランザクションマネージャ104がアクティブトランザクション102のキー・値ペアをバッファデータ構造106に記憶するとき、対応するキー・値レコード112が作成され得、これは値とキーを含む。複数のトランザクション102が同じキーに関連づけられた値を書き込もうとする場合、キー・値レコード112が各値について生成され、一緒にリンクされて、キーに対応するレコードチェーン110を形成し得る。例えば、ユーザが銀行口座から、第1のデータベーストランザクション102を結果としてもたらす第1の金額と、次いで第2のデータベーストランザクション102を結果としてもたらす第2の金額を引き出した場合、口座残高キーに対応するレコードチェーン110は、これらの引き出しを反映する2つのキー・値レコード112を有し得る。様々な実施形態において、各レコード112は、その関連するトランザクション102を指定するトランザクション識別子(例えば、トランザクションシーケンス番号)を含み、レコード112はさらに、トランザクション102が受け取られた順序付けに基づいてレコードチェーン110に編成され得る。例えば、
図2に関して以下に説明するように、レコードチェーン110は、リンクリスト(linked lists)を使用して実装されてもよく、それにより、新しいレコード112は、リンクリストの先頭に挿入され、より新しいレコード112が作成されてより古いものがデータベース108にフラッシュされるときに末尾へ移行する。キー・値レコード112への迅速なアクセスを容易にするために、レコードチェーン110は、ハッシュテーブル120のハッシュバケット124にアペンドされる(appended)。
【0013】
ハッシュテーブル120は、1つの実施形態において、キーを与えられることに基づいてレコードチェーン110の一定時間のルックアップを可能にするデータ構造である。すなわち、キーが受け取られたとき、ハッシュテーブル120は、キーにハッシュ関数122を適用してキーに対応するハッシュバケット124に対する適切なインデックス値を生成することにより、インデックスを付けられる(indexed into)。その後、ハッシュバケット124内の直接ポインタを参照して、レコードチェーン110を取得することができる。一定時間のルックアップを実行できることは、キー・値レコード112を読み取り、レコード112を書き込み、又はキー探査(すなわち、キーがバッファデータ構造106内に存在するキー・値レコード112を有するかどうかを判断すること)を実行するために消費される時間を有意に削減し得る。
【0014】
上述したように、様々な実施形態において、各ハッシュバケット124は、そのレコードチェーン110へのアクセスを制御するそれぞれのラッチ126を含む。したがって、トランザクションが特定のキーに関連づけられた値を読み取り又は書き込みしようとしているとき、このキーは、読み取り又は書き込みが実行される前に、ハッシュテーブル120にインデックスを付け、キーの関連するハッシュバケット124に対応するラッチ126を獲得するために使用することができる。データベーストランザクション102に対してラッチ126を獲得できない場合、データベーストランザクション102を処理することは、ラッチ126が解放されるまで遅延されてもよい。いくつかの実施形態において、ラッチ126は、3つのとり得る状態、すなわち、利用可能、共有獲得、及び排他的獲得のうちの1つを有することができる。トランザクション102が現在レコードチェーン110にアクセスしていない場合、そのラッチ126は獲得に利用可能である。トランザクション102がキー・値レコード112の読み取りを実行している場合、ラッチ126は共有状態で獲得されてもよく、これは、他のトランザクション102もまた、それらも読み取りを実行している(すなわち、レコード112が読み取られてもいる間、それを修正しようとしていない)限り、ラッチ126を獲得できることを意味する。しかしながら、トランザクション102が書き込みを実行している場合、ラッチ126は、排他状態でトランザクション102に対して獲得され、これは、他のトランザクション102が、ラッチ126が解放されるまでそれを獲得できないことを意味する。したがって、2つのトランザクション102が、同じキーに対して書き込みを実行しようとしている場合、後のトランザクションは、前のものがその書き込み操作を完了してラッチ126を解放するまで遅延される。トランザクション102が、複数のキー・値ペアにアクセスしようとしている場合、ラッチ126は、デッドロックを防止するためにバケット124の昇順で獲得されてもよい。ラッチ126の獲得は、主に読み取り及び書き込み操作に関して論じられ得るが、ラッチ126はさらに、デフラグメンテーション、ガベージコレクション、レコード112をデータベース108の永続ストレージにフラッシュすることなどの他の操作を実行するときに獲得されてもよい。いくつかの実施形態において、ラッチ126はさらに、アクティブトランザクションリスト130及びスキップリスト140に対する同時制御メカニズムとして機能することができる。
【0015】
アクティブトランザクションリスト130は、1つの実施形態において、アクティブトランザクション102についての様々なメタデータを追跡するデータ構造である。様々な実施形態において、所与のトランザクション102のメタデータは、トランザクション102のトランザクション識別子と、トランザクション102に関連づけられたレコード112にアクセスするために使用可能な1つ以上のポインタとを含む。そのようにすることで、リスト130は、トランザクション102のレコード112がそのトランザクション識別子に基づいて識別されることを可能にし、これは、例えば、トランザクション102がロールバックされている場合にどのレコード112が除去されるべきかを判断するときに有用であり得る。メタデータは、トランザクションがアクティブであるか又はコミットされているかの指標をさらに含んでもよく、これは、そのレコード112がデータベース108へのフラッシュのためにマークされてもよいかを判断するために使用することができる。
【0016】
スキップリスト140は、1つの実施形態において、キーの順方向及び反対の走査を可能にするためにレコード112内のキーの順序付けを維持するデータ構造である。いくつかの実施形態において、データベース108は、コミットされたトランザクション102のレコード112が昇順キー順(及び、バージョン順)でフラッシュされるように構成することができ、スキップリスト140は、この順序付けが迅速かつ容易に決定されることを可能にし得る。
図3に関して以下により詳細に説明するように、いくつかの実施形態において、スキップリスト140は、スキップリスト140のレコード112にアクセスするための間接ポインタを含む。すなわち、レコード112間の直接ポインタ(すなわち、レコード112のメモリアドレスを指定するポインタ)を有するのでなく、スキップリスト140は、チェーン110への直接ポインタを含むハッシュバケット124への間接ポインタを含む。有利なことに、新しいレコード112がレコードチェーン110に追加された場合、ハッシュバケット124内の直接ポインタが更新され、スキップリスト140内の間接ポインタは更新されない。間接ポインタの使用はさらに、リスト140に関してレコード112を操作するとき、スキップリスト140がハッシュバケットラッチ126を活用することを可能にし得る。したがって、トランザクション102に対するレコード112が、修正又は除去のためにスキップリスト140を通じてアクセスされている場合、他の修正が実行されることを防止するために、レコード112のキーに対してラッチ126を獲得することができる。
図1ではレコード112と別個に示されているが、スキップリスト140の部分は、いくつかの実施形態において、
図2及び
図3に関して論じられるようにレコード112に存在してもよい。
【0017】
コミットされたトランザクション102に対するレコード112がフラッシュされるとき、レコード112の内容は、それらがデータベース108の永続ストレージに成功裏に書き込まれたことを確認できるまで、バッファデータ構造106に残存し続けることができる。次いで、レコード112は、それらの内容がもはや必要とされ得ないとき、及び新たに到来するデータベーストランザクション102に対してバッファデータ構造106内のさらなるスペースを空けるため、パージのためにフラグを立てられ(flagged)得る。このパージを容易にするために、レコードチェーン110、アクティブトランザクションリスト130、及びスキップリスト140を実装するために使用されるポインタは、更新される必要があり得る。
【0018】
パージエンジン150は、1つの実施形態において、これらのポインタの更新を含むレコード112のパージを取り扱うトランザクションマネージャ104のコンポーネントである。様々な実施形態において以下により詳細に説明するように、パージエンジン150は、スキップリスト140からレコード112を識別及びパージするための高速パージアルゴリズムを実装する。上述したように、これは、パージエンジン150がスキップリスト140をキー順に走査して、キー・値レコード112のうちのキー・値レコードがパージのためにフラグを立てられたかどうを判断することを含むことができる。この走査の一部として、パージエンジン150は、未解決スキップリストポインタのリストを維持し、パージされるキー・値レコード112を識別したことに応答して、他のレコード112内の未解決ポインタを、パージされているキー・値レコード112に含まれるスキップリストポインタに置換することができる。様々な実施形態において、パージアルゴリズムはさらに、データベースシステム10に対するパージエンジン150の影響を低減するために、走査が進行中である間、トランザクションマネージャ104がレコード112をスキップリスト140(より一般的には、バッファデータ構造106)に挿入し続けることを可能にするように実装される。論じられるように、レコード112の挿入が、問題を生じるような方法でレコード112のパージと干渉しないことを確実にするために、パージエンジン150は、ラッチ126の獲得、レコード112をピン留めすること、及びポインタ置換を実行する前に未解決ポインタ情報を検証することをさらに管理してもよい。いくつかの実施形態において、パージエンジン150は、上述し、以下により詳細に論じられる並列高速パージアルゴリズムを実装するために、実行スレッドのスレッドプールをさらに管理してもよい。
【0019】
次に、後に詳細に論じられる高速パージアルゴリズムのより良い理解を容易にするために、スキップリスト140を実装するために使用されるものを含むレコード112の内容についてより詳細に論じる。
【0020】
次に
図2を参照し、レコードチェーン110のブロック図を示す。図示のように、レコードチェーン110は、キー・値レコード112A~112Cの集合、衝突レコード220、及びロックレコード230を含むことができる。レコード112は、キー212、値213、トランザクション識別子214、コミット識別子215、パージフラグ216、ロック217、スキップリストポインタ218、及びレコードチェーンポインタ219をさらに含むことができる。いくつかの実施形態において、チェーン110は、図示されるものより多くの(又は、少ない)レコード112、220、又は230を含んでもよく、所与のレコード112は、図示されるものより多くの(又は、少ない)要素212~219を含んでもよい。
【0021】
例示の実施形態において、レコードチェーン110は、各キー・値レコード112がチェーン110内の次のレコード112を識別するポインタ219を含むように、リンクリストを使用して実装される。レコード112が追加されるとき、それは、ハッシュバケット124内の直接ポインタ202により識別される先頭に挿入されるか、あるいは以下で論じられる衝突レコード220にアペンドされる。次いで、追加されたレコード112は、前に先頭にあったレコードへのポインタ219を含むことができる。レコード112がより古くなると、それは、そのトランザクション102がコミットするまで、末尾(
図2におけるレコード112B又はロックレコード230)に向かって移行する。次いで、それは、データベース108の永続ストレージにフラッシュされ、除去され得る。所与のレコード112のトランザクション識別子214は、レコード112が関連づけられているトランザクション102を識別するだけでなく、トランザクション102が受け取られた順序付けを示すこともできる。したがって、レコード112Bが、レコード112Aより先頭から遠いため、トランザクションID214Bは、トランザクションID214Aより前のトランザクション102に対応し得る。トランザクションID214Bに対応するトランザクション102がロールバックされることになる場合、トランザクションマネージャ104は、直接ポインタ202を参照してチェーン110の先頭を識別し、対応するトランザクションID214Bを有するレコード112Bを見つけるまでレコード112A及び220をトラバースすることにより、レコード112Bの位置を特定することができる。次いで、レコード112Bは除去され得、ポインタ222Aはポインタ219Bと同じアドレスを有するように修正され得る。いくつかの実施形態において、トランザクション102がコミットした場合、そのレコード112に対するコミット識別子215は、コミットメントを反映し、レコード112をデータベース108の永続ストレージにフラッシュする準備ができているものとしてマークするために設定することができる。レコード112は、どのレコード112がコミット識別子215を有するかを識別するため、及びどのレコード112がデータベース108にフラッシュされ得るかを判断するために、トランザクションマネージャ104のプロセスによって後に走査され得る。
【0022】
いくつかの実施形態において、キー・値レコード112が永続ストレージに成功裏にフラッシュされると、トランザクションマネージャ104は、パージフラグ216を設定して、レコード112がバッファデータ構造106からパージする準備ができていることを示す。上述したように、パージエンジン150は、レコード112がバッファデータ構造106からパージされるべきかどうかを判断するために、このフラグ216を読み取ることができる。
【0023】
いくつかの実施形態において、衝突レコード220は、2つの異なるキー(例えば、キー212A及び213C)が同じハッシュ値を生成し(すなわち、ハッシュ衝突が発生し)、したがって同じハッシュバケット124を共有するとき、チェーン110にレコード112をアペンドするために使用される。様々な実施形態において、ハッシュテーブル120のサイズは、衝突の低い可能性を確実にするために、十分な数のハッシュバケット124を有するように選択される。しかしながら、ハッシュ衝突が発生した場合、異なるキー212を有するレコード112へのポインタ222を含むレコード220が挿入されてもよい。多くの例において、ハッシュバケットラッチ126は単一のそれぞれのキー212に特有であるが、そのような場合には、ハッシュバケットラッチ126は複数の異なるキー212に関連づけられることになる。
【0024】
上述したように、いくつかの実施形態において、個々のレコード112は、さらなるコヒーレンシー制御を提供するために、それら独自のそれぞれのロック217をさらに含むことができる。いくつかの実施形態において、対応する値がないときに特定のキーに結び付けられたロックを作成するために、別個のロックレコード230がレコードチェーン110に挿入されてもよい。
【0025】
スキップリストポインタ218は、1つの実施形態において、スキップリスト140を形成するポインタである。次に
図3で論じられるように、所与のレコード112内のポインタ218は、データレコードシーケンスのリンクされた階層を実装するポインタタワーを形成することができ、各連続シーケンスは、前のシーケンスより少ないレコード112をスキップする。いくつかの実施形態において、ポインタ218はさらに、レコード112の物理アドレスへの直接ポインタを使用することなく、キー・値レコード112がスキップリスト140内で一緒にリンクされている間接ポインタを使用して実装される。その代わりに、ポインタ218は、レコード112を含むレコードチェーン110を指し示すハッシュバケット124を参照する。様々な実施形態において、間接ポインタを使用することは、所与のレコード112に対して1つの直接ポインタのみが維持され得るため、ポインタ管理を大幅に簡素化する。すなわち、ハッシュバケット124の位置が同じままであるため、間接ポインタは、レコード112が例えばレコードチェーン110内のより後の位置に移動された場合に更新されない。
【0026】
次に
図3を参照し、スキップリスト140のブロック図を示す。上述したように、様々な実施形態において、スキップリスト140は、レコード112に記憶されたキー212の順序付けを維持するために使用することができ、これは、コミットされたトランザクション102のレコード112を昇順キー順でフラッシュするために使用することができる。例示の実施形態において、レコード112内のスキップリストポインタ218はタワー300を形成し、これは、他のレコード112内のタワー300を指し示す。
【0027】
特定のキー212がスキップリスト140内で探索されているとき、スキップリスト140のトラバーサル(traversal)は、例示の実施形態において、最も左のタワー300の最上部(例示の実施形態におけるバケットID312A1に対応する位置)で開始することができ、これにおいて、レコード112内のキー212は、探索されているキーに対して比較される。一致がある場合、探索されているレコード112は位置を特定されている。そうでない場合、トラバーサルは、順方向ポインタ314Aのパスに沿って、比較される別のキー212を有する別のレコード112に進む。そのキー212が、探索されているキー212より小さい場合、トラバーサルは、前のタワー300に戻り、タワー300の次のレベル(
図3におけるバケットID312A2の位置)に下方へ下降する。しかしながら、探索しているキー212が他方のキー212より大きい場合、トラバーサルは別のポインタ314に沿って進む。その後、このプロセスは、探索されているレコード112について一致が識別されるまで、前方へ継続する。このトラバーサルの一例について、以下に
図4で論じられる。
【0028】
順方向ポインタ314が、理解を容易にするために
図3(及び、後続の図)に示されているが、スキップリストポインタ218は、いくつかの実施形態において、間接ポインタを使用して実装される。例示の実施形態において、スキップリストポインタ218は、具体的に、ハッシュテーブル120内のバケット124を指し示すバケット識別子312を使用して実装され、これらは次に、ポインタ202を介してレコード112を指し示す。したがって、ポインタ314Cに沿って進むことは、バケットID312A3のポインタ218をバケット124まで辿ることと、ポインタ202Aに沿って、バケット312B1のポインタ218を有するレコード112を含むレコードチェーン110に進むことを含む。図示されていないが、いくつかの実施形態において、スキップリスト140は逆方向ポインタのセットをさらに含み、これは同様の方法で実施され得、以下により詳細に論じられる。
【0029】
レコード112が最終的にパージされたとき、パージされたレコード112を指し示す他のレコード112に存在するスキップポインタ218が識別され、したがって、それらは、パージされたレコード112をもはや指し示さないように更新することができる。それらが識別されると、それらは、パージされているレコード112内のスキップリストポインタ218を使用して更新される。高速パージアルゴリズムについて論じる前に、より効率的でないパージアルゴリズムが更新されるべき関連スキップリストポインタ218をどのように識別するかを検討することは有益である。
【0030】
次に
図4を参照し、低速パージ400のブロック図を示す。論じられるように、低速パージ400は、更新のため関連レコード112を識別するためにはるかに多数のメモリアクセスを使用するため、後に論じられる高速パージアルゴリズムより効率的でないアルゴリズムである。
図4に示すように、例示的なスキップリスト140は、キー212A~Wの順序付けでソートされたレコード112から構築され得る。スキップリスト140は、昇順キー順での移動を可能にする8つのレベル(レベル1~8として示される)の順方向ポインタ314と、降順キー順での移動を可能にする別のレベル(レベル-1として示される)の逆方向ポインタとを含む。センチネルタワー300は、スキップリスト140のいずれかの端に位置し、レコード112に対応しない(したがって、-∞及び∞のキーを有して示される)。また、
図4の各キー212の下には、そのレコード112(又は、それのレコードチェーン110)への直接ポインタ202を含む、バケット124に対するバケット識別子312がある。したがって、図示のように、19のバケット識別子312を有するバケット124は、Aのキー212を有するレコード112へのポインタ202を含む。
【0031】
低速パージ400は、初期走査(
図4には示されていない)で開始することができ、これにおいて、レコード112は、それらがパージの準備ができていることを示す設定されたフラグ216を有するレコード112を識別するために、昇順バケット順でアクセスされる。
図4に示す例では、Sのキー212を有するレコード112(又は、単に「レコードS」)が、パージのために識別されている。次いで、スキップリスト140をトラバースして、レコードSへのスキップリストポインタ218を含むレコード112を識別することができる。図示のように、トラバーサルは、左側のセンチネルタワー300の最上部で始まり、これにおいて、第1のメモリアクセスを実行してレベル8におけるスキップリストポインタ218を読み取り、これは20のバケットID312を含む。次いで、第2のメモリアクセスを実行して、バケット#20により指し示されるレコード112を読み取り、これはキーKを有するレコード112である。パージされたレコード112のキーSがキー順でキーKより大きいため、トラバーサルはレベル8に沿って継続し、これにおいて、第3のメモリアクセスの間にレコードWが読み取られる。キーSがキーWより小さいため、トラバーサルは、第4のメモリアクセスにおいてレコードKに戻り、レベル7、下方の次レベルのスキップリストポインタ218を読み取る。見て分かるように、このプロセスは、レコードRがレコードSに対するバケット#17のポインタ218を有すると識別されるまで、別の20のメモリアクセスに対して継続する。レコードSへのポインタを有する全てのレコードが識別されると(この例ではレコードR及びTである)、それらのポインタは、パージされているレコード112内のポインタで更新することができる。例えば、レコードRのバケット#17をレコードSのバケット#9に置き換えることができ、したがって、レコードRは、レコードSが除去されたときにそれを通り過ぎて指し示すことができる。
【0032】
見て分かるように、1つのレコードを除去するためのトラバーサルは、初期走査のメモリアクセス又はレコードチェーン110を下方へ移動するための複数のアクセスを含まず、20のメモリアクセスを含む。さらに、低速パージ400は、複数のレコード112がパージのために識別された場合、複数のトラバーサルを実行することがある。さらに、いくつかの実施形態において、スキップリスト140は、より一層高いスキップリストタワー300(例えば、33個のレベルを有するもの)を含み、実質的により広い場合がある。全てのこれらのメモリアクセスは、システム性能に影響を与える可能性がある。多くの例において、次に論じられる高速パージアルゴリズムは、はるかにより少ないメモリアクセスを使用する。
【0033】
次に
図5Aを参照し、高速パージ500のブロック図を示す。上述したように、高速パージ500は、スキップリスト140からレコード112を除去するためにパージエンジン150により使用されるアルゴリズムであってよい。例示の実施形態において、高速パージ500は、キー順におけるスキップリスト140の順方向走査510で開始する。図示のように、この走査510は、左側に示すセンチネルタワー300で開始することができ、レベル1におけるスキップリストポインタ218を使用して、キー順で順方向に効率的に進行する。この例では、走査510は、センテンシャルタワー300からレコードBを指し示すバケット#13に移動する。次いで、走査510は、レコードBにおけるレベル1のスキップポインタ218を使用して、バケット#22を介してレコードCに移動する。このプロセスは、走査510がずっと右端の他方のセンチネルタワー300に到達するまで継続することができる。
【0034】
様々な実施形態において、順方向走査510は、二重の目的、すなわち、1)パージフラグ216を読み取ってパージされるレコード112を識別することと、2)どのレコード112が、それらがパージされているレコード112を指し示すときに更新を保証する(warrant)かを決定することを果たす。このアプローチは、これらのアクションが別個の操作、すなわち初期走査の後にスキップリスト140の下方へのトラバーサルが続くことにより取り扱われる低速パージ400とは対照的である。走査510の間にレコード112が読み取られるとき、パージエンジン150は、パージフラグ216を読み取り、レコード112に含まれるスキップリストポインタ218に関する情報を記憶することができ、これは、パージエンジン情報550として示されている。いくつかの実施形態において、パージエンジン150は、レコード112のピン留め(pin)514をさらに実行する(これは、パージエンジン150が、レコード112がメモリ内で再配置されることを防止することを意味する)。これは、例えば、ガベージコレクションプロセスがレコード112を移動すること、レコード112がさらにフラグが立てられている場合にそれがパージされること等を防止するために実行されてもよい。
【0035】
例示の実施形態において、パージエンジン情報500は、スキップリスト140内の各レベルに対する行を含むテーブルである。各行内には、その行に関連づけられたスキップリストレベルを識別するレベル552と、レコード112を指し示すバケット124を識別するソースレコードバケット554と、そのレコード112がメモリ内に存在する物理アドレスを識別するソースレコードアドレス556と、スキップリストポインタ218が指し示すターゲットバケット124がある。走査510の間にレコード112が読み取られたとき、各行は、パージエンジン情報550において、そのレコード112のタワー300の高さに対して更新される。したがって、図示の例では、レコードKは1の高さを有し(例示の実施形態において、高さにレベル-1は考慮されない)、ゆえに、レベル1におけるその1つのスキップリストポインタ218がパージエンジン情報550のレベル1の行に記録される。したがって、行1は、41のバケットID312を指定し、レコード112のレコードアドレス556と、52のターゲットバケット558を含む。このポインタの情報は、ポインタが解決されるまでパージエンジン情報550に残る。上述し、
図5Aに示すように、未解決ポインタ512は、順方向走査510の間にまだ走査されていないレコード112を指し示すポインタである。したがって、バケット52へのポインタ218は、
図5Aに示す例ではレコードMがまだ走査されていないため、現在未解決のポインタ512である。対照的に、解決されたポインタ516は、
図5AではレコードBに対するセンチネルタワーのポインタなどの、既に走査されたレコード112を指し示すものである。ポインタ218が解決されたとき、パージエンジン150は、次に論じられるように、情報550を新たに走査されたレコードの情報に置き換え、更新する。
【0036】
次に
図5Bを参照し、パージエンジン情報550の情報更新520のブロック図を示す。
図5Aの例を継続すると、順方向走査510は今やバケット#52に到達し、レコードMを読み取っている。この時点で、レコードB~K内のポインタ218は解決されている。新たに走査されたレコードMがパージされていない場合、パージエンジン150は、レコードB~Kのピン留め解除(unpin)522を実行し、パージエンジン情報550内のそれらの情報を、同様にピン留めされているポインタ情報レコードMに置き換えることができる。この例では、レコードMは、そのタワー300内に6つのレベルのポインタ218を有し、ゆえに、全ての6つのレベルのパージエンジン情報550が更新される。レコードMのタワー300が3つのポインタ218のみを有する場合、この例では、3つの行のみが更新されることになり、したがって、レベル4~6を有する行はそのまま残されることになる。
【0037】
一方、新たに走査されたレコード112がパージのためにフラグを立てられていた場合、高速パージ500は、
図5C及び
図5Dで次に論じられるように進むことができる。
【0038】
次に
図5Cを参照し、高速パージ500のバケット識別子置換530のブロック図を示す。この例では、パージエンジン150は今やレコードMを走査し、そのパージフラグ216から、このレコード112がパージされると判断している。これを行うために、パージエンジン150は、レコードMが間もなく無くなることを説明する(account for)ためにスキップリスト140内のポインタ218を更新する。
【0039】
パージエンジン150が既に未解決ポインタ512を追跡しているため、パージエンジン150は、どのポインタ218がパージされているレコード112を潜在的に指し示すかを知ることができ、したがって、どのポインタ218が更新を保証し得るかがわかる。
図5Cに示す例で図示するように、パージエンジン情報550は、レコードMが走査される時点で、6つの異なるレベルにおける6つの未解決ポインタ218を既に識別している。レコードMが、6の高さを有するタワー300を有するため、パージエンジン150は、6つのポインタが可能性としてレコードMを指し示していると仮定し、これを情報550内のターゲットバケット558から決定することができる。この知識を使用し、パージエンジン150は、パージエンジン150がレコードMへのポインタ218をレコードM内に含まれるポインタ218に置き換えるバケットID置換530を実行することができる。例えば、図示のように、レコードB内のレベル6におけるポインタ218は、バケット#55からバケット#28に変更されており、したがって、レコードBは今や、レコードMを通り過ぎて指し示している。同様の変更は、レベル1~5におけるレコードC~K内のポインタ218にも行われる。レコードMがより短いタワー300(例えば、4つのレベルの)を有する場合、これらのポインタ218のサブセットのみが更新される(例えば、レコードE~K内のもの)。様々な実施形態において、パージエンジン150はさらに、これらの置換530が実行されている間、更新されているレコード112及びパージされているレコード112をピン留めし続ける。図示のように、パージエンジン情報550もまた、これらの変更を反映するように更新され、なぜならば、これらの更新されたポインタ218が、パージのためにフラグを立てられた、後に走査されるレコード112を依然として指し示す場合があるためである。例示の実施形態において、レコードMの前に位置するレコードNは、そのレベル-1ポインタ218を、レコードKを指し示すように更新させている。このような一実施形態において、レベル-1ポインタはパージエンジン情報550を使用して追跡されなくてもよく、なぜならば、これらは、パージされているレコード112内のレベル1ポインタ218をトラバースして、昇順キー順における次のレコード112をこの逆方向ポインタ218を用いて識別することにより、容易に識別することができるためである。
【0040】
上述したように、いくつかの実施形態において、高速パージ500が実行されている間、トランザクションマネージャ104は、レコード112をバッファデータ構造106に挿入することを依然として許可されており、なぜならば、挿入を防止することは、システム性能に有意な影響を有し得るためである。しかしながら、挿入はレコード112のパージと干渉する潜在性を有するため、パージエンジン150は、論じられるように、任意のバケットID置換530にパージエンジン情報550を使用する前にそれの検証を実行することができる。
【0041】
次に
図5Dを参照し、収集されたパージエンジン情報550の検証540のブロック図を示す。パージエンジン情報550は、新しいレコード112が挿入された場合に古くなる可能性があるので、様々な実施形態において、パージエンジン150は、この情報550が、置換530においてそれが使用される前に不正確になっていないことを検証する。
【0042】
様々な実施形態において、パージエンジン150は、ソースレコードアドレス556を使用してレコード112にアクセスすることにより、検証540を実行する。次いで、パージエンジン150は、レベル552におけるポインタ218が、ターゲットバケット558により識別される同じバケットID312を依然として指し示すことを検証することができる。これらのポインタが、情報550に記録されているものと依然として一致する場合(
図5Dの左側に示す成功した検証540Aの場合のように)、パージエンジン150は、ちょうど論じたように、バケットID置換530を実行することに進むことができる。
【0043】
いくつかの例において、パージされているレコード112を前に指し示していたレコード112を妨害するのに十分な高さのタワー300を有するレコード112が挿入されている場合、不一致が発生することがある。例えば、
図5Dの右側に示す不成功に終わった検証540Bでは、レコードHが4のタワー高さを有して挿入され、これは、レコードE及びG内のレベル2~4におけるポインタが、レコードMが位置するバケット#52でなく、バケット#35を指し示す結果をもたらす。したがって、パージエンジン150がパージエンジン情報550を検証することに進むとき、それはもはやスキップリスト140に実際にあるものとの整合性がない。これが発生した場合、いくつかの実施形態において、パージエンジン150は別の後続の走査510が実行されるまでレコード112のパージを遅延させるため、これは問題ではない。レコードMは、この例ではもう少し長く存続することを許容され得るが、最終的にはパージされる。しかしながら、レコードHがより短いタワー300を含む(例えば、それが1の高さを有する)場合、その挿入は、パージされているレコードMを現在指し示しているレコードK内のレベル1ポインタ218が改変されないため、パージエンジン情報550と干渉しないことになる。したがって、パージエンジン150は、成功裏に情報550を検証し、バケットID置換530を実行することに進むことになる。
【0044】
レコードチェーン110及び/又はレコード112が、検証540及び置換530の間に修正される潜在性をさらに有し得るため、パージエンジン150は、検証540及び置換530の間の修正を防止するためにラッチ126及び/又はロック217を獲得することをさらに取り扱うことができる。いくつかの実施形態において、これは、パージされているレコード112と、パージエンジン情報550において識別されたレコード112と、更新される必要があり得る逆方向ポインタを含み得るため、キー順でパージされているレコードの後に来るレコード112とに関連づけられたラッチ126及び/又はロック217を獲得することを含むことができる。そのような一実施形態において、ラッチ126及び/又はロック217は、検証540及び置換530を通してパージ及び保持されるレコード112を識別したことに応答して獲得されてもよい。
【0045】
次に
図6を参照し、パージエンジン150の入力及び出力のブロック図を示す。例示の実施形態において、パージエンジン150は、順方向走査510において走査されているレコード112から、タワーレベル552、ソースレコードバケット554、ソースレコードアドレス556、及びターゲットバケットID558を受け取る。次いで、パージエンジン150は、この情報を使用して、パージされたエンジン情報550を維持及び更新することができる。パージエンジン150は、パージフラグ216も受け取ることができ、これは再びになるが、レコード112がパージされるかどうかを判断するために使用することができる。この情報に基づいて、パージエンジン150は、レコード112をピン留め514又はピン留め解除522する命令、検証540の結果602、バケット置換530のバケットID312、パージされたレコード112、並びにラッチ126及びロック217を修正する命令を出力することができる。いくつかの実施形態において、パージエンジン150は、より多くの(又は、より少ない)入力及び出力を有してもよい。
【0046】
パージエンジン150は、スキップリスト140全体の走査510を順次実行することができるが、いくつかの実施形態において、次に論じられるように複数のセクションを並列に走査することにより、さらなる性能向上が達成され得る。
【0047】
次に
図7を参照し、並列高速パージ700のブロック図を示す。論じられるように、パージエンジン150は、スキップリスト140を複数のセクション720に分割することにより並列高速パージ700を実行することができ、該セクションは、並列に実行されている別個のスレッドにより取り扱われる。
【0048】
例示の実施形態において、並列高速パージ700は、パージエンジン150が、スキップリスト140の最上部分のトラバーサル710を実行してスキップリスト140内で最も高いタワー300を有するレコード112を識別することにより、スキップリスト140を分割する方法を決定することで開始する。これらのレコード112を識別することの一利点は、これらを各セクション720の最も左の境界として使用できることであり、それは有用な可能性があり、なぜならば、これらは、大抵の未解決ポインタが所与のセクション720に対してローカルであることを確実にするためであり、なぜならば、これらは、より一層高いタワー300を有する合間に挿入されたレコード112がないと仮定して、そのセクション720に対してローカル最大タワー高さを可能性として含むためである。例えば、
図7において、最も高いタワー300は、左のセンチネルタワーと、バケットID20、9、24、及び3を有するバケット124により指し示されるレコード112に存在する。パージエンジン150が最上部分を下方へ渡る(walks down)とき、パージエンジン150は、特定の数のセクション720を作成することをターゲットにすることができ、これは、エンジン150をどれほど下降させるかに影響を及ぼし得る。
図7に示す例では、パージエンジン150は、5つのセクション720の作成をターゲットにすることができ、したがって、その多くの一意バケット識別子312を識別するまでスキップリスト140を下方へ渡り続けることができる。したがって、図示の例では、パージエンジン150は、5つの一意バケット識別子312を識別することができる前にレベル8~6を下方へ渡り、その後、5つの一意バケット識別子312は、5つのセクション720を作成するために使用される。
【0049】
セクション720が決定されると、いくつかの実施形態において、パージエンジン150は、複数のスレッドを有するスレッドプールをインスタンス化し、走査のためにセクション720をスレッドに割り当てることを開始する。次いで、各実行スレッドは、上記で論じた高速パージ500を使用して、その割り当てられたセクション720を走査し(その割り当てられたセクション720の未解決ポインタ512のためのパージエンジン情報550のその独自のコピーを維持することを含む)、フラグを立てられたレコード112をパージすることができる。スレッドプール内にセクション720より少ないスレッドが存在する場合、スレッドは、前に割り当てられたセクション720での作業を完了すると、パージエンジン150から別の割り当てられたセクション720を受け取るようにぐるりと戻ることができる。
【0050】
スレッドがそれらの割り当てられたセクション720を走査するとき、スレッドは、セクション720の左境界における最初のレコード112がパージのためにフラグを立てられていることを判断することができる。いくつかの実施形態において、これらのスレッドは、これらのレコード112がパージの準備ができていることを注記してもよいが、セクション720が走査された後までこれらのパージを保留することができる。その時点で、パージエンジン150は、フラグを立てられたレコード112だけに対して低速パージ400を実行してもよく、したがって、パージエンジン150は、パージされているあらゆるレコード112でなく少数のレコード112のみについてスキップリスト140を下方へトラバースしている。
【0051】
次に、上記で論じた技術の1つ以上を使用する様々な方法について論じる。
【0052】
次に
図8Aを参照し、スキップリストレコードを高速パージする方法800のフローチャートを示す。方法800は、パージエンジン150を実行することができるデータベースシステム10などのコンピューティングシステムにより実行される方法の1つの実施形態である。いくつかの例において、方法800の実行は、スキップリストからレコードをパージする負担を低減することができる。
【0053】
ステップ805において、複数のキー・値レコード(例えば、キー・値レコード112)であり、該複数のキー・値レコードのうちの他のキー・値レコードへの1つ以上のポインタ(例えば、スキップリストポインタ218)を含む、複数のキー・値レコード、を含むスキップリスト(例えば、スキップリスト140)が記憶される。いくつかの実施形態において、キー・値レコードは、キー・値レコードに関連づけられたデータベーストランザクション(例えば、データベーストランザクション102)を実行する要求に応答してスキップリストに挿入される。データベーストランザクションがコミットし、キー・値レコードが永続ストレージ(例えば、データベース108のLSMツリー)に記憶されたことに応答して、フラグ(例えば、パージフラグ216)がキー・値レコードに設定されて、キー・値レコードがパージされることを認可されていることを示す。いくつかの実施形態において、スキップリスト内の複数のキー・値レコードのうちの第1のキー・値レコードは、ハッシュテーブル(例えば、ハッシュテーブル120)内のバケット(例えば、バケット124)を指し示す第1のポインタ(例えば、間接ポインタ312)を含むことによりスキップリスト内の複数のキー・値レコードのうちの第2のキー・値レコードを指し示し、これにおいて、バケットは第2のキー・値レコードへの第2のポインタ(例えば、直接ポインタ202)を含む。
【0054】
ステップ810において、複数のキー・値レコードは、スキップリストからパージされるキー・値レコードを識別するためにキー順に走査される。様々な実施形態において、走査は、走査によりまだ走査されていないキー・値レコードを指し示すポインタ(例えば、未解決ポインタ512)を含むキー・値レコードのリスト(例えば、パージエンジン情報550)を維持することを含む。いくつかの実施形態において、走査は、リストに含まれる第1のキー・値レコードのポインタ(例えば、解決されたポインタ516)が、現在走査されている第2のキー・値レコードを指し示していることを判断することを含む。この判断に応答して、リスト内の第1のキー・値レコードは、(例えば、情報更新520を介して)第2のキー・値レコードに置き換えられる。第2のキー・値レコードの再配置は、第2のキー・値がリストに含まれている間、メモリ内で(例えば、ピン留め514を介して)防止される。いくつかの実施形態において、走査が実行されている間、1つ以上のキー・値レコードがスキップリストに挿入される。いくつかの実施形態において、走査は、設定されたフラグに基づいてパージするキー・値レコードを識別することを含む。
【0055】
ステップ815において、パージするキー・値レコードを識別したことに応答して、このキー・値レコードは、リストのキー・値レコードに含まれるポインタを、パージされているキー・値レコードに含まれるポインタに置換すること(例えば、バケットID置換530)により、パージされる。いくつかの実施形態において、パージするキー・値レコードを識別したことに応答して、リストのキー・値レコードに含まれるポインタがパージするキー・値レコードを指し示しているかどうかを判断することを含む、キー・値レコードのリストの検証(例えば、検証540)が実行される。いくつかの実施形態において、挿入が、リストのキー・値レコードに含まれる1つ以上のポインタに、パージするキー・値レコードを指し示さないようにさせたと判断したことに応答して、キー・値レコードのパージは、後続の走査が実行されるまで遅延される。いくつかの実施形態において、走査を実行するプロセス以外のプロセスによるキー・値レコードの修正を防止するために、ラッチ(例えば、ラッチ126及び/又はロック217)が獲得される。ラッチの獲得は、リストのキー・値レコードに含まれるポインタの、パージされているキー・値レコードに含まれるポインタによる置換の後まで維持される。
【0056】
いくつかの実施形態において、方法800は、キー順の複数のキー・値レコードの走査の前に、スキップリストを(例えば、上部スキップリストトラバーサル710を介して)下方へ渡って複数のキー・値レコードのサブセットを識別することをさらに含む。識別されたサブセット内のキー・値レコードに基づいて、スキップリストはセクション(例えば、セクション720)に分割される。これらのセクションは、セクションを並列に走査するために実行可能な複数のスレッドに割り当てられる。いくつかの実施形態において、複数のスレッドのうちの1つが、走査のために割り当てられたセクションを受け取り、割り当てられたセクションを走査し、これには、割り当てられたセクションについて、未解決ポインタを有するキー・値レコードのリストを維持することが含まれる。割り当てられたセクション内のパージするキー・値レコードを識別したことに応答して、スレッドは、割り当てられたセクションについてのキー・値レコードのリストを使用して、割り当てられたセクション内のキー・値レコードをパージする。
【0057】
次に
図8Bを参照し、スキップリストレコードを高速パージする方法830のフローチャートを示す。方法830は、パージエンジン150を実行することができるデータベースシステム10などのコンピューティングシステムにより実行される方法の別の実施形態である。いくつかの例において、方法830の実行は、スキップリストからレコードをパージする負担を低減することができる。
【0058】
ステップ835において、コンピューティングシステムは、データベース(例えば、データベース108)のキー・値レコード(例えば、キー・値レコード112)に対するキー(例えば、キー212)の順序付けを維持するスキップリスト(例えば、スキップリスト140)を記憶する。いくつかの実施形態において、スキップリストは、データベースによるコミットメント(commitment)を待つデータベーストランザクションのキー・値レコードに対するキーの順序付けを維持する。
【0059】
ステップ840において、コンピューティングシステムは、スキップリストからパージされるキー・値レコードを識別する。例示の実施形態において、ステップ840は、サブステップ841において、スキップリストをキー順に走査して、上記キー・値レコードのうちのキー・値レコードがパージが許可されているという指標(例えば、パージフラグ216)を含むかどうかを判断することを含む。いくつかの実施形態において、走査の前に、コンピューティングシステムは、スキップリストの最上部分を(例えば、上部スキップリストトラバーサル710を介して)トラバースして、並列走査のためのスキップリストの区分(divisions)(例えば、セクション720)を決定する。コンピューティングシステムは、区分を、互いに並列に区分を走査するために実行可能な複数のスレッドに割り当てる。例示の実施形態において、ステップ840は、スキップリスト内のキー・値レコードの未解決ポインタ(例えば、未解決ポインタ512)を記録することをさらに含み、未解決ポインタは、走査によりまだ走査されていない上記キー・値レコードのうちのキー・値レコードを指し示す。
【0060】
ステップ845において、パージされるキー・値レコードを識別したことに応答して、コンピューティングシステムは、上記未解決ポインタのうちの未解決ポインタを、パージされているキー・値レコードに含まれるポインタに(例えば、バケットID置換530を介して)置き換えることにより、キー・値レコードをパージする。いくつかの実施形態において、走査の間、コンピューティングシステムは、1つ以上のキー・値レコードをスキップリストに挿入する。パージされるキー・値レコードを識別したことに応答して、コンピューティングシステムは、1つ以上のキー・値レコードを挿入した後に、上記未解決ポインタのうちの未解決ポインタが、パージされるキー・値レコードを依然として指し示していることを検証する(例えば、検証540)。いくつかの実施形態において、少なくとも未解決ポインタのうちの1つがパージされるキー・値レコードをもはや指し示していないと判断したことに応答して、コンピューティングシステムは、スキップリストの後続の走査が実行されるまで、キー・値レコードのパージを遅延させる。
【0061】
次に
図8Cを参照し、レコードを並列に高速パージする方法860のフローチャートを示す。方法860は、パージエンジン150を実行することができるデータベースシステム10などのコンピューティングシステムにより実行される方法の別の実施形態である。いくつかの例において、方法860の実行は、スキップリストからレコードを識別及びパージするために要する時間を短縮することができる。
【0062】
ステップ865において、複数のキー・値レコード(例えば、レコード112)に対するキー(例えば、キー212)の順序付けを保持するスキップリスト(例えば、スキップリスト140)が維持される。様々な実施形態において、キー・値レコードは、挿入されたキー・値レコードに対応するデータベーストランザクション(例えば、データベーストランザクション102)がコミットメントを待っているとき、スキップリストに挿入される。挿入されたキー・値レコードのうちの1つに対応するデータベーストランザクションがコミットしたことに応答して、この挿入されたキー・値レコードがスキップリストからパージされることを許可されていることを示すために、挿入されたキー・値レコードにフラグ(例えば、パージフラグ216)が設定される。いくつかの実施形態において、スキップリスト内の複数のキー・値レコードのうちの第1のキー・値レコードは、ハッシュテーブル(例えば、ハッシュテーブル120)内のバケット(例えば、バケット124)への第1のポインタ(例えば、間接ポインタ312)を含むことにより、複数のキー・値レコードのうちの第2のキー・値レコードを間接的に指し示し、バケットは、第2のキー・値レコードへの第2のポインタ(例えば、直接ポインタ202)を含む。
【0063】
ステップ870において、スキップリストは、スキップリストの最上部分を(例えば、上部スキップリストトラバーサル710を介して)トラバースしてセクションの境界として使用される上記キー・値レコードのうちのキー・値レコード(例えば、
図7においてセクション720B内のキーGを有するレコード112)を識別することにより識別されたセクション(例えば、セクション720)に分割される。
【0064】
ステップ875において、セクションは、スキップリストの割り当てられたセクションをキー順に走査してスキップリストからパージするキー・値レコードを識別するために並列に各々実行可能である、複数のスレッドに割り当てられる。いくつかの実施形態において、複数のスレッドのうちの第1のスレッドは、第1のスレッドに割り当てられたセクションの未解決ポインタ(例えば、未解決ポインタ512)のリスト(例えば、パージエンジン情報550)を維持し、未解決ポインタは、第1のスレッドによりまだ走査されていないキー・値レコードを指し示す、第1のスレッドにより走査されたキー・値レコードに含まれるポインタである。パージする割り当てられたセクション内のキー・値レコードを識別したことに応答して、第1のスレッドは、上記未解決ポインタのうちの未解決ポインタを、パージされるキー・値レコードに含まれるポインタに(例えば、バケットID置換530を介して)置き換える。
【0065】
いくつかの実施形態において、方法860は、割り当てられたセクションが複数のスレッドにより走査されたことに続いて、セクションの境界として使用されるキー・値レコードにアクセスして、パージする上記境界キー・値レコードのうちの境界キー・値レコードを識別することをさらに含む。パージする境界キー・値レコードを識別したことに応答して、スキップリストは、境界キー・値レコードがパージされていることに応答して更新されるキー・値レコードを識別するために、下方へトラバースされる。
【0066】
例示的なコンピュータシステム
次に
図9を参照し、データベースシステム10、データベースシステム10の一部、又はデータベースシステム10と対話するクライアントなどの本明細書に記載された機能を実施することができる例示的なコンピュータシステム900のブロック図を示す。コンピュータシステム900は、インターコネクト960(例えば、システムバス)を介してシステムメモリ920及びI/Oインターフェース940に結合されたプロセッササブシステム980を含む。I/Oインターフェース940は、1つ以上のI/Oデバイス950に結合される。コンピュータシステム900は、これらに限られないがサーバシステム、パーソナルコンピュータシステム、デスクトップコンピュータ、ラップトップ又はノートブックコンピュータ、メインフレームコンピュータシステム、タブレットコンピュータ、ハンドヘルドコンピュータ、ワークステーション、ネットワークコンピュータ、コンシューマデバイス、例えば携帯電話、音楽プレーヤ、又はパーソナルデータアシスタント(PDA)などを含む様々なタイプのデバイスのいずれでもよい。簡便さのため、
図9には単一のコンピュータシステム900を示しているが、システム900は、クラスタ内で一緒に動作する複数のコンピュータシステムとして実装されてもよい。
【0067】
プロセッササブシステム980は、1つ以上のプロセッサ又は処理ユニットを含むことができる。コンピュータシステム900の様々な実施形態において、プロセッササブシステム980の複数のインスタンスがインターコネクト960に結合されてもよい。様々な実施形態において、プロセッササブシステム980(又は、980内の各プロセッサユニット)は、キャッシュ又は他の形態のオンボードメモリを含んでもよい。
【0068】
システムメモリ920は、本明細書で説明される様々な動作をシステム900に実行させるために、プロセッササブシステム980により実行可能なプログラム命令を記憶するために使用可能である。システムメモリ920は、ハードディスクストレージ、フロッピーディスクストレージ、リムーバブルディスクストレージ、フラッシュメモリ、ランダムアクセスメモリ(RAM、すなわち、SRAM、EDO RAM、SDRAM、DDR SDRAM、RAMBUS RAM等)、読取専用メモリ(PROM、EEPROM等)などの、異なる物理的な非一時的メモリ媒体を使用して実装されてもよい。コンピュータシステム900のメモリは、メモリ920などの一次記憶装置に限定されない。むしろ、コンピュータシステム900は、プロセッササブシステム980内のキャッシュメモリ及びI/Oデバイス950(例えば、ハードドライブ、ストレージアレイ等)上の二次記憶装置などの他の形態の記憶装置をさらに含んでもよい。いくつかの実施形態において、これらの他の形態の記憶装置も、本明細書で説明される動作をシステム900に実行させるためにプロセッササブシステム980により実行可能なプログラム命令を記憶してもよい。いくつかの実施形態において、メモリ920は、トランザクションマネージャ104、パージエンジン150、バッファデータ構造106、及び/又はデータベース108の部分を含むことができる。
【0069】
I/Oインターフェース940は、様々な実施形態に従い、他のデバイスに結合し、通信するように構成された様々なタイプのインターフェースのいずれかでもよい。1つの実施形態において、I/Oインターフェース940は、フロントサイドから1つ以上のバックサイドバスへのブリッジチップ(例えば、サウスブリッジ)である。I/Oインターフェース940は、1つ以上の対応するバス又は他のインターフェースを介して、1つ以上のI/Oデバイス950に結合されてもよい。I/Oデバイス950の例には、ストレージデバイス(ハードドライブ、光学ドライブ、リムーバブルフラッシュドライブ、ストレージアレイ、SAN、又はそれらの関連するコントローラ)、ネットワークインターフェースデバイス(例えば、ローカル又はワイドエリアネットワークに対する)、又は他のデバイス(例えば、グラフィックス、ユーザインターフェースデバイス等)が含まれる。1つの実施形態において、コンピュータシステム900は、ネットワークインターフェースデバイス950(例えば、WiFi、Bluetooth(登録商標)、イーサネットなどを通じて通信するように構成される)を介してネットワークに結合される。
【0070】
特定の実施形態について上記で説明したが、これらの実施形態は、特定の特徴に関して単一の実施形態のみが説明されている場合でも、本開示の範囲を限定することを意図していない。本開示において提供される特徴の例は、別段示されていない限り、限定的ではなく例示的であることを意図している。上記の説明は、本開示の利益を有する当業者に明らかであるような代替、修正、及び同等物をカバーすることを意図している。
【0071】
本開示の範囲は、本明細書に開示される任意の特徴又は特徴の組み合わせ(明示的又は暗黙的のいずれか)、又はそれらの任意の一般化を含み、それが本明細書で対処される問題のいずれか又は全てを緩和するか否かを問わない。したがって、本出願(又は、それに対する優先権を主張する出願)の手続の間、任意のこのような特徴の組み合わせに対して新しい請求項を立てることができる。特に、添付された特許請求の範囲を参照して、従属請求項からの特徴は、独立請求項の特徴と組み合わせることができ、それぞれの独立請求項からの特徴は、添付された特許請求の範囲に列挙された特定の組み合わせだけでなく、任意の適切な方法で組み合わせることができる。
【0072】
本開示は、「一実施形態」又は「実施形態」のグループ(例えば、「いくつかの実施形態」又は「様々な実施形態」)への参照を含む。実施形態は、開示された概念の異なる実装又はインスタンスである。「一実施形態」、「1つの実施形態」、「特定の実施形態」などへの参照は、必ずしも同じ実施形態を指すわけではない。具体的に開示されたもの、並びに本開示の主旨又は範囲内にある修正又は代替を含む、多数の可能な実施形態が考えられる。
【0073】
本開示は、開示された実施形態から生じる可能性のある潜在的な利点を論じる場合がある。これらの実施形態の全ての実装が、必ずしも潜在的な利点のいずれか又は全てを示すわけではない。特定の実装に対して利点が実現されるかどうかは多くのファクタに依存し、そのいくつかは本開示の範囲外である。実際、特許請求の範囲の範囲内に入る実装が、開示された利点の一部又は全部をなぜ提示しない可能性があるのかの、いくつかの理由がある。例えば、特定の実装が、開示された実施形態の1つに関連して、1つ以上の開示された利点を打ち消し又は減らす、本開示の範囲外の他の回路を含む可能性がある。さらに、特定の実装(例えば、実装手法又はツール)の準最適な設計実行も、開示された利点を打ち消し又は減らす可能性がある。熟練した実装を仮定しても、利点の実現は、実装が配備される環境状況などの他のファクタに依然として依存する可能性がある。例えば、特定の実装に供給される入力は、本開示で対処される1つ以上の問題が特定の機会に生じるのを防ぐ可能性があり、その結果、その解決策の利益が実現されない可能性がある。本開示の外部のあり得るファクタの存在を前提として、本明細書に記載される潜在的な利点は、侵害を証明するために満たされなければならない請求項の制限として解釈されるべきではないことが、明示的に意図されている。むしろ、そのような潜在的な利点の識別は、本開示の利益を有する設計者にとって利用可能な向上のタイプを例示することを意図している。そのような利点が許容的に説明されていること(例えば、特定の利点が「生じる可能性がある」と述べること)は、そのような利点を実際に実現することができるかどうかについての疑いを伝えることを意図しているわけではなく、むしろ、そのような利点の実現がしばしばさらなるファクタに依存するという技術的な現実性を認識することを意図している。
【0074】
別段示されない限り、実施形態は非限定的である。すなわち、開示された実施形態は、特定の特徴に関して単一の例のみが説明されている場合でも、本開示に基づいて起草される請求項の範囲を制限することを意図していない。開示された実施形態は、開示において反対の記述がない限り、限定的ではなく例示的であることを意図している。したがって、本出願は、開示された実施形態、並びに本開示の利益を有する当業者に明らかであろう代替、修正、及び同等物をカバーする特許請求の範囲を可能にすることを意図している。
【0075】
例えば、本出願における特徴は、任意の適切な方法で組み合わせられてもよい。したがって、本出願(又は、これに対する優先権を主張する出願)の手続きの間、任意のこのような特徴の組み合わせに対して、新しい請求項を立てることができる。特に、添付された特許請求の範囲を参照して、従属請求項からの特徴は、他の独立請求項に従属する請求項を含め、適切な場合には他の従属請求項の特徴と組み合わせることができる。同様に、それぞれの独立請求項からの特徴は、適切な場合には組み合わせることができる。
【0076】
したがって、添付された従属請求項は、各々が1つの他の請求項に従属するように起草される場合があるが、さらなる依存関係も考えられる。本開示と矛盾しない従属における特徴の任意の組み合わせが考えられ、この又は別の出願で請求される場合がある。要するに、組み合わせは、添付された特許請求の範囲に具体的に列挙されているものに限定されない。
【0077】
適切な場合には、さらに、ある形式又は法定タイプ(例えば、装置)で起草された請求項は、別の形式又は法定タイプ(例えば、方法)の対応する請求項をサポートすることを意図していると考えられる。
【0078】
本開示は法的文書であるため、様々な用語及びフレーズが行政的及び司法的解釈の対象となる場合がある。本開示に基づいて起草された請求項を解釈する方法を判断する際には、以下の段落、並びに本開示全体を通して提供される定義を使用すべきであるという公告がここで与えられる。
【0079】
項目の単数形(すなわち、「a」、「an」、又は「the」が前にある名詞又は名詞句)への参照は、別段文脈が明確に示さない限り、「1つ以上」を意味することを意図している。したがって、請求項における「項目」への参照は、付随する文脈なしには、項目のさらなるインスタンスを排除しない。「複数」の項目は、2つ以上のその項目のセットを指す。
【0080】
語「する場合がある(may)」は、本明細書において許容的な意味(すなわち、潜在性を有すること、可能であること)で使用され、強制的な意味(すなわち、しなければならない(must))では使用されない。
【0081】
用語「含む(comprising)」及び「含む(including)」並びにそれらの形式は、無制限であり、「を含むがこれらに限定されない」を意味する。
【0082】
本開示において、選択肢のリストに関して用語「又は」が用いられるとき、それは一般に、別段文脈が規定しない限り、包括的な意味で使用されるものと理解される。したがって、「x又はy」の記載は、「x又はy、又は双方」と同等であり、したがって、1)xはあるがyはない、2)yはあるがxはない、及び3)xとyの双方をカバーする。一方、「x又はyのいずれかであるが双方ではない」などのフレーズは、「又は」が排他的な意味で用いられていることを明確にしている。
【0083】
「w、x、y、又はz、又はこれらの任意の組み合わせ」又は「... w、x、y、及びzのうち少なくとも1つ」の記載は、セット内の要素の合計数まで、単一の要素を含む全ての可能性をカバーすることを意図している。例えば、セット[w、x、y、z]を前提とすると、これらの言い回しは、セットの任意の単一の要素(例えば、wはあるがx、y、又はzはない)、任意の2つの要素(例えば、wとxはあるがy又はzはない)、任意の3つの要素(例えば、w、x、及びyはあるがzはない)、及び4つの要素全てをカバーする。したがって、フレーズ「... w、x、y、及びzのうち少なくとも1つ」は、セット[w、x、y、z]の少なくとも1つの要素を指し、それにより、この要素のリスト内の全ての可能な組み合わせをカバーしている。このフレーズは、wの少なくとも1つのインスタンス、xの少なくとも1つのインスタンス、yの少なくとも1つのインスタンス、及びzの少なくとも1つのインスタンスがあることを要求するものと解釈されるべきではない。
【0084】
本開示において、様々な「ラベル」が名詞又は名詞句の前にある場合がある。別段文脈が規定しない限り、特徴に対して使用される異なるラベル(例えば、「第1の回路」、「第2の回路」、「特定の回路」、「所与の回路」など)は、この特徴の異なるインスタンスを指す。さらに、特徴に適用されたとき、ラベル「第1の」、「第2の」、及び「第3の」は、別段示されない限り、いかなるタイプの順序付け(例えば、空間的、時間的、論理的など)も意味しない。
【0085】
フレーズ「に基づく」又はは、決定に影響を与える1つ以上のファクタを説明するために用いられる。この用語は、さらなるファクタが決定に影響を与え得る可能性を排除するわけではない。すなわち、決定は、指定されたファクタのみに基づく場合があり、あるいは、指定されたファクタと、他の指定されていないファクタに基づく場合がある。フレーズ「Bに基づいてAを決定する」について考える。このフレーズは、Bが、Aを決定するために使用されるか又はAの決定に影響を与えるファクタであることを指定している。このフレーズは、Aの決定が、Cなどの何らかの他のファクタにさらに基づく可能性があることを排除するわけではない。このフレーズは、AがBのみに基づいて決定される実施形態をカバーすることも意図している。本明細書で用いられるとき、フレーズ「に基づく」は、「に少なくとも部分的に基づく」と同義的である。
【0086】
フレーズ「に応答して」及び「に応じて」は、効果をトリガする1つ以上のファクタを説明している。このフレーズは、さらなるファクタが、指定されたファクタと連帯的に又は指定されたファクタから独立してのいずれかで、効果に影響を与え、あるいはその他の方法で効果をトリガし得る可能性を排除するわけではない。すなわち、効果は、それらのファクタにのみ応答したものである場合があり、あるいは、指定されたファクタと、他の指定されていないファクタに応答したものである場合がある。フレーズ「Bに応答してAを実行する」について考える。このフレーズは、Bが、Aの実行をトリガするか又はAの特定の結果をトリガするファクタであることを指定している。このフレーズは、Aを実行することが、Cなどの何らかの他のファクタにさらに応答したものである可能性があることを排除するわけではない。このフレーズはさらに、Aを実行することが、連帯的にB及びCに応答したものである可能性があることを排除するわけではない。このフレーズはさらに、Aが、Bに応答してのみ実行される実施形態をカバーすることを意図している。本明細書で用いられるとき、フレーズ「に応じて」は、「に少なくとも部分的に応じて」と同義的である。同様に、フレーズ「に応答して」は、「に少なくとも部分的に応答して」と同義的である。
【0087】
本開示の中で、異なるエンティティ(これらは、「ユニット」、「回路」、他のコンポーネントなどと様々に呼ばれることがある)は、1つ以上のタスク又は動作を実行するように「構成され」ているとして記載又は請求される場合がある。この定式化 -[1つ以上のタスクを実行する]ように構成された[エンティティ]- は、本明細書において、構造(すなわち、物理的な何か)を指すために用いられている。より具体的には、この定式化は、この構造が動作の間に1つ以上のタスクを実行するように配置されていることを示すために用いられている。構造は、この構造が現在操作されていない場合でも、何らかのタスクを実行する「ように構成され」ていると言うことができる。したがって、何らかのタスクを実行する「ように構成され」ていると説明又は記載されているエンティティは、デバイス、回路、プロセッサユニットとタスクを実現するために実行可能なプログラム命令を記憶するメモリとを有するシステムなどの、物理的な何かを指している。このフレーズは、本明細書において無形の何かを指すために使用されていない。
【0088】
いくつかの場合、様々なユニット/回路/コンポーネントが、タスク又は動作のセットを実行するものとして本明細書で説明されている場合がある。これらのエンティティは、具体的に記述されていない場合でも、これらのタスク/動作を実行する「ように構成され」ていると理解される。
【0089】
用語「ように構成される」は、「ように構成可能である」を意味することを意図しているわけではない。例えば、プログラムされていないFPGAは、特定の機能を実行する「ように構成され」ているとは見なされない。ただし、このプログラムされていないFPGAは、その機能を実行する「ように構成可能である」場合がある。適切なプログラミングの後、FPGAは次いで、特定の機能を実行する「ように構成され」ていると言うことができる。
【0090】
本開示に基づく米国特許出願を目的として、請求項に、構造が1つ以上のタスクを実行する「ように構成され」ていると記載することは、その請求項要素について35U.S.C.§112(f)を援用しないことを明示的に意図している。出願人が、本開示に基づく米国特許出願の手続きの間にセクション112(f)を援用することを望む場合は、[機能を実行する]「ための手段(means for)」の構成体を用いて請求項要素を記載する。
【国際調査報告】