(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-10-04
(54)【発明の名称】SQLインデックスのリーフページのロック競合のハンドリング
(51)【国際特許分類】
G06F 16/22 20190101AFI20240927BHJP
【FI】
G06F16/22
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2024519109
(86)(22)【出願日】2022-09-28
(85)【翻訳文提出日】2024-03-27
(86)【国際出願番号】 EP2022077029
(87)【国際公開番号】W WO2023052457
(87)【国際公開日】2023-04-06
(32)【優先日】2021-10-01
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
(71)【出願人】
【識別番号】390009531
【氏名又は名称】インターナショナル・ビジネス・マシーンズ・コーポレーション
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MACHINES CORPORATION
【住所又は居所原語表記】New Orchard Road, Armonk, New York 10504, United States of America
(74)【代理人】
【識別番号】100112690
【氏名又は名称】太佐 種一
(74)【代理人】
【識別番号】100120710
【氏名又は名称】片岡 忠彦
(74)【復代理人】
【識別番号】110000877
【氏名又は名称】弁理士法人RYUKA国際特許事務所
(72)【発明者】
【氏名】ワン、シャオボ
(72)【発明者】
【氏名】ワン、ピン
(72)【発明者】
【氏名】リ、シュオ
(72)【発明者】
【氏名】スン、シェン ヤン
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175DA01
5B175EA03
(57)【要約】
SQLインデックスのリーフページのロック競合のハンドリングインデックス(例えば、SQLインデックス)のロック競合をハンドリングするためのコンピュータ実装方法、システム、及びコンピュータプログラム製品。インデックスのリーフページは、トランザクションによるインデックスキーの挿入動作中にロック競合について監視される。リーフページのロック競合を検出すると、そのようなリーフページに入力されることになる次のインデックスキーが、バッファのキューにルーティングされる。バッファのキューに記憶されたインデックスキーは、次に、トランザクションがそのようなインデックスキーを記憶することを当初試みた、ロック競合を経験している特定のリーフページにマッピングされ、そのようなマッピングは、データ構造に記憶される。そのようなリーフページがもはやそのようなロック競合を経験しなくなると、適切なインデックスキーが、次に、バッファから除外され、データ構造において識別されたマッピングに基づき、適切なリーフページに記憶される。
【特許請求の範囲】
【請求項1】
インデックスのロック競合をハンドリングするためのコンピュータ実装方法であって:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する段階;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする段階、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する段階、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶する
を備える、コンピュータ実装方法。
【請求項2】
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、請求項1に記載のコンピュータ実装方法。
【請求項3】
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする段階、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期される、を更に備える、請求項1又は2に記載のコンピュータ実装方法。
【請求項4】
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される、前述の請求項のいずれかに記載のコンピュータ実装方法。
【請求項5】
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する段階、を更に備える、前述の請求項のいずれかに記載のコンピュータ実装方法。
【請求項6】
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する段階を更に備える、前述の請求項のいずれかに記載のコンピュータ実装方法。
【請求項7】
前記キューが最大キュー長の閾値パーセンテージに到達したことに応答して、前記バッファ内に新たなキューを作成する段階;及び
新たに入来するインデックスキーを前記新たなキューにルーティングする段階
を更に備える、前述の請求項のいずれかに記載のコンピュータ実装方法。
【請求項8】
インデックスのロック競合をハンドリングするためのコンピュータプログラム製品であって、プログラムコードが具現化された1つ又は複数のコンピュータ可読ストレージ媒体を備え、前記プログラムコードは:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する手順;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする手順、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する手順、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶する
のためのプログラミング命令を有する、コンピュータプログラム製品。
【請求項9】
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、請求項8に記載のコンピュータプログラム製品。
【請求項10】
前記プログラムコードは:
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする手順、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期される
のための前記プログラミング命令を更に有する、請求項8又は9に記載のコンピュータプログラム製品。
【請求項11】
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される、請求項8~10のいずれかに記載のコンピュータプログラム製品。
【請求項12】
前記プログラムコードは:
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
のための前記プログラミング命令を更に有する、請求項8~11のいずれかに記載のコンピュータプログラム製品。
【請求項13】
前記プログラムコードは:
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
のための前記プログラミング命令を更に有する、請求項8~12のいずれかに記載のコンピュータプログラム製品。
【請求項14】
前記プログラムコードは:
前記キューが最大キュー長の閾値パーセンテージに到達したことに応答して、前記バッファ内に新たなキューを作成する手順;及び
新たに入来するインデックスキーを前記新たなキューにルーティングする手順
のための前記プログラミング命令を更に有する、請求項8~13のいずれかに記載のコンピュータプログラム製品。
【請求項15】
インデックスのロック競合をハンドリングするためのコンピュータプログラムを記憶するためのメモリ;及び
前記メモリに接続されたプロセッサ、ここで前記プロセッサは:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する手順;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする手順、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する手順、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶する
を有する前記コンピュータプログラムのプログラム命令を実行するように構成されている
を備えるシステム。
【請求項16】
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、請求項15に記載のシステム。
【請求項17】
前記コンピュータプログラムの前記プログラム命令は:
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする手順、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期される
を更に有する、請求項15又は16に記載のシステム。
【請求項18】
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される、請求項15~17のいずれかに記載のシステム。
【請求項19】
前記コンピュータプログラムの前記プログラム命令は:
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
を更に有する、請求項15~18のいずれかに記載のシステム。
【請求項20】
前記コンピュータプログラムの前記プログラム命令は:
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
を更に有する、請求項15~19のいずれかに記載のシステム。
【請求項21】
コンピュータプログラムであって、前記コンピュータプログラムがコンピュータ上で実行されるとき、請求項1~7のいずれかのコンピュータ実装方法を実行するように適合されたプログラムコード手段を備える、コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、概してリレーショナルデータベース管理システムに関し、より具体的には、インデックス(例えば、構造化クエリ言語(structured query language:SQL)インデックス)のリーフページのロック競合のハンドリングに関する。
【背景技術】
【0002】
リレーショナルデータベースは、データのリレーショナルモデルに基づくデジタルデータベースである。リレーショナルデータベースを維持するために使用されるシステムは、リレーショナルデータベース管理システム(relational database management system:RDBMS)である。多くのリレーショナルデータベースシステムは、データベースをクエリ及び維持するために構造化クエリ言語(SQL)を使用する選択肢を有する。
【発明の概要】
【0003】
本開示の一実施形態において、インデックスのロック競合をハンドリングするためのコンピュータ実装方法は、インデックスキーの挿入動作中にインデックスのリーフページのロック競合について監視する段階を備える。本方法は、インデックスのリーフページのロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする段階を更に備え、ここで第1のインデックスキーは、インデックスのリーフページに挿入されることになるトランザクションのインデックスキーに対応している。本方法は、加えて、バッファのキューに記憶された第1のインデックスキーの、ロック競合を経験しているリーフページへのマッピングをデータ構造に記憶する段階、ここでデータ構造は、バッファのキューに記憶されたインデックスキーの、インデックスのリーフページへのマッピングを記憶する、を備える。
【0004】
上記で説明されたコンピュータ実装方法の実施形態の他の形態は、システムの形態及びコンピュータプログラム製品の形態である。
【0005】
一態様によれば、インデックスのロック競合をハンドリングするためのコンピュータプログラム製品が提供され、当該コンピュータプログラム製品は、プログラムコードが具現化された1つ又は複数のコンピュータ可読ストレージ媒体を備え、当該プログラムコードは、インデックスキーの挿入動作中に当該インデックスのリーフページのロック競合について監視する手順;当該インデックスの当該リーフページの当該ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする手順、ここで当該第1のインデックスキーは、当該インデックスの当該リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び、当該バッファの当該キューに記憶された当該第1のインデックスキーの、当該ロック競合を経験している当該リーフページへのマッピングをデータ構造に記憶する手順、ここで当該データ構造は、当該バッファのキューに記憶されたインデックスキーの、当該インデックスのリーフページへのマッピングを記憶する、のためのプログラミング命令を有する。
【0006】
別の態様によれば、インデックスのロック競合をハンドリングするためのコンピュータプログラムを記憶するためのメモリ;及び、当該メモリに接続されたプロセッサ、ここで当該プロセッサは、インデックスキーの挿入動作中に当該インデックスのリーフページのロック競合について監視する手順;当該インデックスの当該リーフページの当該ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする手順、ここで当該第1のインデックスキーは、当該インデックスの当該リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び、当該バッファの当該キューに記憶された当該第1のインデックスキーの、当該ロック競合を経験している当該リーフページへのマッピングをデータ構造に記憶する手順、ここで当該データ構造は、当該バッファのキューに記憶されたインデックスキーの、当該インデックスのリーフページへのマッピングを記憶する、を有するコンピュータプログラムのプログラム命令を実行するように構成されている、を備えるシステムが提供される。
【0007】
上記では、以下に続く本開示の詳細な説明がより良く理解され得るために、本開示の1つ又は複数の実施形態の特徴及び技術的利点をかなり一般的に概説している。本開示の追加の特徴及び利点は、以降で説明されることになり、本開示の特許請求の範囲の主題を形成し得る。
【図面の簡単な説明】
【0008】
ここで、本発明の1つ又は複数の好ましい実施形態が、例としてのみ、以下の図面を参照して説明される。
【0009】
【
図1】本開示の実施形態による、本開示の原理を実践する通信システムを示す。
【0010】
【
図2】本開示の実施形態による、インデックスのリーフページのロック競合を効果的にハンドリングするためのリレーショナルデータベース管理システムのソフトウェアコンポーネントを示す図である。
【0011】
【
図3】本開示を実践するためのハードウェア環境を代表する、リレーショナルデータベース管理システムのハードウェア構成の本開示の実施形態を示す。
【0012】
【
図4】本開示の実施形態による、インデックスのリーフページのロック競合をハンドリングするための方法のフローチャートである。
【0013】
【
図5】本開示の実施形態による、リーフページへのインデックスキーの挿入動作中にインデックスのリーフページのロック競合について監視することを示す。
【0014】
【
図6】本開示の実施形態による、ロック競合を経験しているリーフページにインデックスキーを記憶する試みを伴うトランザクションから、インデックス分配キューバッファのキューへのインデックスキーのルーティングを示す。
【0015】
【
図7】本開示の実施形態による、追加のインデックスキーのストレージをハンドリングするための方法のフローチャートである。
【0016】
【
図8】本開示の実施形態による、ロック競合を以前に経験していた適切なリーフページにインデックスキーを非同期的に挿入するための方法のフローチャートである。
【0017】
【
図9】本開示の実施形態による、リーフページのインデックス分割、リーフページを伴うシステムチェックポイント、又はリーフページを伴うSELECT文、UPDATE文、又はDELETE文の受信、を検出することに応答して、リーフページにインデックスキーを同期的に挿入するための方法のフローチャートである。
【0018】
【
図10】本開示の実施形態による、潜在的な将来のロック競合が検出された場合において、インデックス分割中にリーフページを事前割り当てするための方法のフローチャートである。
【
図11】本開示の実施形態による、インデックス分割中にリーフページを事前割り当てすることを示す。
【発明を実施するための形態】
【0019】
背景技術のセクションにおいて述べた通り、リレーショナルデータベースは、データのリレーショナルモデルに基づくデジタルデータベースである。リレーショナルデータベースを維持するために使用されるシステムは、リレーショナルデータベース管理システム(RDBMS)である。多くのリレーショナルデータベースシステムは、データベースをクエリ及び維持するために構造化クエリ言語(SQL)を使用する選択肢を有する。
【0020】
SQL INSERT INTO文などのSQLクエリは、リレーショナルデータベース管理システム(例えば、SQLサーバ)によって受信及び処理され得る。そのようなクエリ(例えば、SQL INSERT INTO文)は、データベース内のテーブルに新たなデータ行を追加するために使用され得る。そのようなシナリオが発生した場合、このテーブル上で定義された関連するインデックスが更新される必要がある。
【0021】
インデックスは、テーブル又はビューからの行の取得を高速化する、テーブル又はビューに関連付けられたオンディスク構造である。インデックスは、通常、テーブル又はビュー内の1つ又は複数の列から構築されたキーを含む。これらのキーは、リレーショナルデータベース管理システムがキー値に関連付けられた単数又は複数の行を迅速かつ効率的に見つけることを可能にする構造(Bツリー)に記憶される。その結果、データベース内のテーブルに新たなデータ行が追加された場合、インデックスはそのようなデータ行に関連付けられたキー値を含むように更新される必要がある。そのようなキー値をインデックスに記憶することは、本明細書において「トランザクション」と称される。
【0022】
Bツリーインデックスは、データベースを固定サイズのブロック又はページに分割するマルチレベルツリー構造を作成する。各レベルのこのツリーを使用して、アドレスの場所を介してそれらのページをリンクすることができ、(ノード又は内部ページとして知られる)或るページが最下位レベルにおけるリーフページで別のページを参照することを可能にする。或るページは、通常、ツリーの開始点、すなわち「ルート」である。ここで特定のキーの探索が始まり、リーフを終点とするパスを辿ることになる。すなわち、インデックスのリーフページは、当該インデックスについての全てのキーがソートされた順序で表示される、インデックスの最下位レベルである。そのような構造内の殆どのページは、最終的に特定のテーブル行を参照するリーフページである。
【0023】
時折、複数の異なるトランザクションがインデックス(例えば、SQLインデックス)のリーフページにキー値を同時に挿入することを試みており、それにより、パフォーマンスに悪影響を及ぼす「ロック競合」がもたらされる。「ロック競合」は、或るプロセス(トランザクション)が、別のプロセス(トランザクション)によって保持されている「ロック」を取得することを試みた場合に必ず発生する。
【0024】
ロック競合に対処する試みにおいて、そのようなトランザクションは、ランダム化された様式でハンドリングされ得る。しかしながら、そのようなトランザクションに関連したSQLクエリなどのクエリの処理は、パフォーマンスを損ねることになる。
【0025】
更に、ロック競合に対処するための別の試みにおいて、インデックスのリーフページの最小ページサイズが拡大され得る。しかしながら、ロック競合はわずかに削減されることになるのみである。更に、インデックスのリーフページの最小ページサイズを拡大した結果として、インデックスアクセス中により多くのデータベース入力/出力動作が必要とされることになる。
【0026】
その結果、現在、インデックス(例えば、SQLインデックス)のリーフページのロック競合を効果的にハンドリングするための手段は存在しない。
【0027】
本開示の実施形態は、ロック競合を経験しているリーフページにインデックスキーを記憶するのとは対照的に、バッファのキューにそのようなインデックスキーを記憶するためのバッファ(本明細書において「インデックス分配キューバッファ」と称される)を利用することにより、SQLインデックスなどのインデックスのリーフページのロック競合を効果的にハンドリングするための手段を提供する。そのようなリーフページがもはやそのようなロック競合を経験しなくなると、適切なインデックスキーが、次に、インデックス分配キューバッファから除外され、インデックス分配キューバッファに記憶されたインデックスキーをインデックスの適切なリーフページにマッピングするデータ構造(本明細書において「インデックスリーフルータマップ」と称される)に基づき、リーフページに記憶される。これら及び他の特徴のより詳細な説明は、以下で提供される。
【0028】
本開示の幾つかの実施形態において、本開示は、インデックス(例えば、SQLインデックス)のロック競合をハンドリングするためのコンピュータ実装方法、システム、及びコンピュータプログラム製品を備える。本開示の一実施形態において、インデックス(例えば、SQLインデックス)のリーフページは、トランザクションによるインデックスキーの挿入動作中にロック競合について監視される。本明細書において使用される場合、「ロック競合」は、或るプロセス(トランザクション)が、別のプロセス(トランザクション)によって保持されているインデックスのリーフページに対する「ロック」を取得すること試みる任意の時を指す。本明細書において使用される場合、「インデックス」は、テーブル又はビューからの行の取得を高速化する、テーブル又はビューに関連付けられたオンディスク構造を指す。一実施形態において、そのようなインデックスは、テーブル又はビュー内の1つ又は複数の列から構築された「キー」又は「インデックスキー」を記憶する。本明細書において使用される場合、「インデックスキー」は、インデックス(例えば、SQLインデックス)のキーを指し、これは、リレーショナルデータベース管理システムがキー値に関連付けられた単数又は複数の行を迅速かつ効率的に見つけることを可能にする。そのようなキー値をインデックスに記憶することは、本明細書において「トランザクション」と称される。更に、インデックスの「リーフページ」は、当該インデックスについての全てのキーがソートされた順序で表示される、インデックスの最下位レベルである。リーフページのロック競合を検出すると、そのようなリーフページに入力されることになる次のインデックスキーが、バッファ(本明細書において「インデックス分配キューバッファ」と称される)のキューにルーティングされる。インデックス分配キューバッファのキューに記憶されたインデックスキーは、次に、トランザクションがそのようなインデックスキーを記憶することを当初試みた、ロック競合を経験している特定のリーフページにマッピングされる。一実施形態において、そのようなマッピングは、インデックス分配キューバッファのキューに記憶されたインデックスキーの、インデックスのリーフページへのマッピングを記憶する、本明細書において「インデックスリーフルータマップ」と称されるデータ構造に記憶される。そのようなリーフページがもはやそのようなロック競合を経験しなくなると、適切なインデックスキーが、次に、インデックス分配キューバッファから除外され、インデックスリーフルータマップのマッピングに基づき、適切なリーフページに記憶される。このようにして、SQLインデックスなどのインデックスのリーフページのロック競合が効果的にハンドリングされる。
【0029】
以下の説明において、本開示の徹底した理解を提供するために多くの具体的な詳細が記載される。しかしながら、そのような具体的な詳細がなくても本開示が実践され得ることが当業者には明らかとなる。他の事例では、不必要な詳細で本開示を不明瞭にしないように、周知の回路は、ブロック図の形式で示されている。殆どの部分において、タイミングの考慮事項等を考慮した詳細は、そのような詳細が本開示の完全な理解を得るのに必要でない限り、及び関連技術における当業者の技能の範囲内である限り、省略されている。
【0030】
ここで図面を詳細に参照すると、
図1は、本開示の原理を実践するための通信システム100の本開示の実施形態を示す。通信システム100は、ネットワーク103を介してリレーショナルデータベース管理システム102(例えば、構造化クエリ言語(SQLサーバ))に接続されたコンピューティングデバイス101を含む。更に、
図1に示されている通り、リレーショナルデータベース管理システム102はデータベース104に接続されている。
【0031】
コンピューティングデバイス101は、ネットワーク103に接続し、その結果、他のコンピューティングデバイス101及びリレーショナルデータベース管理システム102と通信する能力を伴って構成された任意のタイプのコンピューティングデバイス(例えば、ポータブルコンピューティングユニット、パーソナルデジタルアシスタント(Personal Digital Assistant :PDA(登録商標))、ラップトップコンピュータ、モバイルデバイス、タブレットパーソナルコンピュータ、スマートフォン、モバイル電話、ナビゲーションデバイス、ゲームユニット、デスクトップコンピュータシステム、ワークステーション、インターネットアプライアンス等)であり得る。コンピューティングデバイス101及びコンピューティングデバイス101のユーザの両方が、要素番号101で識別され得る点に留意されたい。
【0032】
ネットワーク103は、例えば、ローカルエリアネットワーク、ワイドエリアネットワーク、ワイヤレスワイドエリアネットワーク、回路交換電話網、モバイル通信用グローバルシステム(GSM(登録商標):Global System for Mobile Communications)ネットワーク、ワイヤレスアプリケーションプロトコル(WAP)ネットワーク、WiFiネットワーク、IEEE802.11標準規格ネットワーク、これらの様々な組み合わせなどであってよい。本開示の範囲から逸脱することなく、他のネットワーク(その説明はここでは簡潔性のために省略される)も、
図1のシステム100と併せて使用されてよい。
【0033】
一実施形態において、コンピューティングデバイス101のユーザは、データベース104からの情報を更新、削除、及び要求するために、リレーショナルデータベース管理システム102(例えば、SQLサーバ)にクエリ(例えば、SQLクエリ)を発行する。例えば、ユーザは、データベース104においてテーブルに新たなデータ行を追加するためにINSERT INTOのクエリを発行してよい。そのようなクエリは、ユーザによる要求に応じてデータを記憶及び取得するなど、リレーショナルデータベース管理システム102によって処理されることになる。
【0034】
一実施形態において、リレーショナルデータベース管理システム102は、リレーショナルデータベースなどのデータベース104を維持するように構成されている。一実施形態において、リレーショナルデータベース管理システム102は、データベース104をクエリ及び維持するために構造化クエリ言語(SQL)を使用するように構成されたSQLサーバに対応している。
【0035】
一実施形態において、リレーショナルデータベース管理システム102は、ロック競合を経験しているリーフページにインデックスキーを記憶するのとは対照的に、バッファのキューにそのようなインデックスキーを記憶するためのバッファ(本明細書において「インデックス分配キューバッファ」と称される)を利用することにより、SQLインデックスなどのインデックスのリーフページのロック競合を効果的にハンドリングするように構成されている。そのようなリーフページがもはやそのようなロック競合を経験しなくなると、適切なインデックスキーが、次に、インデックス分配キューバッファから除外され、インデックス分配キューバッファに記憶されたインデックスキーをインデックスの適切なリーフページにマッピングするデータ構造(本明細書において「インデックスリーフルータマップ」と称される)に基づき、適切なリーフページに記憶される。これら及び他の特徴のより詳細な説明は、以下で提供される。更に、リレーショナルデータベース管理システム102のソフトウェアコンポーネントの説明が、
図2に関連して以下で提供され、リレーショナルデータベース管理システム102のハードウェア構成の説明が、
図3に関連して更に以下で提供される。
【0036】
システム100は、いずれか1つの特定のネットワークアーキテクチャに範囲を限定されるものではない。システム100は、任意の数のコンピューティングデバイス101、リレーショナルデータベース管理システム102、ネットワーク103、及びデータベース104を含み得る。
【0037】
SQLインデックスなどのインデックスのリーフページのロック競合を効果的にハンドリングするためにリレーショナルデータベース管理システム102によって使用されるソフトウェアコンポーネントに関する論述は、
図2に関連して以下で提供される。
【0038】
図2は、本開示の実施形態による、SQLインデックスなどのインデックスのリーフページのロック競合を効果的にハンドリングするためのリレーショナルデータベース管理システム102のソフトウェアコンポーネントの図である。
【0039】
図1と併せて
図2を参照すると、リレーショナルデータベース管理システム102は、インデックスキーの挿入動作中にインデックス(例えば、SQLインデックス)のリーフページのロック状態を監視するように構成された監視エンジン201を備える。以前に論述された通り、インデックスのリーフページへのインデックスキーの挿入動作は、クエリ(例えば、SQLクエリ)が、データベース104内のテーブルへの新たなデータ行など、データベース104内にデータを追加することを要求した場合に発生する。本明細書において使用される場合、「インデックス」は、テーブル又はビューからの行の取得を高速化する、テーブル又はビューに関連付けられたオンディスク構造を指す。一実施形態において、そのようなインデックスは、テーブル又はビュー内の1つ又は複数の列から構築された「キー」又は「インデックスキー」を記憶する。本明細書において使用される場合、「インデックスキー」は、インデックス(例えば、SQLインデックス)のキーを指し、これは、リレーショナルデータベース管理システム102がキー値に関連付けられた単数又は複数の行を迅速かつ効率的に見つけることを可能にする。そのようなインデックスキーは、値(例えば、123242)、可変文字(例えば、「Smith1」)などに対応する。そのようなキー値をインデックスに記憶することは、本明細書において「トランザクション」と称される。
【0040】
更に、以前に論述された通り、一実施形態において、インデックスキーはBツリー構造に記憶され、ここでそのようなBツリーインデックスは、データベースを固定サイズのブロック又はページに分割するマルチレベルツリー構造を含む。各レベルのこのツリーを使用して、アドレスの場所を介してそれらのページをリンクすることができ、(ノード又は内部ページとして知られる)或るページが最下位レベルにおけるリーフページで別のページを参照することを可能にする。或るページは、通常、ツリーの開始点、すなわち「ルート」である。ここで特定のキーの探索が始まり、リーフを終点とするパスを辿ることになる。すなわち、インデックスの「リーフページ」は、当該インデックスについての全てのキーがソートされた順序で表示される、インデックスの最下位レベルである。
【0041】
一実施形態において、監視エンジン201は、リーフページへのインデックスキーの挿入動作中にインデックス内のそのようなリーフページのロック競合について監視する。本明細書において使用される場合、「ロック競合」は、トランザクションがインデックスのリーフページにキー値を同時に挿入することを試みることを指す。すなわち、「ロック競合」は、或るプロセス(トランザクション)が、別のプロセス(トランザクション)によって保持されている「ロック」を取得することを試みた場合に必ず発生する。一実施形態において、他のプロセス(トランザクション)がリーフページを利用することを防止するためのリーフページに対する「ロック」は、「ページレベルロック」によって実現され得る。本明細書において使用される場合、「ページレベルロック」は、リーフページ全体をロックすることを指す。代替的に、プロセス(トランザクション)は、「行ロック+ページラッチ」を介するなどして、リーフページの行をロックし得る。本明細書において使用される場合、「行ロック」は、リーフページの特定の行をロックすることを指し、本明細書において使用される場合、「ページラッチ」は、ユーザによってではなくリレーショナルデータベース管理システム102(例えば、SQLサーバ)によって管理されるメカニズムを指し、その中でリレーショナルデータベース管理システム102は、アクセスを防止するためにリーフページに「ラッチ」又は「ホールド」を課す。本明細書において使用される場合、「行ロック+ページラッチ」は、「行ロック」及び「ページラッチ」の組み合わせを指す。
【0042】
一実施形態において、監視エンジン201は、ページレベルロック待機キューの長さに基づき、ロック競合を検出する。本明細書において使用される場合、「ページレベルロック待機キュー」は、実装されることになる様々なページレベルロック(様々なリーフページのために配置されるロック)を記憶するキューを指す。例えば、そのようなロック競合は、キューの全長の閾値パーセンテージに基づき得る。一実施形態において、そのような閾値パーセンテージは、ユーザ指定のものであり得る。
【0043】
一実施形態において、監視エンジン201は、行レベルロック待機キューの長さに基づき、ロック競合を検出する。本明細書において使用される場合、「行レベルロック待機キュー」は、実装されることになる様々な行レベルロック(リーフページ内の様々な行のために配置されるロック)を記憶するキューを指す。例えば、そのようなロック競合は、キューの全長の閾値パーセンテージに基づき得る。一実施形態において、そのような閾値パーセンテージは、ユーザ指定のものであり得る。
【0044】
一実施形態において、監視エンジン201は、ラッチ待機キューの長さに基づき、ロック競合を検出する。本明細書において使用される場合、「ラッチ待機キュー」は、実装されることになる様々なページラッチ(様々なリーフページのために配置されるラッチ)を記憶するキューを指す。例えば、そのようなロック競合は、キューの全長の閾値パーセンテージに基づき得る。一実施形態において、そのような閾値パーセンテージは、ユーザ指定のものであり得る。
【0045】
そのような監視を実行するために監視エンジン201によって利用されるソフトウェアツールの例は、SolarWinds(登録商標)Database Performance Analyzer、Paessler(登録商標)PRG Network Monitor、SQL Power Tools、Redgate(登録商標)SQL Monitor、Nagios(登録商標)、Opsview(登録商標)などを含むが、これらに限定されない。
【0046】
更に、監視エンジン201は、インデックスのリーフページにおけるロック競合のレベルを検出するように構成されており、例えば、それが、ユーザ指定のものであり得る閾値レベルを下回っているかを判定する。一実施形態において、インデックスのリーフページにおけるロック競合の程度又はレベルは、リーフページにインデックスキーを記憶することを試みているトランザクションの数に基づき、並びに、ページ空きサイズ情報に基づき、監視エンジン201によって判定される。本明細書において使用される場合、「ページ空きサイズ情報」は、インデックスキーを記憶するためにリーフページにおいて利用可能なメモリスペースの量を示す。一実施形態において、インデックス(例えば、SQLインデックス)の各リーフページには、専門家などによって特定のサイズ(例えば、3KB)が割り当てられている。一実施形態において、監視エンジン201は、インデックスキーのストレージによって使用されているメモリの量を追跡するように構成されており、従って、追加のインデックスキーを記憶するために残されているメモリスペースの量を判定することができる。インデックス(例えば、SQLインデックス)のリーフページのメモリ使用量を追跡するために監視エンジン201によって利用されるソフトウェアツールの例は、SQLShack、ApexSQL by Quest(登録商標)などを含むが、これらに限定されない。
【0047】
一実施形態において、インデックスのリーフページのそのようなメモリ使用量、及び、リーフページに書き込まれることになるインデックスキーの数に基づき、リーフページにおけるロック競合の程度又はレベルが判定され得る。例えば、リーフページに書き込まれることになるインデックスキーの数が、リーフページ内の残りの利用可能なメモリスペースの50%を超えるメモリスペースを必要とする場合、リーフページは、ロック競合を経験していると言うことができる。他方、リーフページに書き込まれることになるインデックスキーの数が、リーフページ内の残りの利用可能なメモリスペースの25%未満であるメモリスペースを必要とする場合、リーフページは、低レベルのロック競合を経験していると言うことができる。本明細書において使用される場合、「低レベル」のロック競合は、ロック競合を経験していないと見なされるリーフページを指す。
【0048】
リレーショナルデータベース管理システム102は、本明細書において「インデックス分配キューバッファ」と称されるバッファを作成するように構成されたバッファエンジン202を更に備える。一実施形態において、インデックス分配キューバッファは、1つ又は複数のキューを含むように構成されており、各キューは、以下で更に論述される通り、特定のリーフページにマッピングされる1つ又は複数のインデックスキーを記憶する。一実施形態において、バッファのキューに記憶されているインデックスキーは、コンペア・アンド・スワップを介して同期される。本明細書において使用される場合、「コンペア・アンド・スワップ」は、同期を実現するためにマルチスレッドで使用されるアトミック命令を指す。それは、メモリ位置のコンテンツを所与の値と比較し、それらが同じである場合にのみ、当該メモリ位置のコンテンツを新たな所与の値に修正する。
【0049】
一実施形態において、バッファエンジン202は、インデックス(例えば、SQLインデックス)のリーフページのロック競合の程度に基づき、インデックス分配キューバッファ内のキューを追加又は削除する。例えば、一実施形態において、バッファエンジン202は、インデックス分配キューバッファの他のキューが、ロック競合を経験しているインデックスのリーフページに記憶されることが試みられている追加のインデックスキーのストレージをハンドリングできない状況の間に、キューがその最大キュー長の閾値パーセンテージ(例えば、90%)に到達した場合、インデックス分配キューバッファ内に新たなキューを作成する。
【0050】
一実施形態において、キューに記憶されたインデックスキーの数は、バッファエンジン202によって維持される「キューカウント」を介して追跡され得る。キューカウントが、キューがもはやいかなるインデックスキーも記憶していないことを示すゼロに到達すると、そのようなキューはリサイクルされ得る。すなわち、インデックス分配キューバッファ内のキューのデータ構造が削除され、キューの削除されたデータ構造によって以前に利用されていたメモリは今や、インデックス分配キューバッファに後に追加される新たなキューのためなど、自由に後に使用され得る。
【0051】
インデックス分配キューバッファ内のキューを追加又は削除するためにバッファエンジン202によって利用されるソフトウェアツールの例は、ManageEngine(登録商標)OpManager、SolarWinds(登録商標)Network Performance Monitor、Redis、Amazon(登録商標)SQSなどを含むが、これらに限定されない。
【0052】
更に、リレーショナルデータベース管理システム102は、監視エンジン201がリーフページにおけるロック状態を検出することに応答して、インデックス分配キューバッファのキューにインデックスキーをルーティングするように構成されたルーティングエンジン203を含む。
【0053】
一実施形態において、ルーティングエンジン203は、モジュラーハッシュなどの特定のルールの観点で、インデックス分配キューバッファのキューにインデックスキーをルーティングするように構成されている。一実施形態において、ルーティングエンジン203は、インデックスキーを記憶するために利用可能なその容量の少なくとも閾値パーセンテージ(例えば、5%)を有するインデックス分配キューバッファのキューにのみインデックスキーを記憶するように構成されている。一実施形態において、そのような閾値パーセンテージは、ユーザ指定のものであり得る。
【0054】
一実施形態において、ルーティングエンジン203は、リーフページにおけるロック競合のレベルが閾値レベルを下回っているとの検出に応答して、データ構造(インデックス分配キューバッファに記憶されたインデックスキーの、インデックスの適切なリーフページへのマッピング)に基づき、インデックス分配キューバッファからインデックスキーを除外し、それらを適切なリーフページに非同期的に挿入するように構成されている。そのような検出は、上記で論述された通り、監視エンジン201によって実行される。
【0055】
一実施形態において、ルーティングエンジン203は、リーフページの分割の検出、リーフページについてのシステムチェックポイントのトリガ、及び、リーフページを伴うSELECT文、UPDATE文、又はDELETE文の受信に応答して、データ構造(インデックス分配キューバッファに記憶されたインデックスキーの、インデックスの適切なリーフページへのマッピング)に基づき、インデックス分配キューバッファからインデックスキーを除外し、それらを適切なリーフページに同期的に挿入するように構成されている。そのような検出は、検出器エンジン205に関連して以下で更に論述される。
【0056】
本明細書において使用される場合、リーフページの「分割」は、或るリーフページ上にあることが必要とされる新たなデータ(例えば、新たな行)を追加するのに十分なメモリスペースがなく、その結果、当該リーフページが分割しなければならない場合の状況を指す。分割が発生した場合、リーフページは、リーフページの各々で当該元のリーフページの行のおよそ半分を有する2つのページに分割され得る。
【0057】
本明細書において使用される場合、リーフページについての「システムチェックポイント」は、リーフページから取得されたインデックスキーなどのデータを、当該データをベースラインコピーと比較することによって検証するテスト動作を指す。
【0058】
SQL SELECT文などのSELECT文は、データベース104からデータを選択するために使用される。SQL UPDATE文などのUPDATE文は、データベース104のテーブル内の既存のレコードを修正するために使用される。SQL DELETE文などのDELETE文は、データベース104のテーブル内の既存のレコードを削除するために使用される。
【0059】
インデックスキーをインデックス分配キューバッファからインデックス(例えばSQLインデックス)の適切なリーフページにルーティングするためにルーティングエンジン203によって利用されるソフトウェアツールの例は、ApexSQL by Quest(登録商標)、PostgreSQL(登録商標)、Snowflake(登録商標)などを含むが、これらに限定されない。
【0060】
加えて、リレーショナルデータベース管理システム102は、本明細書において「インデックスリーフルータマップ」と称されるデータ構造(例えば、テーブル)を構築するように構成されたマッピングエンジン204を含む。一実施形態において、そのようなデータ構造は、リレーショナルデータベース管理システム102のストレージデバイス(例えば、メモリ、ディスクユニット)に記憶される。
【0061】
上記で論述された通り、「インデックスリーフルータマップ」は、インデックス分配キューバッファに記憶されたインデックスキーを、インデックスの適切なリーフページにマッピングする。一実施形態において、マッピングエンジン204は、インデックス分配キューバッファのキューの様々なメモリ位置に記憶されたインデックスキーを、そのようなメモリ位置に基づき、様々なリーフページにマッピングする。例えば、キーインデックスは、キュー#1のメモリ位置Q11に記憶され得る。そのようなメモリ位置は、次に、特定のリーフページ(例えば、リーフページ#5)に関連付けられたインデックスリーフルータマップに記憶され得る。一実施形態において、特定のリーフページは、リレーショナルデータベース管理システム102によって受信されたクエリに基づいており、その中で、当該クエリが、データベース104のテーブルへの新たなデータ行の追加をもたらし、それにより、そのようなリーフページに記憶されるべきインデックスキーがもたらされる。このリーフページにそのようなインデックスキーを記憶する代わりに、それは、リーフページがインデックスキーを記憶するのに十分な容量を有するようになるまで、インデックス分配キューバッファに一時的に記憶される。どのリーフページがどのインデックスキーを受信すべきかを追跡するために、そのような情報は、マッピングエンジン204によってインデックスリーフルータマップ内に維持される。
【0062】
一実施形態において、インデックス分配キューバッファのキュー内のインデックスキーのメモリ位置と、インデックス(例えば、SQLインデックス)の様々なリーフページの識別子とのマッピングは、コンペア・アンド・スワップを介して同期される。
【0063】
インデックス分配キューバッファに記憶されたインデックスキーをインデックスの適切なリーフページにマッピングするためにマッピングエンジン204によって利用されるソフトウェアツールの例は、IBM(登録商標)Db2、ApexSQL by Quest(登録商標)などを含むが、これらに限定されない。
【0064】
更に、リレーショナルデータベース管理システム102は、リーフページ分割、リーフページについてのシステムチェックポイントのトリガ、及びリーフページを伴うSELECT文、UPDATE文、又はDELETE文の受信を検出するように構成された検出器エンジン205を備える。
【0065】
上記で論述された通り、本明細書において使用される場合、リーフページの「分割」は、或るリーフページ上にあることが必要とされる新たなデータ(例えば、新たな行)を追加するのに十分なメモリスペースがなく、その結果、当該リーフページが分割しなければならない場合の状況を指す。分割が発生した場合、リーフページは、リーフページの各々で当該元のリーフページの行のおよそ半分を有する2つのページに分割され得る。その結果、検出器エンジン205は、元のリーフページに記憶されたデータの半分を記憶するための新たなリーフページの作成時に、リーフページ分割を検出する。
【0066】
更に、上記で論述された通り、本明細書において使用される場合、リーフページについての「システムチェックポイント」は、リーフページから取得されたインデックスキーなどのデータを、当該データをベースラインコピーと比較することによって検証するテスト動作を指す。一実施形態において、検出器エンジン205は、リレーショナルデータベース管理システム102のデータベースエンジン206(例えば、SQLサーバデータベースエンジン)によるチェックポイントの発行の検出に基づき、そのようなシステムチェックポイントを検出する。
【0067】
一実施形態において、データベースエンジン206は、リーフページ内のデータを検証するために、チェックポイント(例えば、自動、間接、手動、及び内部タイプのチェックポイント)を定期的に発行するように構成されている。一実施形態において、そのようなチェックポイントの発行は、データベースエンジン206によって発行されるチェックポイントコマンドに基づき、検出器エンジン205によって検出される。
【0068】
加えて、上記で論述された通り、SQL SELECT文などのSELECT文は、データベース104からデータを選択するために使用される。SQL UPDATE文などのUPDATE文は、データベース104のテーブル内の既存のレコードを修正するために使用される。SQL DELETE文などのDELETE文は、データベース104のテーブル内の既存のレコードを削除するために使用される。一実施形態において、検出器エンジン205は、コンピューティングデバイス101からリレーショナルデータベース管理システム102によって受信されたクエリ内のそのような文を識別することに基づき、そのような文の受信を検出するように構成されている。一実施形態において、検出器エンジン205は、自然言語処理を利用してクエリ内のそのような文を識別し、そのような用語は、専門家によって格納されたデータ構造に記憶される。一実施形態において、そのようなデータ構造は、リレーショナルデータベース管理システム102のストレージデバイス(例えば、メモリ、ディスクユニット)に記憶される。
【0069】
一実施形態において、検出器エンジン205は、インデックス分割中にリーフページ内のインデックスキーの順次挿入パターンを検出するように構成されている。上記で論述された通り、インデックス分割が発生した場合、リーフページは、リーフページの各々で当該元のリーフページの行のおよそ半分を有する2つのページに分割され得る。一実施形態において、インデックスキーの順次パターン(連続移動パターン)がそのようなリーフページに入力された場合、検出器エンジン205は、起こり得るロック競合シナリオを削減するために、インデックスの複数のリーフページを非同期的に事前割り当てする。インデックスキーの順次パターンはそのようなリーフページ内で継続し得るため、そのような状況においてはロック競合が発生する可能性がより高いと言うことができる。一実施形態において、そのような連続移動パターンは、以前のリーフページからの高/低キー値を用いて、それらの新たな事前割り当てされたリーフページに対する非リーフキー値としてキー値を予測することにより、検出器エンジン205によって検出される。
【0070】
インデックス(SQLインデックス)のリーフページのロック競合をハンドリングするための方法の論述に関連して、これら及び他の機能の更なる説明が以下で提供される。
【0071】
インデックス(SQLインデックス)のリーフページのロック競合をハンドリングするための方法の論述に先立ち、リレーショナルデータベース管理システム102(
図1)のハードウェア構成の説明が、
図3に関連して以下で提供される。
【0072】
ここで
図3を参照すると、
図3は、本開示を実践するためのハードウェア環境を代表する、リレーショナルデータベース管理システム102(
図1)のハードウェア構成の本開示の実施形態を示す。
【0073】
リレーショナルデータベース管理システム102は、システムバス302によって様々な他のコンポーネントに接続されたプロセッサ301を有する。オペレーティングシステム303が、プロセッサ301上で実行され、
図3の様々なコンポーネントの制御を提供し、それらの機能を協働させる。本開示の原理によるアプリケーション304は、オペレーティングシステム303と併せて実行され、オペレーティングシステム303に対する呼び出しを提供し、ここで、呼び出しは、アプリケーション304によって実行されることになる様々な機能又はサービスを実装する。アプリケーション304は、例えば、監視エンジン201(
図2)、バッファエンジン202(
図2)、ルーティングエンジン203(
図2)、マッピングエンジン204(
図2)、検出器エンジン205(
図2)及びデータベースエンジン206(
図2)を含み得る。更に、アプリケーション304は、例えば、
図4~
図11に関連して以下で更に論述される通り、インデックス(例えば、SQLインデックス)のリーフページのロック競合をハンドリングするためのプログラムを含み得る。
【0074】
再び
図3を参照すると、リードオンリメモリ(Read-Only Memory:「ROM」)305は、システムバス302に接続されており、リレーショナルデータベース管理システム102の特定の基本機能を制御する基本入力/出力システム(Basic Input/Output System:「BIOS」)を含む。ランダムアクセスメモリ(「RAM」)306及びディスクアダプタ307も、システムバス302に接続されている。オペレーティングシステム303及びアプリケーション304を含むソフトウェアコンポーネントが、実行用のリレーショナルデータベース管理システム102のメインメモリであり得るRAM306にロードされ得ることに留意されたい。ディスクアダプタ307は、ディスクユニット308、例えば、ディスクドライブと通信するインテグレーテッドドライブエレクトロニクス(「IDE」)アダプタであってよい。
図4~
図11に関連して以下で更に論述される通り、インデックス(例えば、SQLインデックス)のリーフページのロック競合をハンドリングするためのプログラムは、ディスクユニット308内又はアプリケーション304内に存在し得ることに留意されたい。
【0075】
リレーショナルデータベース管理システム102は、バス302に接続された通信アダプタ309を更に含み得る。通信アダプタ309は、コンピューティングデバイス101(
図1)などの他のデバイスと通信するために、バス302を外部ネットワーク(例えば、
図1のネットワーク103)と相互接続する。
【0076】
一実施形態において、リレーショナルデータベース管理システム102のアプリケーション304は、監視エンジン201、バッファエンジン202、ルーティングエンジン203、マッピングエンジン204、検出器エンジン205、及びデータベースエンジン206のソフトウェアコンポーネントを含む。一実施形態において、そのようなコンポーネントは、ハードウェアにおいて実装されてよく、その場合、そのようなハードウェアコンポーネントは、バス302に接続されることになる。そのようなコンポーネントによって実行される、上記で論述された機能は、汎用的なコンピュータ機能ではない。その結果、リレーショナルデータベース管理システム102は、特定の、非汎用的なコンピュータ機能を実装した結果である特定のマシンである。
【0077】
一実施形態において、インデックスのリーフページのロック競合をハンドリングするための機能を含む、リレーショナルデータベース管理システム102のそのようなソフトウェアコンポーネント(例えば、監視エンジン201、バッファエンジン202、ルーティングエンジン203、マッピングエンジン204、検出器エンジン205、及びデータベースエンジン206)の機能は、特定用途向け集積回路において具現化され得る。
【0078】
本発明は、任意の可能な技術的詳細レベルの統合におけるシステム、方法及び/又はコンピュータプログラム製品であり得る。コンピュータプログラム製品は、本発明の態様をプロセッサに実行させるためにコンピュータ可読プログラム命令を有するコンピュータ可読ストレージ媒体(単数又は複数)を含んでよい。
【0079】
コンピュータ可読ストレージ媒体は、命令実行デバイスによって使用されるための命令を保持及び記憶できる有形のデバイスであり得る。コンピュータ可読ストレージ媒体は、例えば、電子ストレージデバイス、磁気ストレージデバイス、光学ストレージデバイス、電磁ストレージデバイス、半導体ストレージデバイス、又は上述したものの任意の好適な組み合わせであってよいが、これらに限定されない。コンピュータ可読ストレージ媒体のより具体的な例の非包括的なリストは、以下:ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ(RAM)、リードオンリメモリ(ROM)、消去可能プログラマブルリードオンリメモリ(EPROM又はフラッシュメモリ)、スタティックランダムアクセスメモリ(SRAM)、ポータブルコンパクトディスクリードオンリメモリ(CD-ROM)、デジタル多用途ディスク(DVD)、メモリスティック、フロッピディスク、パンチカード又は命令が記録されている溝内の隆起構造などの機械的にエンコードされたデバイス、及び上述したものの任意の好適な組み合わせを含む。本明細書において使用される場合、コンピュータ可読ストレージ媒体は、電波又は他の自由に伝搬する電磁波、導波路又は他の伝送媒体を通って伝搬する電磁波(例えば、光ファイバケーブルを通過する光パルス)、又はワイヤを通じて伝送される電気信号などの一時的な信号自体であると解釈されるべきではない。
【0080】
本明細書で説明されるコンピュータ可読プログラム命令は、コンピュータ可読ストレージ媒体からそれぞれのコンピューティング/処理デバイスへ、又は、例えば、インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク及び/又はワイヤレスネットワークなどのネットワークを介して外部コンピュータ又は外部ストレージデバイスにダウンロードされ得る。ネットワークは、銅伝送ケーブル、光伝送ファイバ、ワイヤレス伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータ及び/又はエッジサーバを備え得る。各コンピューティング/処理デバイス内のネットワークアダプタカード又はネットワークインタフェースは、ネットワークからコンピュータ可読プログラム命令を受信し、コンピュータ可読プログラム命令を、それぞれのコンピューティング/処理デバイス内のコンピュータ可読ストレージ媒体に記憶するために転送する。
【0081】
本発明の動作を実行するコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ(ISA)命令、マシン命令、マシン依存命令、マイクロコード、ファームウェア命令、状態設定データ、集積回路の構成データであり得、又は、Smalltalk(登録商標)又はC++等のようなオブジェクト指向プログラミング言語、及び「C」プログラミング言語又は同様のプログラミング言語などのような手続き型プログラミング言語を含む1つ又は複数のプログラミング言語の任意の組み合わせで記述されたソースコード又はオブジェクトコードのいずれかであり得る。コンピュータ可読プログラム命令は、ユーザのコンピュータ上で全体的に、ユーザのコンピュータ上で部分的に、スタンドアロンソフトウェアパッケージとして、ユーザのコンピュータ上で部分的にかつリモートコンピュータ上で部分的に、又は、リモートコンピュータ又はサーバ上で全体的に実行し得る。後者のシナリオにおいて、リモートコンピュータは、ローカルエリアネットワーク(LAN)又はワイドエリアネットワーク(WAN)を含む任意のタイプのネットワークを通じてユーザのコンピュータに接続されてもよく、又はこの接続は、(例えば、インターネットサービスプロバイダを用いるインターネットを通じて)外部コンピュータに対して行われ得る。幾つかの実施形態において、例えば、プログラマブルロジック回路、フィールドプログラマブルゲートアレイ(FPGA)、又はプログラマブルロジックアレイ(PLA)を含む電子回路は、本発明の態様を実行するために、コンピュータ可読プログラム命令の状態情報を利用することによってコンピュータ可読プログラム命令を実行して、電子回路をパーソナライズし得る。
【0082】
本発明の態様は、本明細書において、本発明の実施形態による方法、装置(システム)及びコンピュータプログラム製品のフローチャート図及び/又はブロック図を参照して説明されている。フローチャート図及び/又はブロック図の各ブロック、及びフローチャート図及び/又はブロック図におけるブロックの組み合わせは、コンピュータ可読プログラム命令によって実装され得ることが理解されるであろう。
【0083】
これらのコンピュータ可読プログラム命令は、コンピュータのプロセッサ、又は他のプログラマブルデータ処理装置に提供され、マシンを生成してよく、それにより、コンピュータ又は他のプログラマブルデータ処理装置のプロセッサを介して実行される命令が、フローチャート及び/又はブロック図の単数又は複数のブロックで指定された機能/作用を実装するための手段を作成する。また、これらのコンピュータ可読プログラム命令は、命令が記憶されたコンピュータ可読ストレージ媒体が、フローチャート及び/又はブロック図の単数又は複数のブロックにおいて指定される機能/作用の態様を実装する命令を含む製品を有するように、コンピュータ、プログラマブルデータ処理装置、及び/又は他のデバイスが特定の様式で機能するように指示し得るコンピュータ可読ストレージ媒体に記憶され得る。
【0084】
また、コンピュータ可読プログラム命令を、コンピュータ、他のプログラマブルデータ処理装置又は他のデバイスにロードして、一連の動作段階をコンピュータ、他のプログラマブル装置、又は他のデバイス上で実行させ、コンピュータ実装プロセスを生成してよく、それにより、コンピュータ、他のプログラマブル装置又は他のデバイス上で実行される命令は、フローチャート及び/又はブロック図の単数又は複数のブロックにおいて指定される機能/作用を実装する。
【0085】
図におけるフローチャート及びブロック図は、本発明の様々な実施形態によるシステム、方法及びコンピュータプログラム製品の可能な実装のアーキテクチャ、機能及び動作を示している。これに関して、フローチャート又はブロック図の各ブロックは、指定された論理機能を実装するための1つ又は複数の実行可能命令を備える命令のモジュール、セグメント、又は部分を表し得る。幾つかの代替的な実装形態において、ブロックに記されている機能は、図面に記されている順序とは異なる順序で生じ得る。例えば、連続して示されている2つのブロックが、実際には、1つの段階として実現されてよく、同時に、実質的に同時に、部分的に又は全体的に時間が重複する様式で実行されてよく、又は、ブロックは、場合によっては、関与する機能に応じて逆の順序で実行されてよい。ブロック図及び/又はフローチャート図における各ブロック、及びブロック図及び/又はフローチャート図におけるブロックの組み合わせが、指定された機能又は作用を実行する、又は特殊目的ハードウェア及びコンピュータ命令の組み合わせを実行する、特殊目的ハードウェアベースのシステムによって実装され得ることにも留意されたい。
【0086】
上述の通り、SQL INSERT INTO文などのSQLクエリは、リレーショナルデータベース管理システム(例えば、SQLサーバ)によって受信及び処理され得る。そのようなクエリ(例えば、SQL INSERT INTO文)は、データベース内のテーブルに新たなデータ行を追加するために使用され得る。そのようなシナリオが発生した場合、このテーブル上で定義された関連するインデックスが更新される必要がある。インデックスは、テーブル又はビューからの行の取得を高速化する、テーブル又はビューに関連付けられたオンディスク構造である。インデックスは、通常、テーブル又はビュー内の1つ又は複数の列から構築されたキーを含む。これらのキーは、リレーショナルデータベース管理システムがキー値に関連付けられた単数又は複数の行を迅速かつ効率的に見つけることを可能にする構造(Bツリー)に記憶される。その結果、データベース内のテーブルに新たなデータ行が追加された場合、インデックスはそのようなデータ行に関連付けられたキー値を含むように更新される必要がある。そのようなキー値をインデックスに記憶することは、本明細書において「トランザクション」と称される。Bツリーインデックスは、データベースを固定サイズのブロック又はページに分割するマルチレベルツリー構造を作成する。各レベルのこのツリーを使用して、アドレスの場所を介してそれらのページをリンクすることができ、(ノード又は内部ページとして知られる)或るページが最下位レベルにおけるリーフページで別のページを参照することを可能にする。或るページは、通常、ツリーの開始点、すなわち「ルート」である。ここで特定のキーの探索が始まり、リーフを終点とするパスを辿ることになる。すなわち、インデックスのリーフページは、当該インデックスについての全てのキーがソートされた順序で表示される、インデックスの最下位レベルである。そのような構造内の殆どのページは、最終的に特定のテーブル行を参照するリーフページである。時折、複数の異なるトランザクションがインデックス(例えば、SQLインデックス)のリーフページにキー値を同時に挿入することを試みており、それにより、パフォーマンスに悪影響を及ぼす「ロック競合」がもたらされる。「ロック競合」は、或るプロセス(トランザクション)が、別のプロセス(トランザクション)によって保持されている「ロック」を取得することを試みた場合に必ず発生する。ロック競合に対処する試みにおいて、そのようなトランザクションは、ランダム化された様式でハンドリングされ得る。しかしながら、そのようなトランザクションに関連したSQLクエリなどのクエリの処理は、パフォーマンスを損ねることになる。更に、ロック競合に対処するための別の試みにおいて、インデックスのリーフページの最小ページサイズが拡大され得る。しかしながら、ロック競合はわずかに削減されることになるのみである。更に、インデックスのリーフページの最小ページサイズを拡大した結果として、インデックスアクセス中により多くのデータベース入力/出力動作が必要とされることになる。その結果、現在、インデックス(例えば、SQLインデックス)のリーフページのロック競合を効果的にハンドリングするための手段は存在しない。
【0087】
本開示の実施形態は、ロック競合を経験しているリーフページにインデックスキーを記憶するのとは対照的に、バッファのキューにそのようなインデックスキーを記憶するためのバッファ(本明細書において「インデックス分配キューバッファ」と称される)を利用することにより、SQLインデックスなどのインデックスのリーフページのロック競合を効果的にハンドリングするための手段を提供する。そのようなリーフページがもはやロック競合を経験しなくなると、適切なインデックスキーが、次に、インデックス分配キューバッファから除外され、インデックス分配キューバッファに記憶されたインデックスキーをインデックスの適切なリーフページにマッピングするデータ構造(本明細書において「インデックスリーフルータマップ」と称される)に基づき、適切なリーフページに記憶される。これら及び他の特徴の説明は、
図4~
図11に関連して以下で論述される。
図4は、インデックスのリーフページのロック競合をハンドリングするための方法のフローチャートである。
図5は、リーフページにおけるインデックスキーの挿入動作中にインデックスのリーフページのロック競合について監視することを示す。
図6は、ロック競合を経験しているリーフページにインデックスキーを記憶する試みを伴うトランザクションから、インデックス分配キューバッファのキューへのインデックスキーのルーティングを示す。
図7は、追加のインデックスキーのストレージをハンドリングするための方法のフローチャートである。
図8は、ロック競合を以前に経験していた適切なリーフページにインデックスキーを非同期的に挿入するための方法のフローチャートである。
図9は、リーフページのインデックス分割、リーフページを伴うシステムチェックポイント、又はリーフページを伴うSELECT文、UPDATE文、又はDELETE文の受信、を検出することに応答して、リーフページにインデックスキーを同期的に挿入するための方法のフローチャートである。
図10は、潜在的な将来のロック競合が検出された場合に、インデックス分割中にリーフページを事前割り当てするための方法のフローチャートである。
図11は、インデックス分割中にリーフページを事前割り当てすることを示す。
【0088】
上述の通り、
図4は、本開示の実施形態による、インデックス(例えば、SQLインデックス)のリーフページのロック競合をハンドリングするための方法400のフローチャートである。
【0089】
図1~
図3と併せて
図4を参照すると、動作401において、リレーショナルデータベース管理システム102の監視エンジン201は、トランザクションによるインデックスキーの挿入動作中にインデックス(例えば、SQLインデックス)のリーフページのロック競合について監視する。
【0090】
動作402において、リレーショナルデータベース管理システム102の監視エンジン201は、ロック競合が検出されたかどうかを判定する。
【0091】
以前に論述された通り、インデックスのリーフページへのインデックスキーの挿入動作は、クエリ(例えば、SQLクエリ)が、データベース104内のテーブルへの新たなデータ行など、データベース104内にデータを追加することを要求した場合に発生する。本明細書において使用される場合、「インデックス」は、テーブル又はビューからの行の取得を高速化する、テーブル又はビューに関連付けられたオンディスク構造を指す。一実施形態において、そのようなインデックスは、テーブル又はビュー内の1つ又は複数の列から構築された「キー」又は「インデックスキー」を記憶する。本明細書において使用される場合、「インデックスキー」は、インデックス(例えば、SQLインデックス)のキーを指し、これは、リレーショナルデータベース管理システム102がキー値に関連付けられた単数又は複数の行を迅速かつ効率的に見つけることを可能にする。そのようなインデックスキーは、値(例えば、123242)、可変文字(例えば、「Smith1」)などに対応する。そのようなキー値をインデックスに記憶することは、本明細書において「トランザクション」と称される。
【0092】
更に、以前に論述された通り、一実施形態において、インデックスキーはBツリー構造に記憶され、ここでそのようなBツリーインデックスは、データベースを固定サイズのブロック又はページに分割するマルチレベルツリー構造を含む。各レベルのこのツリーを使用して、アドレスの場所を介してそれらのページをリンクすることができ、(ノード又は内部ページとして知られる)或るページが最下位レベルにおけるリーフページで別のページを参照することを可能にする。或るページは、通常、ツリーの開始点、すなわち「ルート」である。ここで特定のキーの探索が始まり、リーフを終点とするパスを辿ることになる。すなわち、インデックスの「リーフページ」は、当該インデックスについての全てのキーがソートされた順序で表示される、インデックスの最下位レベルである。
【0093】
一実施形態において、監視エンジン201は、リーフページへのインデックスキーの挿入動作中にインデックス内のそのようなリーフページのロック競合について監視する。本明細書において使用される場合、「ロック競合」は、トランザクションがインデックスのリーフページにキー値を同時に挿入することを試みることを指す。すなわち、「ロック競合」は、或るプロセス(トランザクション)が、別のプロセス(トランザクション)によって保持されている「ロック」を取得することを試みた場合に必ず発生する。一実施形態において、他のプロセス(トランザクション)がリーフページを利用することを防止するためのリーフページに対する「ロック」は、「ページレベルロック」によって実現され得る。本明細書において使用される場合、「ページレベルロック」は、リーフページ全体をロックすることを指す。代替的に、プロセス(トランザクション)は、「行ロック+ページラッチ」を介するなどして、リーフページの行をロックし得る。本明細書において使用される場合、「行ロック」は、リーフページの特定の行をロックすることを指し、本明細書において使用される場合、「ページラッチ」は、ユーザによってではなくリレーショナルデータベース管理システム102(例えば、SQLサーバ)によって管理されるメカニズムを指し、その中でリレーショナルデータベース管理システム102は、アクセスを防止するためにリーフページに「ラッチ」又は「ホールド」を課す。本明細書において使用される場合、「行ロック+ページラッチ」は、「行ロック」及び「ページラッチ」の組み合わせを指す。
【0094】
そのような監視を実行するために監視エンジン201によって利用されるソフトウェアツールの例は、SolarWinds(登録商標)Database Performance Analyzer、Paessler(登録商標)PRG Network Monitor、SQL Power Tools、Redgate(登録商標)SQL Monitor、Nagios(登録商標)、Opsview(登録商標)などを含むが、これらに限定されない。
【0095】
リーフページへのインデックスキーの挿入動作中における、インデックスのリーフページのロック競合についての監視エンジン201による監視の例示は、
図5に関連して以下で論述される。
【0096】
図5を参照すると、
図5は、本開示の実施形態による、リーフページへのインデックスキーの挿入動作中にインデックスのリーフページのロック競合について監視することを示す。
【0097】
図5に示されている通り、複数のトランザクション501A~501C(
図5において、それぞれ「トランザクション#X」、「トランザクション#Y」、及び「トランザクション#Z」として識別される)は、一定数のインデックスキー503(
図5において、「キー#1」、「キー#2」、「キー#3」、...「キー#N」として識別され、Nは正の整数である)を既に記憶しているインデックスのリーフページ502にインデックスキーを記憶することを試みる。トランザクション501A~501Cは、集合的に、又は個別に、それぞれ複数のトランザクション501又は単数のトランザクション501と称され得る。インデックスキー503は、集合的に、又は個別に、それぞれ複数のインデックスキー503又は単数のインデックスキー503と称され得る。
【0098】
各トランザクション501が、リーフページ502などのリーフページにインデックスキー503を記憶することを試みた場合、トランザクション501は、ページロック又は行ロック+ページラッチのいずれかを適用する。実装されることになるページ又は行ロックは、実装されることになるページ/行ロックのリストを含む「ページ/行レベルロック待機キュー」504に記憶される(
図5において、「ロック#n」、「ロック#m」、「ロック#x」、「ロック#y」、及び「ロック#z」として識別される)。本明細書において使用される場合、記号「/」は、「又は」を意味することに留意されたい。従って、「ページ/行」レベルロック待機キューは、ページレベルロック待機キュー又は行レベルロック待機キューを指す。
【0099】
一実施形態において、監視エンジン201は、ページ/行レベルロック待機キュー504の長さに基づき、ロック競合を検出する。一実施形態において、そのようなロック競合は、キュー504の全長の閾値パーセンテージに基づき得る。一実施形態において、そのような閾値パーセンテージは、ユーザ指定のものであり得る。
【0100】
更に、
図5において示されている通り、一実施形態において、監視エンジン201は、実装されることになる様々なページラッチ(様々なリーフページのために配置されるラッチ)を記憶するラッチ待機キュー505の長さ(例えば、
図5において、「ラッチ#x」、「ラッチ#y」、「ラッチ#z」、...「ラッチ#y」として識別される)に基づき、ロック競合を検出する。例えば、そのようなロック競合は、キュー505の全長の閾値パーセンテージに基づき得る。一実施形態において、そのような閾値パーセンテージは、ユーザ指定のものであり得る。
【0101】
更に、
図5において示されている通り、監視エンジン201によるそのような監視に基づき、インデックスキー503は、以下で更に詳細に論述される通り、インデックス分配キューバッファ506にルーティングされることになる。
【0102】
加えて、
図5において示されている通り、インデックス分配キューバッファ506は、キュー507A~507N(
図5において、「キュー#1」、「キュー#2」、...「キュー#N」として識別され、Nは正の整数である)を含む。キュー507A~507Nは、集合的に、又は個別に、それぞれ複数のキュー507又は単数のキュー507と称され得る。各キュー507は、1つ又は複数のインデックスキー503を記憶する。インデックス分配キューバッファ506のキュー507へのインデックスキー503の記憶に関する更なる論述は、以下で更に提供される。
【0103】
図5は、キュー504、505内の特定の数のエントリを示しているが、
図5は、キュー504、505内の任意の数のエントリを含み得ることに留意されたい。同様に、バッファ506は任意の数のキュー507を含み得、各キュー507は任意の数のインデックスキー503を記憶するための任意の数のエントリを含み得る。更に、リーフページ502は、任意の数のインデックスキー503を記憶し得る。要素番号503は、リーフページ502などのリーフページに記憶されたそれらのインデックスキー、並びに、バッファ506のキュー507に記憶されたそれらのインデックスキーを指すことに留意されたい。
【0104】
図1~
図3及び
図5と併せて、
図4の動作402に戻ると、ロック競合が検出されなかった場合、リレーショナルデータベース管理システム102の監視エンジン201は、動作401におけるトランザクション501によるインデックスキーの挿入動作中におけるインデックス(例えば、SQLインデックス)のリーフページのロック競合についての監視を継続する。
【0105】
しかしながら、ロック競合が検出された場合、動作403において、リレーショナルデータベース管理システム102のルーティングエンジン203は、
図6に示されている通り、(ロック競合を呈していると識別されたリーフページに記憶されることが意図されている)次のインデックスキー503を、インデックス分配キューバッファ506のキュー507にルーティングし、それにより、ロック競合を異なるリーフページに移動させる。
【0106】
図6を参照すると、
図6は、本開示の実施形態に従い、ロック競合を経験しているリーフページにインデックスキー503を記憶する試みを伴うトランザクションから、インデックス分配キューバッファ506(
図5)のキュー507(
図5)へのインデックスキー503のルーティングを示し、記憶されたインデックスキー503は、ロック競合を経験しているリーフページにマッピングされる。
【0107】
図6に示されている通り、トランザクション601A~601D(
図6において、それぞれ「トランザクション#1」、「トランザクション#2」、「トランザクション#3」、及び「トランザクション#4」とラベル付けされている)は、インデックスキー503(
図6において、トランザクション601Aに関して「K51」、「K52」、及び「K61」とラベル付けされ、トランザクション601Bに関して「K53」、「K54」、及び「K62」とラベル付けされ、トランザクション601Cに関して「K55」、「K63」、及び「K65」とラベル付けされ、かつトランザクション601Dに関して「K56」、「K64」、及び「K66」とラベル付けされている)を、ロック競合を経験しているリーフページ602A~602B(
図6において、それぞれ「リーフ#5」及び「リーフ#6」として識別される)に記憶することを試みる。その結果、
図6において示されている通り、ルーティングエンジン203は、そのようなインデックスキー503をインデックス分配キューバッファ506の様々なキュー507にルーティングする。更に、
図6に示されている通り、そのようなインデックスキー503をインデックス分配キューバッファ506の様々なキュー507にルーティングすることにより、ロック競合のエリアが、リーフページ602C(
図6において、「リーフ#7」として識別される)などの別のリーフページに移動され得る。完全を期すために、インデックス(例えば、SQLインデックス)において、
図6に示されるリーフページの各々(602A~602D、ここでリーフページ602Dは、
図6において「リーフ#4」として識別される)は、ルートノード(
図6には示されていない)の1又は複数レベル下にある(インデックスの(Bツリー)構造の中間レベルに位置する)(
図6において、「非リーフ#2」として識別される)非リーフページ603の子であることに留意されたい。トランザクション601A~601Dは、集合的に、又は個別に、それぞれ複数のトランザクション601又は単数のトランザクション601と称され得る。リーフページ602A~602Dは、集合的に、又は個別に、それぞれ複数のリーフページ602又は単数のリーフページ602と称され得る。
図6は4つのトランザクション601を示しているが、任意の数のトランザクション601が、任意の数のリーフページ602にインデックスキー503を記憶することを試みている可能性があることに留意されたい。更に、インデックス(例えば、SQLインデックス)は、任意の数のリーフページ602及び非リーフページ603を含み得る。
【0108】
一実施形態において、ルーティングエンジン203は、特定のルール(例えば、
図6に示されている通り、モジュラーハッシングなどのハッシュ、ここでハッシュ値=キー値モジュール16)の観点で、そのようなインデックスキー503をインデックス分配キューバッファ506のキュー507にルーティングする。例えば、そのような特定のルールを適用することに基づき、
図6において示されている通り、インデックスキーK51はキュー507Aのキュー位置Q11に記憶され、インデックスキーK61はキュー507Aのキュー位置Q12に記憶され、インデックスキーK54はキュー507Aのキュー位置Q13に記憶され、インデックスキーK63はキュー507Aのキュー位置Q14に記憶される。同様に、
図6において示されている通り、インデックスキーK62はキュー507Bのキュー位置Q21に記憶され、インデックスキーK52はキュー507Bのキュー位置Q22に記憶され、インデックスキーK66はキュー507Bのキュー位置Q23に記憶され、インデックスキーK53はキュー507Bのキュー位置Q24に記憶される。更に、
図6に示されている通り、インデックスキーK55、K64、K65、及びK56はキュー507Nに記憶される。
【0109】
一実施形態において、インデックス分配キューバッファ506のキュー507に記憶されているインデックスキー503は、コンペア・アンド・スワップを介して同期される。本明細書において使用される場合、「コンペア・アンド・スワップ」は、同期を実現するためにマルチスレッドで使用されるアトミック命令を指す。それは、メモリ位置のコンテンツを所与の値と比較し、それらが同じである場合にのみ、当該メモリ位置のコンテンツを新たな所与の値に修正する。例えば、一実施形態において、キューカウント、使用されるキュースペース、及びキューテールポインタは、「コンペア・アンド・スワップ」処理において使用されるインデックス分配キューバッファ506におけるキュー507の構造に関連する情報を提供するために使用され得る。
【0110】
図1~
図3及び
図5~
図6と併せて、
図4に戻ると、動作404で、リレーショナルデータベース管理システム102のマッピングエンジン204は、インデックス分配キューバッファ506のキュー507(例えば、キュー507A)に記憶されたインデックスキー503(例えば、「K51」)を、トランザクション601(例えば、トランザクション601A)がインデックスキー503(例えば、「K51」)を記憶することを当初試みた、ロック競合を経験している特定のリーフページ602(例えば、リーフページ602A)にマッピングする。一実施形態において、そのようなマッピングは、
図6において示されている通り、マッピングエンジン204によって、本明細書において「インデックスリーフルータマップ」604と称されるデータ構造に記憶される。
【0111】
再び
図6を参照すると、インデックスリーフルータマップ604は、インデックス分配キューバッファ506のキュー507に記憶されたインデックスキー503の、インデックス(例えば、SQLインデックス)の特定のリーフページ602へのマッピングを記憶する。例えば、インデックスキー503の記憶場所の識別子(例えば、キュー位置Q11、Q13、Q22、Q24、Q16_1、Q16_4)は、
図6に示されている通り、リーフページ602A(
図6において、「リーフ#5」として識別される)にマッピングされる。同様に、インデックスキー503の記憶場所の識別子(例えば、キュー位置Q12、Q14、Q21、Q23、Q16_2、Q16_3)は、
図6に示されている通り、リーフページ602B(
図6において、「リーフ#6」として識別される)にマッピングされる。
【0112】
一実施形態において、インデックスリーフルータマップ604はまた、
図6に示されている通り、そのようなリーフページ602(例えば、それぞれリーフページ602A~602B)のページ空きサイズ情報605A~605Bを記憶する。本明細書において、「ページ空きサイズ情報」605A~605Bは、集合的に、又は個別に、ページ空きサイズ情報605と称され得る。本明細書において使用される場合、そのようなページ空きサイズ情報605は、インデックスキー503を記憶するためにリーフページ602において利用可能なメモリスペースの量を指す。以前に論述された通り、一実施形態において、監視エンジン201は、インデックスキー503のストレージによって使用されているメモリの量を追跡するように構成されており、従って、追加のインデックスキー503を記憶するために残されているメモリスペースの量を判定することができる。
【0113】
更に、上記で論述された通り、一実施形態において、インデックス分配キューバッファ506のキュー507内のインデックスキー503のメモリ位置と、インデックス(例えば、SQLインデックス)の様々なリーフページ602の識別子とのマッピングは、マッピングエンジン204によるコンペア・アンド・スワップを介して同期される。
【0114】
ロック競合を経験しているリーフページ602にインデックスキー503を記憶するのとは対照的に、インデックス分配キューバッファ506のキュー507にそのようなインデックスキー503をルーティングした後、インデックス分配キューバッファ506のキュー507は、インデックスのリーフページ602によって経験されるロック競合の程度に基づき、動的に追加/削除され得る。
【0115】
例えば、一実施形態において、バッファエンジン202は、インデックス(例えば、SQLインデックス)のリーフページ602のロック競合の程度に基づき、インデックス分配キューバッファ506内のキュー507を動的に追加又は削除する。上記で論述された通り、一実施形態において、インデックスのリーフページにおけるロック競合の程度又はレベルは、リーフページ602にインデックスキー503を記憶することを試みているトランザクションの数に基づき、並びに、ページ空きサイズ情報605に基づき、監視エンジン201によって判定される。追加の新たなインデックスキー503を記憶するために、インデックス分配キューバッファ506におけるキュー507の数を増加させる必要がある場合、バッファエンジン202はインデックス分配キューバッファ506にキュー507を動的に追加する。逆に、インデックスのリーフページ602の現在のロック競合の程度をハンドリングするための、インデックス分配キューバッファ506内のキュー507が供給過剰である場合、バッファエンジン202は、インデックス分配キューバッファ506内のキュー507を動的に除外又は削除する。
【0116】
例えば、インデックス分配キューバッファ506のキュー507が最大キュー長の閾値パーセンテージに到達すると、リレーショナルデータベース管理システム102のバッファエンジン202は、
図7に関連して以下で論述される通り、インデックスキー503の任意の追加的なストレージをハンドリングするための他のキュー507が存在しない場合、追加のインデックスキー503のストレージをハンドリングするための新たなキュー507を作成し得る。
【0117】
図7は、本開示の実施形態による、これらの追加のインデックスキー503のストレージをハンドリングするための他のキュー507が存在しないときに、インデックス分配キューバッファ506内に新たなキュー507を作成することにより追加のインデックスキー503のストレージをハンドリングするための方法700のフローチャートである。
【0118】
図1~
図3及び
図5~
図6と併せて、
図7を参照すると、動作701において、リレーショナルデータベース管理システム102のバッファエンジン202は、インデックス分配キューバッファ506内の他のキュー507が追加のインデックスキー503を記憶するための容量を欠いている状況の間などに、インデックス分配キューバッファ506内のキュー507(例えば、キュー507A)が最大キュー長の閾値パーセンテージに到達したかどうかを判定する。
【0119】
一実施形態において、そのような閾値パーセンテージは、ユーザ指定のものであり得る。一実施形態において、そのキュー507を含むインデックス分配キューバッファ506の構造に関する情報は、リレーショナルデータベース管理システム102のストレージデバイス(例えば、メモリ305、ディスクユニット308)内に存在し得るデータ構造に記憶され得る。一実施形態において、そのような情報は、バッファエンジン202によって追加のキュー507が作成されるべき、その最大キュー長の規定された閾値パーセンテージを含む、キュー507の最大長を含む。
【0120】
最大キュー長の閾値パーセンテージに到達したキュー507がインデックス分配キューバッファ506内に存在しない場合、バッファエンジン202は、動作701において、インデックス分配キューバッファ506内のキュー507が最大キュー長の閾値パーセンテージに到達しているかどうかを判定し続ける。
【0121】
しかしながら、インデックス分配キューバッファ506内の他のキュー507が追加のインデックスキー503を記憶する容量を欠いている状況の間など、最大キュー長の閾値パーセンテージに到達しているキュー507(例えば、キュー507A)がインデックス分配キューバッファ506内に存在する場合、動作702において、リレーショナルデータベース管理システム102のバッファエンジン202は、インデックス分配キューバッファ506内に新たなキュー507を作成する。
【0122】
動作703において、リレーショナルデータベース管理システム102のルーティングエンジン203は、上記で論述された通り、新たに入来するインデックスキー503を新たに作成されたキュー507にルーティングする。
【0123】
更に、
図8に関連して以下で論述される通り、ロック競合を以前に経験していたリーフページ602で低いレベル又は程度のロック競合が存在する状況において、次に、トランザクション601によって以前にそのようなリーフページ602に記憶することが試みられたインデックスキー503は、インデックス分配キューバッファ506から除外され、インデックスリーフルータマップ604を用いて適切なリーフページ602に記憶される。
【0124】
図8は、本開示の実施形態による、トランザクション601によって以前にそのようなリーフページ602にそのようなインデックスキー503を記憶することが試みられた、ロック競合を以前に経験していた適切なリーフページ602にインデックスキー503を非同期的に挿入するための方法800のフローチャートである。
【0125】
図1~
図3及び
図5~
図6と併せて
図8を参照すると、動作801において、リレーショナルデータベース管理システム102の監視エンジン201は、ロック競合を経験していると以前に識別されたインデックスのリーフページ602(例えば、リーフページ602A)のロック競合の程度を測定する。
【0126】
動作802において、リレーショナルデータベース管理システム102の監視エンジン201は、ロック競合を以前に経験していたそのようなリーフページ602におけるロック競合のレベルが、ユーザ指定のものであり得る閾値レベルを下回っているかどうかを判定する。そのような状況が発生した場合、リーフページ602は低レベルのロック競合を経験しているため、今や追加のインデックスキー503を記憶するのに安全であると言うことができる。本明細書において使用される場合、「低レベル」のロック競合は、もはやロック競合を経験していないと見なされるリーフページを指す。
【0127】
上記で論述された通り、一実施形態において、監視エンジン201は、インデックスのリーフページ602におけるロック競合のレベルを検出するように構成されており、例えば、それが、ユーザ指定のものであり得る閾値レベルを下回っているかを判定する。一実施形態において、インデックスのリーフページにおけるロック競合の程度又はレベルは、リーフページ602にインデックスキー503を記憶することを試みているトランザクションの数に基づき、並びに、ページ空きサイズ情報605に基づき、監視エンジン201によって判定される。本明細書において使用される場合、「ページ空きサイズ情報」は、インデックスキー503を記憶するためにリーフページ602において利用可能なメモリスペースの量を示す。一実施形態において、インデックス(例えば、SQLインデックス)の各リーフページ602には、専門家などによって特定のサイズ(例えば、3KB)が割り当てられている。一実施形態において、監視エンジン201は、インデックスキー503のストレージによって使用されているメモリの量を追跡するように構成されており、従って、追加のインデックスキー503を記憶するために残されているメモリスペースの量を判定することができる。インデックス(例えば、SQLインデックス)のリーフページ602のメモリ使用量を追跡するために監視エンジン201によって利用されるソフトウェアツールの例は、SQLShack、ApexSQL by Quest(登録商標)などを含むが、これらに限定されない。
【0128】
一実施形態において、インデックスのリーフページ602のそのようなメモリ使用量、及び、リーフページ602に書き込まれることになるインデックスキー503の数に基づき、リーフページ602におけるロック競合の程度又はレベルが判定され得る。例えば、リーフページ602に書き込まれることになるインデックスキー503の数が、リーフページ602内の残りの利用可能なメモリスペースの50%を超えるメモリスペースを必要とする場合、リーフページ602は、ロック競合を経験していると言うことができる。他方、リーフページ602に書き込まれることになるインデックスキー503の数が、リーフページ602内の残りの利用可能なメモリスペースの25%未満であるメモリスペースを必要とする場合、リーフページ602は、低レベルのロック競合を経験していると言うことができる。
【0129】
ロック競合を以前に経験していたリーフページ602におけるロック競合のレベルが閾値レベルを下回っていない場合、検出器エンジン205は、動作801において、ロック競合を経験していると以前に識別されたインデックスのリーフページ602のロック競合の程度を測定し続ける。
【0130】
しかしながら、ロック競合を以前に経験していたリーフページ602におけるロック競合のレベルが閾値レベルを下回っている場合、動作803において、リレーショナルデータベース管理システム102のルーティングエンジン203は、
図6に示されている通り、インデックスリーフルータマップ604に基づき、低レベルのロック競合を現在経験しているリーフページ602に非同期的に挿入されることになる適切なインデックスキー503をインデックス分配キューバッファ506から除外する。
【0131】
図6を参照すると、例えば、リーフページ602A(「リーフ#5」)が現在、低レベルのロック競合を経験していると判定された場合、ルーティングエンジン203は、インデックスリーフルータマップ604においてそのようなリーフページ602Aにマッピングされている、そのようなインデックスキー503を記憶しているキューの場所を識別することに基づき、どのインデックスキー503がインデックス分配キューバッファ506から除外され、リーフページ602Aに挿入されることになるかを識別する。例えば、インデックスキー503の記憶場所の識別子(キュー位置Q11、Q13、Q22、Q24、Q16_1、及びQ16_4)がリーフページ602Aにマッピングされる。その結果、ルーティングエンジン203は、バッチなどでリーフページ602Aに記憶されることになるそのようなインデックスキー503をインデックス分配キューバッファ506のキュー507から除外する。
【0132】
一実施形態において、ルーティングエンジン203は、リーフページ602(例えば、リーフページ602A)が「ロック競合」状態(すなわち、低レベルのロック競合とは対照的な高レベルのロック競合)に到達することなく現在記憶することができるインデックスキー503の数のみをインデックス分配キューバッファ506から取得する。一実施形態において、リーフページ602(例えば、リーフページ602A)のロック競合の状態が監視エンジン201によって継続的に監視され、その結果、リーフページ602(例えば、リーフページ602A)に記憶されるのとは対照的にインデックス分配キューバッファ506に記憶されるインデックスキー503の数、又は、ルーティングエンジン203によってインデックス分配キューバッファ506から除外されてリーフページ602(例えば、リーフページ602A)に挿入されるインデックスキー503の数が動的に実行される。
【0133】
加えて、
図9に関連して以下で論述される通り、一実施形態において、インデックスキー503は、このリーフページ602(例えば、リーフページ602A)の分割、このリーフページ602(例えば、リーフページ602A)についてのシステムチェックポイントのトリガ、又はそのようなリーフページ602(例えば、リーフページ602A)を伴うSELECT文、UPDATE文、又はDELETE文(例えば、SELECT SQL文、UPDATE SQL文、DELETE SQL文)の受信を検出することに応答して、インデックス分配キューバッファ506から除外され、リーフページ602(例えば、リーフページ602A)に同期的に挿入され得る。
【0134】
図9は、本開示の実施形態による、リーフページ602(例えば、リーフページ602A)のインデックス分割、リーフページ602(例えば、リーフページ602A)を伴うシステムチェックポイント、又はリーフページ602(例えば、リーフページ602A)を伴うSELECT文、UPDATE文、又はDELETE文の受信、を検出することに応答して、リーフページ602(例えば、リーフページ602A)にインデックスキー503を同期的に挿入するための方法900のフローチャートである。
【0135】
図1~
図3及び
図5~
図6と併せて
図9を参照すると、動作901において、リレーショナルデータベース管理システム102の検出器エンジン205は、リーフページ分割、リーフページ602についてのシステムチェックポイントのトリガ、又はリーフページ602を伴うSELECT文、UPDATE文、又はDELETE文の受信が検出されたかどうかを判定する。
【0136】
上記で論述された通り、一実施形態において、検出器エンジン205は、リーフページ分割、リーフページ602についてのシステムチェックポイントのトリガ、及びリーフページ602を伴うSELECT文、UPDATE文、又はDELETE文の受信を検出するように構成されている。
【0137】
上記で論述された通り、本明細書において使用される場合、リーフページ602の「分割」は、或るリーフページにあることが必要とされる新たなデータ(例えば、新たな行)を追加するのに十分なメモリスペースがなく、その結果、当該リーフページ602が分割しなければならない場合の状況を指す。分割が発生した場合、リーフページ602は、リーフページ602の各々で当該元のリーフページ602の行のおよそ半分を有する2つのページに分割され得る。その結果、検出器エンジン205は、別のリーフページ602に記憶されたデータの半分を記憶するための新たなリーフページ602の作成時に、リーフページ分割を検出する。
【0138】
更に、上記で論述された通り、本明細書において使用される場合、リーフページ602についての「システムチェックポイント」は、リーフページ602から取得されたインデックスキー503などのデータを、当該データをベースラインコピーと比較することによって検証するテスト動作を指す。一実施形態において、検出器エンジン205は、リレーショナルデータベース管理システム102のデータベースエンジン206(例えば、SQLサーバデータベースエンジン)によるチェックポイントの発行の検出に基づき、そのようなシステムチェックポイントを検出する。
【0139】
加えて、上記で論述された通り、SQL SELECT文などのSELECT文は、データベース104からデータを選択するために使用される。SQL UPDATE文などのUPDATE文は、データベース104のテーブル内の既存のレコードを修正するために使用される。SQL DELETE文などのDELETE文は、データベース104のテーブル内の既存のレコードを削除するために使用される。一実施形態において、検出器エンジン205は、コンピューティングデバイス101からリレーショナルデータベース管理システム102によって受信されたクエリ内のそのような文を識別することに基づき、そのような文の受信を検出するように構成されている。一実施形態において、検出器エンジン205は、自然言語処理を利用してクエリ内のそのような文を識別し、そのような用語は、専門家によって格納されたデータ構造に記憶される。一実施形態において、そのようなデータ構造は、リレーショナルデータベース管理システム102のストレージデバイス(例えば、メモリ305、ディスクユニット308)に記憶される。
【0140】
リーフページ分割、リーフページ602についてのシステムチェックポイントのトリガ、又はリーフページ602を伴うSELECT文、UPDATE文、又はDELETE文の受信が検出されない場合、検出器エンジン205は、動作901で、リーフページ分割、リーフページ602についてのシステムチェックポイントのトリガ、又はリーフページ602を伴うSELECT文、UPDATE文、又はDELETE文の受信が検出されるかどうかを判定し続ける。
【0141】
しかしながら、
図6に示されている通り、リーフページ分割、リーフページ602についてのシステムチェックポイントのトリガ、又はリーフページ602を伴うSELECT文、UPDATE文、又はDELETE文の受信が検出された場合、動作902において、リレーショナルデータベース管理システム102のルーティングエンジン203は、そのようなリーフページ602(例えば、リーフページ602A)についてのリーフページ分割、そのようなリーフページ602(例えば、リーフページ602A)を伴うシステムチェックポイントのトリガ、又はそのようなリーフページ602(例えば、リーフページ602A)を伴うSELECT文、UPDATE文、又はDELETE文の受信、を検出することに応答して、リーフページ602(例えば、リーフページ602A)に同期的に挿入されることになるインデックスキー503をインデックス分配キューバッファ506から除外する。
【0142】
図6を参照すると、例えば、リーフページ602Aのリーフページ分割、リーフページ602Aを伴うシステムチェックポイントのトリガ、又はリーフページ602Aを伴うSELECT文、UPDATE文、又はDELETE文の受信が検出された場合、ルーティングエンジン203は、インデックスリーフルータマップ604においてそのようなリーフページ602Aにマッピングされている、そのようなインデックスキー503を記憶しているキューの場所を識別することに基づき、どのインデックスキー503がインデックス分配キューバッファ506から除外され、リーフページ602Aに挿入されることになるかを識別する。例えば、リーフページ602Aにマッピングされているインデックスキー503の記憶場所の識別子(キュー位置Q11、Q13、Q22、Q24、Q16_1、及びQ16_4)がインデックスリーフルータマップ604に記憶される。その結果、ルーティングエンジン203は、バッチなどでリーフページ602Aに記憶されることになるそのようなインデックスキーをインデックス分配キューバッファ506のキュー507から除外する。
【0143】
一実施形態において、ルーティングエンジン203は、リーフページ602(例えば、リーフページ602A)が「ロック競合」状態(すなわち、低レベルのロック競合とは対照的な高レベルのロック競合)に到達することなく現在記憶することができるインデックスキー503の数のみをインデックス分配キューバッファ506から取得する。一実施形態において、リーフページ602(例えば、リーフページ602A)のロック競合の状態が監視エンジン201によって継続的に監視され、その結果、リーフページ602(例えば、リーフページ602A)に記憶されるのとは対照的にインデックス分配キューバッファ506に記憶されるインデックスキー503の数、又は、ルーティングエンジン203によってインデックス分配キューバッファ506から除外されてリーフページ602(例えば、リーフページ602A)に挿入されるインデックスキー503の数が動的に実行される。
【0144】
更に、
図10に関連して以下で論述される通り、一実施形態において、リレーショナルデータベース管理システム102は、順次挿入パターンが検出された場合、インデックス分割後の将来のロック競合の可能性を低減するために、複数のリーフページ602を非同期的に事前割り当てし得る。本明細書において使用される場合、「事前割り当て」は、ルーティングエンジン203がインデックスキー503をそのようなリーフページ602に記憶する必要があるときに、そのようなリーフページ602内のメモリスペースが利用可能であることを保証する。
【0145】
図10は、本開示の実施形態による、潜在的な将来のロック競合が検出された場合に、インデックス分割中にリーフページ602を事前割り当てするための方法1000のフローチャートである。
【0146】
図1~
図3及び
図5~
図6と併せて
図10を参照すると、動作1001において、リレーショナルデータベース管理システム102の検出器エンジン205は、インデックス分割中にインデックスキー503の順次パターンがリーフページ602に挿入されているものとして検出されたかどうかを判定する。
【0147】
インデックス分割中にインデックスキー503の順次パターンがリーフページ602に挿入されているものとして検出されない場合、検出器エンジン205は、動作1001において、インデックス分割中にインデックスキー503の順次パターンがリーフページ602に挿入されているものとして検出されるかどうかを判定し続ける。
【0148】
しかしながら、インデックス分割中にインデックスキー503の順次パターンがリーフページ602に挿入されているものとして検出された場合、動作1002において、リレーショナルデータベース管理システム102の検出器エンジン205は、起こり得るロック競合シナリオを削減するために、インデックスの複数のリーフページ602を非同期的に事前割り当てする。
【0149】
上記で論述された通り、インデックス分割が発生した場合、リーフページ602は、リーフページ602の各々で当該元のリーフページの行のおよそ半分を有する2つのページに分割され得る。一実施形態において、インデックスキー503の順次パターン(連続移動パターン)がそのようなリーフページ602に入力された場合、検出器エンジン205は、起こり得るロック競合シナリオを削減するために、インデックスの複数のリーフページ602を非同期的に事前割り当てする。インデックスキー503の順次パターンはそのようなリーフページ602内で継続し得るため、そのような状況においてはロック競合が発生する可能性がより高いと言うことができる。一実施形態において、そのような連続移動パターンは、以前のリーフページ602からの高/低キー値を用いて、それらの新たな事前割り当てされたリーフページ602に対する非リーフキー値としてキー値を予測することにより、検出器エンジン205によって検出される。本開示の実施形態による、そのような事前割り当ての例示が
図11において示される。
【0150】
図11は、本開示の実施形態による、インデックス分割中にリーフページを事前割り当てすることを示す。
【0151】
ここで
図11を参照すると、リーフページ602E~602G(
図11において、それぞれ「リーフ#8」、「リーフ#9」、及び「リーフ#10」として識別される)は、インデックス分割中にリーフページ602(例えば、リーフページ602A~602D)に入力されるインデックスキー503の順次パターン(連続移動パターン)の検出に起因する、起こり得るロック競合シナリオを削減するために、非同期的に事前割り当てされる。当該事前割り当ての結果として、ルーティングエンジン203がインデックスキー503の検出された順次パターンからインデックスキー503をそのようなリーフページ602に記憶する必要があるときに、リーフページ602E~602G内のメモリスペースが利用可能である。
【0152】
更に、一実施形態において、マッピングエンジン204は、
図11に示されている通り、インデックスリーフルータマップ604内のそのような事前割り当てされたリーフページ602のマッピングを事前割り当てする。例えば、インデックスリーフルータマップ604は、リーフページ602A、602B及び602C(
図11において、それぞれ「リーフ#5」、「リーフ#6」、及び「リーフ#7」として識別される)に記憶されたインデックスキー503のマッピングを記憶する。更に、インデックスリーフルータマップ604は、リーフページ602A~602Cについてのページ空きサイズ情報605A~605Cをそれぞれ記憶する。加えて、事前割り当てされたリーフページ602E~602Gに関し、マッピングエンジン204は、そのような事前割り当てされたリーフページ602のマッピングを、そのような事前割り当てされたリーフページ602E~602Gについてのページ空きサイズ情報605D~605Fの記憶をもそれぞれ含むインデックスリーフルータマップ604に事前割り当てする。
【0153】
上述の結果として、本開示の実施形態は、ロック競合を経験しているリーフページにインデックスキーを記憶するのとは対照的に、バッファのキューにそのようなインデックスキーを記憶するためのバッファ(本明細書において「インデックス分配キューバッファ」と称される)を利用することにより、SQLインデックスなどのインデックスのリーフページのロック競合を効果的にハンドリングするための手段を提供する。そのようなリーフページがもはやそのようなロック競合を経験しなくなると、適切なインデックスキーが、次に、インデックス分配キューバッファから除外され、インデックス分配キューバッファに記憶されたインデックスキーをインデックスの適切なリーフページにマッピングするデータ構造(本明細書において「インデックスリーフルータマップ」と称される)に基づき、適切なリーフページに記憶される。
【0154】
更に、本開示の原理は、リレーショナルデータベース管理システムに関わる技術又は技術分野を改善する。上記で論述された通り、SQL INSERT INTO文などのSQLクエリは、リレーショナルデータベース管理システム(例えば、SQLサーバ)によって受信及び処理され得る。そのようなクエリ(例えば、SQL INSERT INTO文)は、データベース内のテーブルに新たなデータ行を追加するために使用され得る。そのようなシナリオが発生した場合、このテーブル上で定義された関連するインデックスが更新される必要がある。インデックスは、テーブル又はビューからの行の取得を高速化する、テーブル又はビューに関連付けられたオンディスク構造である。インデックスは、通常、テーブル又はビュー内の1つ又は複数の列から構築されたキーを含む。これらのキーは、リレーショナルデータベース管理システムがキー値に関連付けられた単数又は複数の行を迅速かつ効率的に見つけることを可能にする構造(Bツリー)に記憶される。その結果、データベース内のテーブルに新たなデータ行が追加された場合、インデックスはそのようなデータ行に関連付けられたキー値を含むように更新される必要がある。そのようなキー値をインデックスに記憶することは、本明細書において「トランザクション」と称される。Bツリーインデックスは、データベースを固定サイズのブロック又はページに分割するマルチレベルツリー構造を作成する。各レベルのこのツリーを使用して、アドレスの場所を介してそれらのページをリンクすることができ、(ノード又は内部ページとして知られる)或るページが最下位レベルにおけるリーフページで別のページを参照することを可能にする。或るページは、通常、ツリーの開始点、すなわち「ルート」である。ここで特定のキーの探索が始まり、リーフを終点とするパスを辿ることになる。すなわち、インデックスのリーフページは、当該インデックスについての全てのキーがソートされた順序で表示される、インデックスの最下位レベルである。そのような構造内の殆どのページは、最終的に特定のテーブル行を参照するリーフページである。時折、複数の異なるトランザクションがインデックス(例えば、SQLインデックス)のリーフページにキー値を同時に挿入することを試みており、それにより、パフォーマンスに悪影響を及ぼす「ロック競合」がもたらされる。「ロック競合」は、或るプロセス(トランザクション)が、別のプロセス(トランザクション)によって保持されている「ロック」を取得することを試みた場合に必ず発生する。ロック競合に対処する試みにおいて、そのようなトランザクションは、ランダム化された様式でハンドリングされ得る。しかしながら、そのようなトランザクションに関連したSQLクエリなどのクエリの処理は、パフォーマンスを損ねることになる。更に、ロック競合に対処するための別の試みにおいて、インデックスのリーフページの最小ページサイズが拡大され得る。しかしながら、ロック競合はわずかに削減されることになるのみである。更に、インデックスのリーフページの最小ページサイズを拡大した結果として、インデックスアクセス中により多くのデータベース入力/出力動作が必要とされることになる。結果として、現在、インデックス(例えば、SQLインデックス)のリーフページのロック競合を効果的にハンドリングするための手段は存在しない。
【0155】
本開示の実施形態は、トランザクションによるインデックスキーの挿入動作中に、ロック競合についてインデックス(例えば、SQLインデックス)のリーフページを監視することにより、このような技術を改善する。本明細書において使用される場合、「ロック競合」は、或るプロセス(トランザクション)が、別のプロセス(トランザクション)によって保持されているインデックスのリーフページに対する「ロック」を取得すること試みる任意の時を指す。本明細書において使用される場合、「インデックス」は、テーブル又はビューからの行の取得を高速化する、テーブル又はビューに関連付けられたオンディスク構造を指す。一実施形態において、そのようなインデックスは、テーブル又はビュー内の1つ又は複数の列から構築された「キー」又は「インデックスキー」を記憶する。本明細書において使用される場合、「インデックスキー」は、インデックス(例えば、SQLインデックス)のキーを指し、これは、リレーショナルデータベース管理システムがキー値に関連付けられた単数又は複数の行を迅速かつ効率的に見つけることを可能にする。そのようなキー値をインデックスに記憶することは、本明細書において「トランザクション」と称される。更に、インデックスの「リーフページ」は、当該インデックスについての全てのキーがソートされた順序で表示される、インデックスの最下位レベルである。リーフページのロック競合を検出すると、そのようなリーフページに入力されることになる次のインデックスキーが、バッファ(本明細書において「インデックス分配キューバッファ」と称される)のキューにルーティングされる。インデックス分配キューバッファのキューに記憶されたインデックスキーは、次に、トランザクションがそのようなインデックスキーを記憶することを当初試みた、ロック競合を経験している特定のリーフページにマッピングされる。一実施形態において、そのようなマッピングは、インデックス分配キューバッファのキューに記憶されたインデックスキーの、インデックスのリーフページへのマッピングを記憶する、本明細書において「インデックスリーフルータマップ」と称されるデータ構造に記憶される。そのようなリーフページがもはやそのようなロック競合を経験しなくなると、適切なインデックスキーが、次に、インデックス分配キューバッファから除外され、インデックスリーフルータマップのマッピングに基づき、適切なリーフページに記憶される。このようにして、SQLインデックスなどのインデックスのリーフページのロック競合が効果的にハンドリングされる。更に、このようにして、リレーショナルデータベース管理システムに関わる技術分野において改善が行われる。
【0156】
本開示によって提供される技術的解決策は、人間の精神において、又はペン及び紙を使用する人間によって実行することができない。すなわち、本開示によって提供される技術的解決策は、コンピュータを使用することなく、任意の合理的な時間量において、及び任意の合理的な正確性の期待を伴って、人間の精神において、又はペン及び紙を用いる人間によって実現することができない。
【0157】
本開示の様々な実施形態の説明は、例示の目的で提示されるが、包括的であること、又は、開示された実施形態に限定されることは意図されていない。説明された実施形態の範囲及び趣旨から逸脱することのない多くの修正及び変形が、当業者には明らかであろう。本明細書において使用される専門用語は、実施形態の原理、実用的な適用又は市場で見られる技術に対する技術的改善を最も良く説明する、又は、本明細書において開示される実施形態を他の当業者が理解することを可能にするように選択された。
【手続補正書】
【提出日】2024-04-16
【手続補正1】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
インデックスのロック競合をハンドリングするためのコンピュータ実装方法であって:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する段階;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする段階、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する段階、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶する
を備える、コンピュータ実装方法。
【請求項2】
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、請求項1に記載のコンピュータ実装方法。
【請求項3】
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする段階、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期される、を更に備える、請求項1又は2に記載のコンピュータ実装方法。
【請求項4】
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される
、請求
項1に記載のコンピュータ実装方法。
【請求項5】
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する段階、を更に備える
、請求
項1に記載のコンピュータ実装方法。
【請求項6】
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する段階を更に備える
、請求
項1に記載のコンピュータ実装方法。
【請求項7】
前記キューが最大キュー長の閾値パーセンテージに到達したことに応答して、前記バッファ内に新たなキューを作成する段階;及び
新たに入来するインデックスキーを前記新たなキューにルーティングする段階
を更に備える
、請求
項1に記載のコンピュータ実装方法。
【請求項8】
インデックスのロック競合をハンドリングするためのコンピュータプログラ
ムであって
、コンピュータに:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する手順;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする手順、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する手順、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶す
る
を実行させるためのコンピュータプログラ
ム。
【請求項9】
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、請求項8に記載のコンピュータプログラ
ム。
【請求項10】
前記コンピュータに:
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする手順、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期され
る
を更に実行させるための請求項
8に記載のコンピュータプログラ
ム。
【請求項11】
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される、請求項
8に記載のコンピュータプログラ
ム。
【請求項12】
前記コンピュータに:
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
を更に実行させるための請求項
8に記載のコンピュータプログラ
ム。
【請求項13】
前記コンピュータに:
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
を更に実行させるための請求項
8に記載のコンピュータプログラ
ム。
【請求項14】
前記コンピュータに:
前記キューが最大キュー長の閾値パーセンテージに到達したことに応答して、前記バッファ内に新たなキューを作成する手順;及び
新たに入来するインデックスキーを前記新たなキューにルーティングする手順
を更に実行させるための請求項
8に記載のコンピュータプログラ
ム。
【請求項15】
インデックスのロック競合をハンドリングするためのコンピュータプログラムを記憶するためのメモリ;及び
前記メモリに接続されたプロセッサ、ここで前記プロセッサは:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する手順;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする手順、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する手順、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶する
を有する前記コンピュータプログラムのプログラム命令を実行するように構成されている
を備えるシステム。
【請求項16】
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、請求項15に記載のシステム。
【請求項17】
前記コンピュータプログラムの前記プログラム命令は:
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする手順、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期される
を更に有する、請求項1
5に記載のシステム。
【請求項18】
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される、請求項1
5に記載のシステム。
【請求項19】
前記コンピュータプログラムの前記プログラム命令は:
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
を更に有する、請求項1
5に記載のシステム。
【請求項20】
前記コンピュータプログラムの前記プログラム命令は:
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
を更に有する、請求項1
5に記載のシステム。
【請求項21】
コンピュータプログラムであって、前記コンピュータプログラムがコンピュータ上で実行されるとき、請求項1~7のいずれ
か一項のコンピュータ実装方法を実行するように適合されたプログラムコード手段を備える、コンピュータプログラム。
【手続補正2】
【補正対象書類名】明細書
【補正対象項目名】0157
【補正方法】変更
【補正の内容】
【0157】
本開示の様々な実施形態の説明は、例示の目的で提示されるが、包括的であること、又は、開示された実施形態に限定されることは意図されていない。説明された実施形態の範囲及び趣旨から逸脱することのない多くの修正及び変形が、当業者には明らかであろう。本明細書において使用される専門用語は、実施形態の原理、実用的な適用又は市場で見られる技術に対する技術的改善を最も良く説明する、又は、本明細書において開示される実施形態を他の当業者が理解することを可能にするように選択された。
[項目1]
インデックスのロック競合をハンドリングするためのコンピュータ実装方法であって:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する段階;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする段階、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する段階、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶する
を備える、コンピュータ実装方法。
[項目2]
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、項目1に記載のコンピュータ実装方法。
[項目3]
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする段階、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期される、を更に備える、項目1又は2に記載のコンピュータ実装方法。
[項目4]
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される、前述の項目のいずれかに記載のコンピュータ実装方法。
[項目5]
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する段階、を更に備える、前述の項目のいずれかに記載のコンピュータ実装方法。
[項目6]
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する段階を更に備える、前述の項目のいずれかに記載のコンピュータ実装方法。
[項目7]
前記キューが最大キュー長の閾値パーセンテージに到達したことに応答して、前記バッファ内に新たなキューを作成する段階;及び
新たに入来するインデックスキーを前記新たなキューにルーティングする段階
を更に備える、前述の項目のいずれかに記載のコンピュータ実装方法。
[項目8]
インデックスのロック競合をハンドリングするためのコンピュータプログラム製品であって、プログラムコードが具現化された1つ又は複数のコンピュータ可読ストレージ媒体を備え、前記プログラムコードは:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する手順;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする手順、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する手順、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶する
のためのプログラミング命令を有する、コンピュータプログラム製品。
[項目9]
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、項目8に記載のコンピュータプログラム製品。
[項目10]
前記プログラムコードは:
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする手順、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期される
のための前記プログラミング命令を更に有する、項目8又は9に記載のコンピュータプログラム製品。
[項目11]
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される、項目8~10のいずれかに記載のコンピュータプログラム製品。
[項目12]
前記プログラムコードは:
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
のための前記プログラミング命令を更に有する、項目8~11のいずれかに記載のコンピュータプログラム製品。
[項目13]
前記プログラムコードは:
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
のための前記プログラミング命令を更に有する、項目8~12のいずれかに記載のコンピュータプログラム製品。
[項目14]
前記プログラムコードは:
前記キューが最大キュー長の閾値パーセンテージに到達したことに応答して、前記バッファ内に新たなキューを作成する手順;及び
新たに入来するインデックスキーを前記新たなキューにルーティングする手順
のための前記プログラミング命令を更に有する、項目8~13のいずれかに記載のコンピュータプログラム製品。
[項目15]
インデックスのロック競合をハンドリングするためのコンピュータプログラムを記憶するためのメモリ;及び
前記メモリに接続されたプロセッサ、ここで前記プロセッサは:
インデックスキーの挿入動作中に前記インデックスのリーフページのロック競合について監視する手順;
前記インデックスの前記リーフページの前記ロック競合を検出することに応答して、第1のインデックスキーをバッファのキューにルーティングする手順、ここで前記第1のインデックスキーは、前記インデックスの前記リーフページに挿入されることになるトランザクションのインデックスキーに対応している;及び
前記バッファの前記キューに記憶された前記第1のインデックスキーの、前記ロック競合を経験している前記リーフページへのマッピングをデータ構造に記憶する手順、ここで前記データ構造は、前記バッファのキューに記憶されたインデックスキーの、前記インデックスのリーフページへのマッピングを記憶する
を有する前記コンピュータプログラムのプログラム命令を実行するように構成されている
を備えるシステム。
[項目16]
前記ロック競合は、ページ又は行レベルロック待機キューの長さに基づき、又は、ラッチ待機キューの長さに基づき検出される、項目15に記載のシステム。
[項目17]
前記コンピュータプログラムの前記プログラム命令は:
前記第1のインデックスキーに続く第2のインデックスキーを前記バッファの前記キューにルーティングする手順、ここで前記バッファの前記キューに記憶されたインデックスキーは、コンペア・アンド・スワップを介して同期される
を更に有する、項目15又は16に記載のシステム。
[項目18]
前記データ構造は、前記ロック競合を経験している前記リーフページの識別子と共に、前記バッファの前記キューにおける前記第1のインデックスキーの記憶場所の識別子を含み、前記データ構造におけるインデックスキーの記憶場所の識別子は、コンペア・アンド・スワップを介して同期される、項目15~17のいずれかに記載のシステム。
[項目19]
前記コンピュータプログラムの前記プログラム命令は:
前記リーフページでのロック競合のレベルが閾値レベルを下回っていると検出することに応答して、前記データ構造に基づきリーフページに非同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
を更に有する、項目15~18のいずれかに記載のシステム。
[項目20]
前記コンピュータプログラムの前記プログラム命令は:
以下、すなわち、前記リーフページの分割、前記リーフページについてのシステムチェックポイントのトリガ、及び、前記リーフページを伴うSELECT文、UPDATE文、又はDELETE文からなる群から選択されるうちの1つを検出することに応答して、前記データ構造に基づきリーフページに同期的に挿入されることになるインデックスキーを前記バッファから除外する手順
を更に有する、項目15~19のいずれかに記載のシステム。
[項目21]
コンピュータプログラムであって、前記コンピュータプログラムがコンピュータ上で実行されるとき、項目1~7のいずれかのコンピュータ実装方法を実行するように適合されたプログラムコード手段を備える、コンピュータプログラム。
【国際調査報告】