(57)【要約】  ２コピーバージョニング方式が提案される。この方式は高読取負荷データベースに対する効率的な実施を与え、読取依存性をなくす。このバージョニング方式は、ＡＮＳＩ  ＲＥＡＤ  ＣＯＭＭＩＴＴＥＤ分離の下で実行するトランザクションに対する効率的な実施を与え、直列可能な分離に拡張可能である。２コピーバージョニング方式にはゴミがなく、これはデータ記録のすべてのバージョンが実行の際に用いられることを意味し、またこの方式は索引走査動作に適合する。「遅延削除」方式は、読取トランザクションがデータ割当解除動作を完了することを可能にする。「スナップショット」を必要とする文は効率的に支持される。
2007501468.tif 000002
【特許請求の範囲】
【請求項１】
データを処理する方法であって、
第１のトランザクションに対するコミット内容項目から保留内容項目を作成するステップと、
保留内容項目への読取／書込アクセスを第１のトランザクションに与えながらコミット内容項目への読取アクセスを第２のトランザクションに与えるステップと、
第１のトランザクションが保留内容項目をコミットするときに、コミット内容項目が削除されるとフラグを立てるステップと、
第２のトランザクションがコミット内容項目へのアクセスを終えるまでコミット内容項目の割当解除を遅らせるステップとを含む、方法。
【請求項２】
読取トランザクションがコミット内容項目にアクセスするごとに参照カウントを増やすステップと、
読取トランザクションがコミット内容項目へのアクセスを終えるごとに参照カウントを減らすステップと、
参照カウントをゼロに減らす読取トランザクションによってコミット内容項目の割当解除を開始するステップとを含む、請求項１に記載の方法。
【請求項３】
第１のトランザクションが保留内容項目をコミットするときに、削除に対してコミット内容項目にフラグを立てるステップと、
完了した読取トランザクションが参照カウントをゼロに減らすときに、フラグを立てられた削除に対してコミット内容項目をチェックするステップと、
コミット内容項目が削除に対してフラグを立てられており、かつゼロ参照カウントを有するときにのみ読取トランザクションによってコミット内容項目を割当解除するステップとを含む、請求項２に記載の方法。
【請求項４】
コミット内容項目を示す第１のフィールド、保留内容項目を示す第２のフィールド、および第１のトランザクションに対するトランザクションＩｄを保存する第３のフィールドを有するバージョンリストを作成するステップと、
バージョンリストの第３のフィールドにおけるトランザクションＩｄと一致するトランザクションにバージョンリスト中の第２のフィールドを供給し、バージョンリストの第３のフィールドにおけるトランザクションＩｄと一致しないトランザクションに第１のフィールドを与えるステップとを含む、請求項１に記載の方法。
【請求項５】
論理タプルを生成するステップと、
書込トランザクションがコミット内容項目にアクセスしていないときに論理タプルを用いてコミット内容項目を直接示すステップと、
書込トランザクションがコミット内容項目にアクセスしているときに論理タプルを用いてバージョンリストを示すステップとを含む、請求項４に記載の方法。
【請求項６】
索引中の索引エントリがコミットまたは非コミットであることをマーク付けするステップと、
コミットおよび関連する非コミット二重エントリを有する索引を識別するバージョンリスト中の索引マップを与えるステップと、
索引エントリに対して索引を走査するステップと、
索引エントリマーク付けおよび索引マップに含まれる索引に従って無効値を戻すステップとを含む、請求項４に記載の方法。
【請求項７】
索引エントリが索引マップに関連しておらず、かつ索引走査を開始するトランザクショ
ンに対する識別子（Ｉｄ）がバージョンリストの第３のフィールドにおけるトランザクションＩｄと一致するときに、保留内容項目にポインタを戻すステップを含む、請求項６に記載の方法。
【請求項８】
索引エントリが索引マップに関連しておらず、かつ索引走査を開始するトランザクションに対する識別子（Ｉｄ）がバージョンリストの第３のフィールドにおけるトランザクションＩｄと一致しないときに、コミット内容項目にポインタを戻すステップを含む、請求項７に記載の方法。
【請求項９】
論理タプルを与えるステップと、
データの「スナップショット」を必要とする動作において識別される論理タプルの組をコピーするステップと、
論理タプルのコピーされた組に関連する物理内容項目に対する参照カウントを増やすステップと、
前記動作が完了するときに物理内容項目に対する参照カウントを減らすステップと、
削除フラグを有しかつゼロ参照カウントを有する物理内容項目のいずれかを割当解除するステップとを含む、請求項２に記載の方法。
【請求項１０】
物理内容項目を含むデータベースと、
書込トランザクションに対するコミット内容項目から保留内容項目を作成し、書込トランザクションに保留内容項目へのアクセスを与えながら読取トランザクションにコミット内容項目へのアクセスを与えるプロセッサとを含み、前記プロセッサは、書込トランザクションが保留内容項目をコミットするときにコミット内容項目が削除されるとフラグを立て、読取トランザクションがコミット内容項目へのアクセスを終えるまでコミット内容項目の割当解除を遅らせる、データベースシステム。
【請求項１１】
前記プロセッサは、読取トランザクションがコミット内容項目にアクセスするごとに参照カウントを増やし、読取トランザクションがコミット内容項目へのアクセスを終えるごとに参照カウントを減らし、前記プロセッサは、コミット内容項目が以前に削除に対してマーク付けされており、かつ読取トランザクションが参照カウントをゼロに減らすときにコミット内容項目を割当解除する、請求項１０に記載のデータベースシステム。
【請求項１２】
前記プロセッサは、コミット内容項目を示す第１のフィールドと、保留内容項目を示す第２のフィールドと、保留内容項目を作成するトランザクションに対するトランザクションＩｄを保存する第３のフィールドとを有するバージョンリストを作成し、前記プロセッサは、第３のフィールドにおけるトランザクションＩｄと一致するトランザクションにバージョンリスト中の第２のフィールドを供給し、第３のフィールドにおけるトランザクションＩｄと一致しないトランザクションに第１のフィールドを与える、請求項１１に記載のデータベースシステム。
【請求項１３】
前記プロセッサは、書込トランザクションが完了したときに論理タプルを用いてコミット内容項目を直接示し、書込トランザクションが保留内容項目を作成したときに論理タプルを用いてバージョンリストを示す、請求項１２に記載のデータベースシステム。
【請求項１４】
前記プロセッサは、索引中の索引エントリがコミットまたは非コミットであることをマーク付けし、索引中のコミットおよび関連する非コミット二重エントリを識別するバージョンリスト中の索引マップを与え、前記プロセッサは第１のトランザクションに対して索引を走査し、走査された索引エントリがコミットとマーク付けされているときに無効値を戻し、索引エントリは索引マップによって参照される、請求項１２に記載のデータベースシステム。
【請求項１５】
索引エントリが索引マップによって参照されず、かつ索引走査を開始するトランザクションに対する識別子（Ｉｄ）がバージョンリストの第３のフィールドにおけるトランザクションＩｄと一致するとき、前記プロセッサは保留内容項目にポインタを戻す、請求項１４に記載のデータベースシステム。
【請求項１６】
索引エントリが索引マップにおいて参照されず、かつ索引走査を開始するトランザクションに対する識別子（Ｉｄ）がバージョンリストの第３のフィールドにおけるトランザクションＩｄと一致しないとき、前記プロセッサはコミット内容項目にポインタを戻す、請求項１５に記載のデータベースシステム。
【請求項１７】
前記プロセッサは物理内容項目を示す論理タプルを与え、分類トランザクションにおいて識別される論理タプルの組をコピーし、前記プロセッサは論理タプルのコピーされた組に関連する物理内容項目に対する参照カウントを増やし、分類トランザクションが完了するときに物理内容項目に対する参照カウントを減らし、削除フラグおよびゼロ参照カウントを有する物理内容項目のいずれかを割当解除する、請求項１０に記載のデータベースシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
技術分野
この発明は、複数のユーザによって同時にアクセス可能なデータの管理に関する。
【背景技術】
【０００２】
背景
データベースは、コンピュータ中に保存される関連する記録の集合である。当該技術分野において、このデータ記録の集合は情報データベースとも呼ばれる。データ記録は代替的にデータタプルまたは単にタプルと呼ばれる。複数のユーザがこれらのデータ記録に同時にアクセスしてもよい。トランザクションがデータベースユーザのために実行され、これらのデータ記録にアクセスする。トランザクションはデータベースからの読取、データベースへの書込、またはその両方を行なってもよい。よって、トランザクション実行はデータ記録の組における読取および書込動作の組をもたらす。トランザクションは典型的に、それらが書込むかまたは読取るデータ記録に対するアクセス許可を要求する。アクセス許可は通常ロックを介して実施される。トランザクションは典型的に、対応するロックを求めることによってデータ記録に対するアクセス許可を要求する。アクセス許可における競合はロック競合として現われる。ロック競合は、両立しないモードにおいて複数のトランザクションが同時に同じデータ記録にアクセスを試みるときに起こり得る。
【０００３】
ロック競合を解決する態様の１つは、競合するトランザクションを待たせることである。たとえば、データ記録に対する競合するロック要求を発行したトランザクションは、同じ記録に対するロックを既に有するトランザクションが実行を完了するまで強制的に待たされる（トランザクションの完了とは、トランザクションがコミットするかまたはロールバックすることを意味する）。しかしこうした筋書きにおいては、２つまたはそれ以上のトランザクションが行き詰まり（デッドロック）になることがあり、そこでは各トランザクションが他方のトランザクションの完了を待つためにいずれも進行しなくなってしまう。
【０００４】
タイムスタンプ順序付け、確認およびマルチバージョン方式など、トランザクションシステムで用いられるロックの量を減少させるための多くの技術が発明された。これらの方式のうちマルチバージョン方式は商業的に成功し、多くのベンダがこれらの方式を用いる。典型的なマルチバージョン方式において、データ記録に対する書込動作は記録の新たなバージョンを作成し、読取動作は読取のために利用可能なバージョンから記録の適切なバージョンを選択する。この種のデータベースシステムには、データ記録の複数のバージョンが同時に存在することがある。これらのバージョンのうちいくつかは、現在実行中の、または将来のトランザクションのいずれにも使用されないかもしれない。これらの使用されないバージョンは「ガーベッジ（ゴミ）」と呼ばれる。よってこれらのシステムは、使用されないバージョンに占められる空間を回収するためのゴミ収集機構を用いる必要がある。多くのマルチバージョンデータベース方式は怠惰なゴミ収集を有しており、そこではデータ記録の旧バージョンが必要よりも長くデータベース中に存在し、ゴミがそのデータベース中にどれだけの長さ存在してもよいかということに関して制限されていない。
【０００５】
複数のトランザクションの同時実行は、所与のトランザクションの他のトランザクションからの何らかの保護を必要とする。トランザクションが他のトランザクションに対して有するこの保護は「分離」と呼ばれる。たとえば、トランザクションがデータ記録に対する書込動作を実行するとき、新たなデータ値は前のトランザクションが完了するまであらゆる他のトランザクションによって読取られるべきではない。ＡＮＳＩはさまざまな分離
レベルを定めた。一例は一般的に公知の「直列可能な」分離レベルであり、ここでは各トランザクションのすべての動作がクラスタ化される直列スケジュールと実行スケジュールとが同等であるような態様で複数のトランザクションが実行する、すなわちトランザクションは１つずつ直列的に実行されたように見える。直列可能性は最高度の分離である。
【０００６】
あらゆるロッキング機構を介して得られる分離とは独立に、いくつかのデータベース動作は、動作によって読取られるデータ記録が安定であること、すなわちその動作が一度訪れたデータ記録が動作実行の終わりまで決して変わらないことを必要とする。この要求は一般的にデータの「スナップショット」として知られる。データベース動作を実行するために用いられる共通言語は構造化照会言語（ＳＱＬ）である。いくつかのＳＱＬ文は、それらの実行中に一度より多く述語を満たすタプルまたはタプルの組を参照する必要があり得る。所与の述語が評価されるときに毎回ＳＱＬ文実行が同じデータ値を見ることをデータベース管理システム（ＤＢＭＳ）が保証するとき、そのＤＢＭＳは「スナップショット」分離を与えるといわれる。
【０００７】
先行技術は、直列可能な分離の下で実行するトランザクションに対する上記の要求を満たす２バージョン技術およびマルチバージョン技術を用いるデータベースシステムを記載する。しかしこれらの方式はいくつかの欠点を有する。たとえば、読取専用トランザクションはそれを宣言する必要がある。多くのＤＢＭＳはＳＱＬ文を進行中に作成し、各々すべてのトランザクションの開始時にそのトランザクションが読取専用であるか否かを査定できないことがあるため、これは実際的でない。第２に、現在の分析およびいくつかの製品の商業的成功は、直列可能な分離は論理的に興味深い概念だが、最も実用的な分離はＡＮＳＩ  ＳＱＬ分離のＲＥＡＤ  ＣＯＭＭＩＴＴＥＤ（コミットされた読取）またはその変形であることを示す。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
現在、ＡＮＳＩ  ＲＥＡＤ  ＣＯＭＭＩＴＴＥＤトランザクションに対する効率的な実現に焦点を合わせて、同時処理可能なシステムにおけるトランザクション同時実行と現在用いられるアクセス制御およびロック競合解決策によって起こる問題との間のトレードオフを改善することが求められている。
【課題を解決するための手段】
【０００９】
発明の概要
各データ記録は内部で単一の論理タプルによって表わされる。論理タプルは直接単一の物理タプルを示すか、または「バージョンリスト」と呼ばれるデータ構造を示す。物理タプルは「内容項目」とも呼ばれる。論理タプルはバージョンリストを通じて２つの物理内容項目と関係してもよい。これら２つの物理内容項目の１つによって表わされるデータ記録において最後にコミットされた値は「コミット（committed）内容項目」と呼ばれる。各物理内容項目はデータ値および制御フラグの組、すなわち（１）削除ビット、（２）割当ビット、（３）参照カウントを保存する。
【００１０】
データ記録に対するアクセス制御は、ＤＢＭＳにおけるロッキング構成要素により維持されてもよい。トランザクションがデータ記録の更新を求めるとき、それは論理タプル上にＸロックを置くことによってデータ記録に対する排他的許可を得る。次いで、トランザクションはデータ記録のコミット物理内容項目の新たなバージョンを作成する。この新たな物理バージョンは「非コミット（uncommitted）内容項目」と呼ばれる。
【００１１】
静止状態において、すべての論理タプルはそれぞれのコミット物理内容項目を示す。データ記録に対する書込動作はバージョンリストを作成し、バージョンリストに対応する論
理タプル点を作る。バージョンリストは所与の論理タプルに対する最大２つの物理内容項目を維持する。このためにバージョンリストは２つのフィールドを有する。すなわち、（１）「読取コピー」とも呼ばれるコミット物理内容項目、および（２）「書込コピー」としても知られる非コミット物理内容項目である。コミット物理内容項目は、あらゆるトランザクションによって参照されてもよい現行の読取コピーである。バージョンリストにおける（保留中の）非コミット内容項目フィールドは、所与の書込動作を実行したトランザクションによってのみ用いられる物理非コミットコピーを参照する。この「書込」トランザクションがコミットするとき、可能であれば前の読取コピー（旧コミット内容項目）は割当解除される。書込トランザクションがコミットした後、論理タプルは新たなコミット内容項目を示し、バージョンリストは割当解除され、論理タプル上のＸロックは解除される。
【００１２】
読取動作は、論理タプルまたはその物理内容項目に対する排他的アクセス権を保持しない。読取動作は最新のコミット物理内容項目の参照カウントを単に増加させる。読取動作が完了すると、それは物理内容項目に関連する参照カウントを減らす。既に述べたとおり、コミット時に各書込トランザクションは書込コピー（非コミット内容項目）を読取コピー（コミット内容項目）に切換える。次いで、書込トランザクションは旧コミット内容項目（すなわち前の読取コピー）の参照カウントをチェックする。参照カウントがゼロであれば、旧コミット物理内容項目は削除された内容項目を記載するすべてのログ記録とともに直ちに割当解除される。コミット物理内容項目に対する参照カウントが正であれば、書込トランザクションは物理内容項目を割当解除しない。書込トランザクションは次いで、代替的に「遅延削除」とも呼ばれる偽の削除を行なう。
【００１３】
書込トランザクションは、対応する旧コミット内容項目の削除されたビットを設定することによって、データ記録に対する遅延削除を行なう。次いで、それは削除が実際に行なわれたかのようにすべてのログ記録をプッシュする。しかし、物理内容項目の割当ビットは、旧コミット内容項目がＤＢＭＳによって再利用されることを防ぐ状態で保たれる。読取トランザクションがコミットするとき、読取コピー（旧コミット物理内容項目）が解除されたか否かにかかわらず、バージョンリストは割当解除され、論理タプルは新コミット内容項目を直接示す。
【００１４】
先に説明したとおり、動作実行が完了するとき、読取動作はそれが読んだすべての物理内容項目の参照カウントを減らす。書込トランザクションによって物理内容項目に対する遅延削除が行なわれたとき、その際のコミット物理内容項目の参照カウントは正でなければならない。最終的にすべての読取動作がその実行を終え、その物理内容項目に対する参照カウントはゼロに落ちる。参照カウントをゼロに減少させた読取動作は、この内容項目が以前書込トランザクションによって削除のためにマーク付けされたかをチェックする。この場合（遅延削除）、読取動作はその物理内容項目に対する割当ビットをリセットして、その物理内容項目をＤＢＭＳが再利用できるようにする。なお読取動作は、いかなるログ記録を書く必要もなく割当ビットをオフにすることによって物理内容項目を割当解除する。
【００１５】
バージョニング制御システムは、遅延削除の存在下でもゴミがない。現在どの読取動作もデータ記録の読取コピーにアクセスしていないとき、その読取コピーは新たな書込トランザクションが完了するとすぐに捨てられる。そうでなければ、最後の読取動作が物理内容項目をクリーンアップする。よって、物理内容項目は本当に必要な時間よりも長く割当てられることがない。
【００１６】
ＳＱＬスナップショット分離を必要とする分類およびその他の類似のトランザクションに対し、遅延削除は読取動作が論理タプルポインタを単にコピーすることによって一時的
な空間におけるデータ記録を再訪することを可能にする。これによって、分類トランザクションが参照カウントおよび読取られる物理内容項目の生存期間を管理することが可能になる。
【００１７】
一般的に、バージョニング技術は非効率的な索引維持を導く。しかし、我々のバージョン制御方式の局面を用いることにより、迅速な索引維持が得られた。すべての索引中の各エントリはコミット／非コミットビットを有する。このビットがいかにして書込動作の３つのカテゴリ、すなわち挿入、削除および更新に対して設定されるかを説明する。論理タプルの挿入に対して、非コミット内容項目が索引に挿入され、対応する索引エントリがコミットされたとマーク付けされる。論理タプルの削除に対しては、コミット時まで何も行なわれない。トランザクションのコミットの際に、索引エントリは削除され、対応するビットは意味を有さなくなる。論理タプルの更新に対しては、先に説明したとおり、新たな物理タプル、すなわち非コミット内容項目が索引に挿入され、対応するビットが「非コミット」とマーク付けされる。このトランザクションがコミットするとき、索引エントリは更新されて同じエントリを「コミットされた」とマーク付けする。一方、このトランザクションがロールバックすれば、単に索引エントリを除去すればよい。すると索引走査は誤った索引エントリを参照するときに無効値を受取る。
【発明を実施するための最良の形態】
【００１８】
詳細な説明
図１は、データベース８と、データベース管理システム（ＤＢＭＳ）６およびバージョン制御システム１０に対するソフトウェアを保存および実行するプロセッサ４（中央処理ユニット（ＣＰＵ）およびメモリ）とを含むデータベースシステムを示す。１つの例において、プロセッサ４を含む計算装置２はサーバである。こうしたシステムはデータベースサーバとも呼ばれる。プロセッサ４はサーバ２において動作する単一ＣＰＵまたは複数のＣＰＵであってもよい。データベース８は典型的に複数の直接アクセス記憶装置（ＤＡＳＤ）に保存されるが、図１にはこうした装置を１つだけ例示する。ＤＡＳＤはたとえばディスクパックであってもよく、データベースシステムはデータベース８とプロセッサ４との間の通信を確立する、必要なＤＡＳＤコントローラおよびチャネルを含むことが当業者に理解される。別の例において、データベース（８）は主メモリ（４）自体の中に保存されてもよい。
【００１９】
端末１は、データベースユーザからの要求を受入れて結果を戻すあらゆる入力／出力（Ｉ／Ｏ）装置である。たとえば、端末はパーソナルコンピュータ（ＰＣ）、または知られるアプリケーションプログラマインターフェイス（ＡＰＩ）を用いるアプリケーションであってもよい。トランザクションおよび問合せは端末１から提出され、ＤＢＭＳ６によって同時に処理される。データベース８中の異なるバージョンのデータは、バージョン制御システム１０によって維持される。
【００２０】
図２は、バージョン制御システム１０をより詳細に説明するものである。論理テーブル１２は論理タプル１４の組を含む。各論理タプル１４は物理テーブル１６中の物理内容項目１８を直接示すか、またはバージョンリスト２０を示す。たとえば、論理タプル１４Ａは物理内容項目１８Ａを直接示すポインタを含み、論理タプル１４Ｂはバージョンリスト２０を示すポインタを含む。論理タプル１４は、論理タプルがバージョンリストを示すかまたは物理タプルを直接示すかを示すフラグフィールド２２２を含む。
【００２１】
排他的ロック（Ｘロック）３０２は論理タプル１４に関連付けられ、１つのトランザクションからの書込動作が他のトランザクションからの読取動作の同じ論理タプルへのアクセスをロックアウトしたことを示す。これらのロックはＤＢＭＳによって管理される。たとえば、１つのトランザクションからのロックマネージャ３００中のＸロック３０２Ｂは
、他のトランザクションの下にある書込動作が論理タプル１４Ｂにアクセスすることを防止する。論理タプル１４にアクセスできるあらゆる動作が、論理タプル１４中のバージョンリストフラグ２２２をチェックすることによって、関連バージョンリストが存在するか否かをまずチェックする。設定されたバージョンリストフラグ２２２を有する論理タプルにアクセスする動作は、関連バージョンリストに行く。
【００２２】
物理テーブル空間１６は、代替的に内容項目と呼ばれる物理タプルを含む。書込動作がデータ記録において完了するがそのオーナートランザクションがコミットする前であるとき、そのデータ記録（論理タプル）は物理テーブル空間中に２つの物理バージョンを有する。コミット内容項目は読取動作のみが利用可能であり、保留内容項目はそれを作成した書込トランザクションのみが利用可能である。たとえば、論理タプル１４Ｂは書込動作によって変更された。ライタは論理タプル１４Ｂに対する元のコミット内容項目１８Ｂからコピー１８Ｂ′を作成した。コミット内容項目１８Ｂはあらゆる読取動作が利用可能である。しかし、保留内容項目１８Ｂ′は保留内容項目１８Ｂ′を作成した書込トランザクションのみが利用可能である。
【００２３】
タプルバージョンリスト２０は３つのフィールドからなる。（１）「オーナーＩｄ」フィールドは、バージョンリスト２０を作成したトランザクションの一意の識別子を含む。たとえば、保留内容項目１８Ｂ′を作成した書込トランザクションに対するトランザクションＩｄ（ＸＩＤ）がオーナーＩｄフィールド２２中に置かれる。（２）「コミット内容項目」フィールド２４は、物理テーブル空間１６中の物理コミット内容項目１８Ｂに対するポインタを含む。（３）「保留内容項目」フィールド２６は、物理テーブル空間１６中の保留内容項目１８Ｄ′を示す。
【００２４】
図３は、特定の物理内容項目１８Ａに関連する活性トランザクションがないときのデータベースを示す。この状態において、論理タプル１４Ａはコミット内容項目１８Ａを直接示し、タプルバージョンリスト２０は存在しない。たとえば、論理タプル１４Ａにおけるアドレス値は、物理タプル１８Ａが物理テーブル空間１６中に置かれているアドレス場所を直接示す。
【００２５】
物理内容項目１８は関連削除フラグ３０と、割当フラグ３２と、参照カウント３４とを有する。削除フラグ３０は、削除に対して物理内容項目をマーク付けするために用いられる。割当フラグ３２は、空間が現在割当てられていることを識別するために用いられる。参照カウント３４は、物理内容項目を現在参照している読取動作の数を識別する。
【００２６】
挿入、削除または更新のいずれか１つが一般的に書込動作３８と呼ばれる。読取動作を含むすべての動作は関連ＸＩＤを有するトランザクションの下で起こる。書込動作３８が論理タプルを作成するとき、それは以下のステップを通る。挿入動作３８は物理テーブル空間１６中に新たな物理内容項目１８Ｂを作成し、また関連バージョンリスト２０も作成する。次いで、それはバージョンリスト２０を示す新たな論理タプル１４Ｂを作成する。バージョンリスト２０中のオーナーＩｄフィールド２２は、書込動作３８に対するトランザクションＩｄ（ＸＩＤ）３６を含む。コミット内容項目フィールド２４はＮＵＬＬ（無効）に設定され、保留内容項目フィールド２６は新たに挿入された物理内容項目１８Ｂを示す。これによって、新たな論理タプルのテーブル空間への挿入が完了する。
【００２７】
前述の書込トランザクション３８以外の何らかのトランザクションによるテーブル走査は、バージョンリスト２０中のコミット内容項目フィールド２４のみを見る。フィールド２４がＮＵＬＬであることを見出して、このトランザクションは論理タプル１４Ｂをスキップする。書込トランザクション３８に対するトランザクションＩｄ３６がオーナーＩｄフィールド２２中の値と一致するため、書込トランザクション３８による走査は保留内容
項目フィールド２６を見る。書込トランザクション３８が一旦コミットすると、バージョンリスト２０は破壊され、論理タプル中の標識２２２は０に設定され、論理タプル１４Ｂは物理タプル１８Ｂを直接示す。この時点で内容項目１８Ｂに対する削除フラグ３０は設定されない。割当フラグ３２は物理内容項目１８Ｂが作成されたときと同じ値であって、ＤＢＭＳ６（図１）に対してテーブル空間１６中の物理アドレス空間が現在内容項目１８Ｂに割当てられていることを示し、参照カウント３４はゼロに設定される。
【００２８】
遅延削除
削除動作は前述の挿入動作と非常によく似ている。削除動作の挿入動作との唯一の相違点は、論理タプル１４Ｂの削除に対するバージョンリスト２０中のコミット内容項目２４がコミット内容項目１８Ｂを示し、保留内容項目２６がＮＵＬＬであることである。挿入動作に対して説明したのと同じ論理を用いて、他のトランザクションは論理タプル１４Ｂ（すなわちコミット内容項目１８Ｂ）の前の値を見る。現行のトランザクション３８はこの論理タプル１４Ｂをスキップする。
【００２９】
図４は、現存する論理タプル１４Ｂに対して更新動作３８が行なわれると何が起こるかを示す。保留内容項目１８Ｂ′を作成した後も、トランザクションを完了する前は、書込動作３８が論理タプル１４Ｂに再アクセスする必要があるかもしれない。論理タプル１４Ｂはバージョンリスト２０を示す。オーナーＩｄフィールド２２中のトランザクションＩｄ３６は書込動作３８に対するトランザクションＩｄ３６と一致するため、この動作はバージョンリスト２０中の保留内容項目フィールド２６を用いて保留内容項目１８Ｂ′に達する。よって、書込動作３８は保留内容項目１８Ｂ′のみを見る。書込トランザクションによって行なわれるすべての連続した更新は保留内容項目１８Ｂ′に適用される。これらの更新動作３８は、（たとえば前の挿入動作により）バージョンリスト２０が既に存在するときにはそれを変更し、それが存在しないときには新たなものを作成する。このバージョンリストにおいて、コミット内容項目フィールド２４はコミット内容項目１８Ｂを示し、保留内容項目フィールド２６は保留内容項目１８Ｂ′を示す。バージョンリスト２０中のオーナーＩｄフィールド２２は、書込トランザクション３８に対するトランザクションＩｄ（ＸＩＤ）３６を含む。
【００３０】
あらゆる書込動作３８はまず、Ｘロック３０２Ｂ（図２）などの対応する論理タプル上のＸロックを要求することによって論理タプル（データ記録）１４Ｂの排他的ロックを得る。これにより、所与の時間においてただ１つの書込トランザクションのみが論理タプルに書込むことができる。しかし、別のトランザクションＩｄ３６Ｂの書込動作３９部分などのあらゆる読取動作は、Ｘロック３０２Ｂが設定されている間、自由にコミット内容項目１８Ｂ（あれば）を読取る。これは米国規格協会（ＡＮＳＩ）のＲＥＡＤ  ＣＯＭＭＩＴＴＥＤ分離レベルに従う。コミットされた読取分離とは、あらゆる読取動作がデータ記録（論理タプル）の最後にコミットされたコピーを読取るべきであることを意味する。
【００３１】
削除または更新動作を行なったそれらのトランザクションに対するコミット時には、旧コミット内容項目を物理テーブル空間から除去する必要がある。しかし、これらの書込動作３８の挙動は、コミット内容項目１８Ｂに関連する参照カウント３４に基づいて変更される。コミット内容項目１８Ｂに対する参照カウント３４は、対応する論理タプル１４Ｂにアクセスする各読取動作３９に対して増やされる。読取動作３８を行なったトランザクションがコミットし、論理タプル１４Ｂの必要な変更を完了するとき、それはバージョンリスト２０を割当解除し、関連する旧コミット物理内容項目１８Ｂを割当解除する。
【００３２】
内容項目１８は常にまず生成され、次いで削除される。論理タプルに対する更新および削除動作は常に前のコミット内容項目を削除する。書込動作３８を行なったトランザクションが完了するとき、それは旧コミット内容項目１８Ｂの削除を試み、保留内容項目１８
Ｂ′を物理テーブル１６中の新たなコミット内容項目にする。
【００３３】
書込トランザクション３８はまず、旧コミット内容項目１８Ｂに対する参照カウント３４をチェックする。参照カウント３４がゼロのとき、書込トランザクション３８は旧コミット内容項目１８Ｂの完全な制御を行ない、割当フラグ３２をリセットすることによって旧コミット内容項目１８Ｂを削除する。参照カウント３４がゼロでないとき、書込トランザクション３８は、削除フラグ３０を設定してすべての必要なログ記録４５をプッシュすることによって内容項目１８Ｂを削除とマーク付けする。現在内容項目１８Ｂを読取っている読取動作３９が完了すると、それは参照カウント３４を減らす。参照カウント３４がゼロであるとき、読取動作３９は内容項目１８Ｂに対する削除フラグ３０が設定されているかをチェックする。削除フラグ３０が設定されているとき、読取動作３９は割当フラグ３２をリセットすることによって内容項目１８Ｂを物理テーブル空間１６から実際に除去する。これで旧コミット内容項目１８ＢはＤＢＭＳ６によって別の内容項目を割当てるために利用可能となる。
【００３４】
前述の「遅延削除」方式において、読取動作３９は内容情報１８Ｂの所有権を得ていかなるログ記録をプッシュする必要もなく削除を完了する。遅延削除とともに付加的な戦略が働いて回復および取消動作を可能にする。チェックポインタは内容項目の削除が本当に終わったものとみなし、ディスク上のデータベースのコピーは常にこの内容項目を「削除」および「自由」とマーク付けして示す。回復プロセスはまた、使用中でないすべての内容項目が自由とマーク付けされることを確実にする。
【００３５】
「タプル生存期間」という用語は、参照するトランザクションのために物理タプル（内容項目）が存在することが必要な時間を示す。コミットされた読取分離の読取動作に対して、参照タプルに対するタプル生存期間とはタプルをアプリケーションバッファにコピーするために必要な時間である。コミットされた読取分離の書込動作を含むあらゆる書込動作に対して、変更されたタプルに対する生存期間とは変更トランザクションの生存期間である。たとえば、Ｘロックはタプルの生存期間および保留内容項目が生きている間論理タプル上に保持され、トランザクションの終了まで他のトランザクションによって変更することはできない。簡単なロッキングベースの同時実行制御方式においては、タプル項目上に共有ロックが保持されるため、読取トランザクションがタプル値をバッファにコピーし終えるまでタプルの存続が保証される。現行方式の効果の１つは、いかなる読取専用トランザクションもロックを保持する必要がないことである。
【００３６】
分類
「分類」は、同じデータを一度より多く読取る必要があり得る動作の組の代表である。分類の例は結合、グループ化および明確な属性などである。分類を行なう読取動作は物理テーブルから内容項目の組を読取ってもよい。読取動作は分類動作の実行中に削除されるかもしれないあらゆる内容項目の所有権を得て、分類動作の完了時にこうした内容項目をすべて削除する。
【００３７】
遅延削除は文レベル一貫性を必要とする文にも及ぶ。たとえば分類動作は、分類が実際に終了することを確実にするために文レベル一貫性を必要とする。分類が進行中のときに分類によってアクセスされる内容項目が変更可能である場合には、終了保証がなくなる。我々の方式は、参照カウントがゼロよりも大きいあらゆる内容項目がテーブル空間から削除されないことを保証する。文レベル一貫性を必要とするあらゆるトランザクションは、アクセスされる内容項目すべての参照カウントを増やすことができる。文の最後にすべての内容項目の参照カウントが減らされる。
【００３８】
図５は、アドレス値ＩＤ１−ＩＤ５を含む論理タプル５０の組を示す。論理タプル５０
中のアドレス値は、物理テーブル空間Ｔ１における対応する物理タプル５２を示す。この例において、各物理タプル５２はデータ記録の“Ａ”列およびデータ記録の“Ｂ”列を有する。
【００３９】
分類動作５８の一例は以下のとおりである（Ｔ１から＊を選択し、Ｂにより順序付け）。
【００４０】
分類動作５８において、テーブルＴ１中のすべての物理タプル５２は列Ｂ中の値に従って再順序付けされる。いくつかの他のデータベースシステムにおいて行なわれる分類動作は、高い同時実行性を維持したければ、テーブルＴ１から要求される物理タプル５２を別の一時的なテーブルにコピーする必要があり得る。その一時的なテーブル中の物理タプルのコピーは使用前に動作によって分類される。この方式はタプルの第２の組を保存するための大量のメモリを必要とする。さらに、タプル５２の第２のコピーは他のトランザクションと共有できない。代替的には、トランザクションは分類の継続時間全体にわたってロックを保持する必要があるかもしれないためにシステム中の同時実行性を深刻に制限する。ＯＲＡＣＬＥ（Ｒ）データベースシステムは複数のバージョンによってこの問題を解決するが、前のバージョンに対する迅速なアクセス経路を維持しないためにデータベースシステムの実行速度を深刻に制限する。
【００４１】
しかし、このデータベースシステムでは、物理タプル５２の第２のコピーを作る代わりに論理タプル５０の第２のコピー５５が作成される。論理タプルの第２のコピー５５はＩＤ１−ＩＤ５しか含まず、典型的には大きさが物理タプル５２よりもずっと小さい。分類動作５８は物理タプル５２のみを読取る。したがって他のトランザクションが同じ物理タプル５２にアクセスできる。
【００４２】
分類動作５８によって参照された物理タプル５２のすべてに対して参照カウント３４が増やされる。この場合は、物理テーブル空間Ｔ１中のすべての物理タプル５２である。これによって分類トランザクション５８が完了するまで物理タプル５２が削除されないことが確実になる。書込トランザクション５６が物理タプル５２のいずれかに対する内容を変えるとき、前述の遅延削除方式によって、旧コミット物理タプル５２が割当解除されるときに分類動作５８の制御が可能になる。
【００４３】
分類動作５８の際に、論理タプル５５は物理タプル５２のデータ列Ｂ中の値に従って分類される。論理タプルの最終的に分類された組がテーブル６０に示される。書込トランザクション５６によって削除されるあらゆる物理タプル５２に対して削除フラグ３０が設定される。分類動作５８は、削除フラグ３０が設定された物理タプル５２に対する割当フラグ３２をリセットする。分類動作５８は、書込トランザクション５６によって削除されるというフラグを立てられなかった物理タプル５２に対する割当フラグ３２はリセットしない。
【００４４】
索引付け
図６は、索引走査が索引６０中のコミットおよび非コミットエントリを区別する、バージョン制御システムの別の特徴を示す。索引方式は通常、動作を削除するための２つまたはそれ以上の索引照合ならびに動作を更新および挿入するための複数の索引照合を必要とする。前述のバージョン制御システムは、動作を挿入および削除するためのただ１つの索引照合ならびに動作を更新するための３つの索引照合を必要とする。更新動作に対する照合のコストをさらに減少させるために既存の最適化技術を用いることができる。
【００４５】
これを効率的になし遂げるために、バージョンリスト７０は前述の３つの構成要素に加えて複数の索引エントリのリストを保存する。影響される索引の各々は重複する索引エン
トリを有する。影響される索引のリストは論理タプル挿入および削除動作に対して保持されない。なぜならこれらの動作はすべての索引に影響するからである。たとえば、論理タプル挿入は下にあるテーブルのすべての索引における挿入動作を必要とする。すなわち、索引当りの論理タプル挿入当り１つの挿入照合動作である。（データ記録に対する削除動作を行なった）トランザクションがそのためにすべての索引エントリをコミットするとき、対応する論理タプルはすべての索引から削除される必要がある。その結果、索引当りの論理タプル削除当り１つの索引照合動作となる。
【００４６】
しかし、各更新動作は、対応するバージョンリスト中の影響される索引のリストを保持する。論理タプルが更新されるとき、非コミットマークを伴う新たなエントリがすべての影響される索引に挿入される。論理タプル更新がコミットされるとき、論理タプルに対するすべての影響される索引に対するコミット索引エントリが削除され、すべての非コミットエントリがコミットとマーク付けされる。
【００４７】
一例において、挿入動作は論理タプル６８を作成し、次に内容項目８４、バージョンリスト７０および索引エントリ６４Ａを作成する。索引エントリ６４Ａは論理タプル６８を示す。最初、バージョンリスト７０中の保留内容項目フィールド７４はコミット内容項目８４を示し、コミット内容項目フィールド７６は無効である。
【００４８】
更新動作８０において、索引エントリ６４Ａおよび論理タプル６８は既に存在する。更新トランザクション８０はコミット内容項目８４から保留物理内容項目８６を作成する。バージョンリスト７０が作成され、そこではコミット内容項目フィールド７４がコミット内容項目８４を示し、保留内容項目フィールド７６が保留内容項目８６を示す。
【００４９】
更新動作８０によって、保留内容項目８６に対応する新たな索引エントリ６６Ａが作成される。新たな索引エントリ６６Ａはフラグ６６Ｂを設定することによってマーク付けされる。マーク付けされた索引エントリは内容項目の新たな保留バージョンを参照し、マーク付けされないエントリは内容項目のコミットされたバージョンを参照する。索引は影響されたとマーク付けされ、これは索引６２中に二重のエントリがあることを意味する。バージョンリスト７０はまた、二重エントリを有する索引を識別する索引マップ７８を含む。この場合、索引マップ７８は索引６２が二重エントリ６４Ａおよび６６Ａを有することを識別する。
【００５０】
索引走査の際に、更新動作８０を行なったトランザクション９０は索引エントリ６４Ａを受取ってもよい。索引エントリ６４Ａは論理タプル６８を介してバージョンリスト７０を示す。このトランザクション９０はバージョンリスト７０のオーナーＩｄフィールド７２に含まれるものと同じＸＩＤを有し、索引６２は索引マップ７８において識別される。したがって、トランザクション９０に無効値が戻されて、トランザクション９０がコミット内容項目８４に関連する索引エントリ６４Ａを用いることを防ぐ。
【００５１】
それによって索引走査は索引エントリ６４Ａをスキップし、トランザクション９０にマーク付けされた索引エントリ６６Ａを与える。マーク付けされた索引エントリ６６Ａは論理タプル６８を介してバージョンリスト７０を示す。索引エントリ６６Ａがマーク付けされており、またトランザクションＩｄがオーナーＩｄフィールド７２中のＩｄと一致するため、トランザクション９０の読取動作（走査とも呼ばれる）には、保留内容項目８６を示す保留内容項目フィールド７６中の値が与えられる。このプロセスは、更新トランザクションが保留内容項目８６にアクセスするために正しい索引エントリ６６Ａを用いることを確実にする。
【００５２】
図７は、前述の索引付け方式をより詳細に説明する流れ図である。図６に示されるバー
ジョンリスト７０は、論理タプル６８を更新した動作のトランザクションＩｄを含むオーナーＸＩＤによって参照される。コミットTupId項は、論理タプルの前のバージョンの物理タプルＩｄを参照する。非コミットTupId項は、論理タプルの新たなバージョンに対する物理タプルＩｄを参照する。索引マップ（indexMap）項はすべての影響される索引のビットマップを参照し、実施例の１つにおいては更新トランザクションに対してのみ存在する。しかし、スキャナは挿入、削除、影響された索引および影響されない索引を分析する。
【００５３】
バージョンリストは論理タプルｖリスト（logicalTuple.ｖList）を参照する。「マーク（mark）」項は索引エントリ中のコミットまたは非コミットマークを識別する。索引Id（indexId）は索引エントリが走査されることを表わすビットマップである。挿入に対して、コミットとマーク付けされる索引エントリは１つしかない。
【００５４】
ブロック９２において、ＤＢＭＳは論理タプルがバージョニングされたかどうかを判断する。バージョニングされていない論理タプルはさらに分析されることがなく、ブロック９０においてその論理タプルが示す物理タプルはスキャナに戻される。論理タプルがバージョニングされているとき、論理タプルはバージョンリストを示す。スキャナが索引エントリを見るとき、それは次の態様で解決される。索引が影響される索引であるとき、そこには２つの索引エントリがある。第１の索引エントリはコミットに対してマーク付けされておらず、論理タプルの前のバージョンが索引中で位置決めされていた位置を表わす。第２の索引エントリは非コミットコピーに対してマーク付けされ、索引中の論理タプルの新たな位置を表わす。
【００５５】
ブロック９６において、索引エントリがコミットとマーク付けされ、かつトランザクションＩｄがバージョンリスト中のオーナーＩｄと一致するかまたはトランザクションＩｄがコミットトランザクションを表わし、かつ索引エントリが影響される索引を表わすとき（これは影響される索引ビットマップ中の索引Ｉｄの帰属をチェックすることによって確認される）、ブロック９４において無効ＩＤ（ＮＵＬＬＩＤ）がスキャナに戻され、物理内容項目エントリは存在しないとされる。
【００５６】
索引エントリがブロック１００においてコミットとマーク付けされるか、またはブロック１０４において非コミットとマーク付けされ、かつトランザクションＩｄ（ＸＩＤ）がvlistと一致するか、またはＸＩＤがコミットトランザクションを表わすとき、ブロック９８またはブロック１０２において非コミットタプルＩＤ（uncommitedTupleId）が戻される。トランザクションおよびバージョンリストの間でＸＩＤの一致がないとき、またはオーナーＸＩＤがコミットトランザクションでないとき、ブロック１０８においてコミットタプルＩＤ（commitedTupleId）が戻される。削除に対しても同じことが当てはまり、影響されない索引に対しても同じ論理が当てはまる。
【００５７】
図７における論理は代替的に次のように表わされる。
【００５８】
【数１】
2007501468.tif 000003
【００５９】
上記に示す方式はＡＮＳＩ  ＳＱＬの基準に従っており、更新トランザクションのみが自身の更新を見て、読取トランザクションはコミットデータのみを見る。この実施はＡＮＳＩ  ＲＥＡＤ  ＣＯＭＭＩＴＴＥＤ分離レベルに従う。
【００６０】
更新トランザクションのすべての影響が１つのステップで読取トランザクションに可視的になる。図７に示すとおり、すべてのトランザクションはコミットフィールドを有し、それはトランザクションに対してコミット判断が実行されるときに真（ＴＲＵＥ）に設定される。コミットフィールドが設定された後、すべてのスキャナは非コミット物理タプルＩｄに従うことによって論理タプルの更新値を見る。一旦コミットするという判断が実行されると、ラッチまたはロックを保持することなく原子的なコミットが得られる。すると論理タプルのクリーンアップは怠惰になることができる。
【００６１】
ここで言及する方式は、直列可能なトランザクションが２相ロッキング方式に従う直列可能なトランザクションに容易に移植可能である。索引一貫性を確実にするために、直列可能な索引走査の生じるあらゆるエントリに共有ロックを用いることができる。索引エントリによって示される論理タプルに対して読取ロックを得ることができる。一旦ロックが得られて、索引エントリが「更新中（in-update）」であることが見出されると、トランザクションは論理タプルを変更しているはずである。この場合、保留内容項目Ｉｄは戻される。索引エントリがマーク付けされていないことが見出されるとき、論理タプルのオーナーＩｄ（OwnerId）および現在のトランザクションのトランザクションｉｄが一致すれば索引エントリは無視され、そうでなければコミット内容項目ｉｄは戻される。
【００６２】
概要
この発明の異なる局面は、直列可能でないトランザクションのための非ブロッキング読
取を提供する。すなわち、データ記録の読取が遅延されない。データ記録の読取および書込の間に依存性は必要とされず、ライタはそれら自身の間で依存性を有することはできるが、いかなる読取動作との依存性も要求されない。読取動作がデータ記録を読取るときに効率的なバージョン配置が与えられる。遅延される一貫性チェックがないため、トランザクションは、コミット時よりもむしろ書込動作の実行の際に生じるに違いない「書込」動作デッドロック以外の理由でコミット時にロールバックされる必要がない。データ記録のバージョンが必要とされるより長くデータベース中に滞在することのない、ゴミのない実行が提供される。効率的な減少された分離支持は、読取られるバージョンの効率的な場所を含む、減少された分離レベルで走るトランザクションの実行を提供する。
【００６３】
非ブロッキングトランザクション承認はいかなるロッキング競合によってもトランザクションを遅延させることがなく、データの年齢は制限される。同じデータ記録の複数のコピーの存在下で効率的な索引管理が提供され、ゴミのない実行特性を維持しながらスナップショットに対する簡単な拡張性が提供される。さらに、トランザクションは自身が読取専用または読取−書込であることを予め宣言する必要がない。
【００６４】
前述のシステムは、動作のいくつかまたはすべてを行なう専用プロセッサシステム、マイクロコントローラ、プログラム可能論理装置、またはマイクロプロセッサを用いることができる。前述の動作のいくつかはソフトウェアにおいて実現されてもよく、他の動作はハードウェアにおいて実現されてもよい。
【００６５】
利便性のために、さまざまな相互接続された機能ブロックまたは別個のソフトウェアモジュールとして動作を説明した。しかしそうである必要はなく、これらの機能ブロックまたはモジュールが不明瞭な境界を有する単一の論理装置、プログラムまたは動作に同等に集められる場合があってもよい。とにかく、機能ブロックおよびソフトウェアモジュールまたはフレキシブルインターフェイスの特徴は、それら自身によって、またはハードウェアもしくはソフトウェアにおける他の動作との組合せによって実現できる。
【００６６】
この発明の原理をその好ましい実施例において説明および例示したが、そうした原理から逸脱することなくこの発明の配列および詳細を変更してもよいことが明らかなはずである。請求項の趣旨および範囲内にあるすべての変更および修正を主張する。
【図面の簡単な説明】
【００６７】
【図１】バージョン制御システムを用いるデータベースシステムのブロック図である。
【図２】データベースシステムにおいてバージョン制御システムがどのように動作するかを示すブロック図である。
【図３】バージョン制御システムの動作をさらに詳細に示すブロック図である。
【図４】バージョン制御システムの動作をさらに詳細に示すブロック図である。
【図５】分類動作の際にバージョン制御システムがどのように動作するかを示す図である。
【図６】データベースシステムにおいて索引付けがどのように制御されるかを示す図である。
【図７】データベースシステムにおいて索引付けがどのように制御されるかを示す図である。
【図１】
2007501468.tif 000004
【図２】
2007501468.tif 000005
【図３】
2007501468.tif 000006
【図４】
2007501468.tif 000007
【図５】
2007501468.tif 000008
【図６】
2007501468.tif 000009
【図７】
2007501468.tif 000010
【手続補正書】
【提出日】平成18年2月9日(2006.2.9)
【手続補正１】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【図１】
2007501468.tif 000011
【図２】
2007501468.tif 000012
【図３】
2007501468.tif 000013
【図４】
2007501468.tif 000014
【図５】
2007501468.tif 000015
【図６】
2007501468.tif 000016
【図７】
2007501468.tif 000017
【国際調査報告】
2007501468.tif 000018
2007501468.tif 000019