(57)【要約】【課題】索引アクセスにおいてトランザクションロックを用いることなくトランザクションの独立性を実現することにより、良好なシステムのスループットを実現する。【解決手段】アプリケーション１２からのアクセス要求に応じて、更新された未確定の状態にあるデータをトランザクション毎に格納するためのトランザクションローカルログバッファ４０と、トランザクションローカルログバッファ４０に格納されたデータに対応する索引を格納するためのシステムグローバルログバッファ３８が設けられる。更新ログ生成部２８は、アプリケーション１２からのアクセス要求に応じた処理後の更新されたデータをトランザクションローカルログバッファ４０に格納し、このデータに対応する索引に対して未確定フラグを設定してシステムグローバルログバッファ３８に格納する。【選択図】    図１
2004341926.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションからのアクセス要求に応じたトランザクションを管理するデータベース管理システムにおいて、
アプリケーションが扱うデータを格納するデータ格納手段と、
前記データ格納手段に格納されたデータに対応する索引を格納する索引格納手段と、
アプリケーションからのアクセス要求に応じて、更新された未確定の状態にあるデータをトランザクション毎に格納するための第１の格納手段と、
前記第１の格納手段に格納されたデータに対応する索引を格納するための第２の格納手段と、
前記アプリケーションからの前記データ格納手段に格納されたデータに対するアクセス要求に応じた処理後の更新されたデータを前記第１の格納手段に格納する更新データ格納手段と、
前記更新データ格納手段により前記第１の格納手段に格納されたデータに対応する前記索引格納手段に格納された索引に対して、未確定状態を示すフラグを付加して前記第２の格納手段に格納する更新索引格納手段と
を具備したことを特徴とするデータベース管理システム。
【請求項２】
前記更新索引格納手段は、前記アプリケーションから、削除アクセス要求があった場合に削除未確定を示すフラグを索引に対して付加し、追加アクセス要求があった場合に追加未確定を示すフラグを索引に対して付加することを特徴とする請求項１記載のデータベース管理システム。
【請求項３】
前記データ格納手段に格納されたデータに対する問い合わせに対して、前記第２の格納手段から問い合わせ対象とするデータに対応する索引を検索する検索手段と、
前記検索手段によって検索された索引が示すデータが、前記第１の格納手段に格納されている場合には同データを参照し、前記第１の格納手段に格納されていない場合には、前記データ格納手段に格納されたデータを参照する更新参照手段と
を具備することを特徴とするデータベース管理システム。
【請求項４】
前記更新参照手段は、前記問い合わせをしたトランザクションに対応して前記第１の格納手段に格納されたデータを対象として参照することを特徴とする請求項３記載のデータベース管理システム。
【請求項５】
前記更新索引格納手段により前記第２の格納手段に格納された未確定状態を示すフラグが付加された索引を確定状態にして前記索引格納手段に格納すると共に、前記索引に対応する前記第１の格納手段に格納されたデータを前記データ格納手段に格納して確定状態にする確定手段を具備したことを特徴とする請求項１記載のデータベース管理システム。
【請求項６】
システム起動時に、未確定状態を示すフラグが付された索引を検索する未確定索引検索手段と、
前記未確定索引検索手段によって検索された該当する索引を無効化する索引無効化手段と
を具備したことを特徴とする請求項１記載のデータベース管理システム。
【請求項７】
前記索引格納手段に格納された特定のサイズのページに区切られた索引に対するアクセス時に、当該索引のページへのシステム起動後最初のアクセスであるか否かを識別する識別手段と、
前記識別手段により最初のアクセスであると判別された場合に、当該ページから未確定状態を示すフラグが付された索引を検索する未確定索引検索手段と、
前記未確定索引検索手段によって検索された該当する索引を無効化する索引無効化手段と
を具備したことを特徴とする請求項１記載のデータベース管理システム。
【請求項８】
前記更新索引格納手段により前記第２の格納手段に格納された未確定状態を示すフラグが付加された索引のページを確定状態にして前記索引格納手段に格納すると共に、前記索引のページに対応する前記第１の格納手段に格納されたデータを前記データ格納手段に格納して確定状態にする確定手段と、前記確定手段によって確定状態にされた回数をカウントするカウンタ管理手段と、
システム起動時に前記カウンタ管理手段によりカウントされた回数を初期値として設定する初期値設定手段と、
前記確定手段による確定のたびに前記カウンタ管理手段に回数を更新させると共に、前記確定手段により確定対象の索引のページ内に前記カウンタ管理手段によりカウントされた回数の値を記録する回数記録手段と、
前記識別手段は、前記回数記録手段によって索引のページに記録された回数と前記カウンタ管理手段によりカウントされた回数とを比較した結果、索引のページに記録された回数が少ない場合にシステム起動後最初のアクセスであると識別することを特徴とする請求項７記載のデータベース管理システム。
【請求項９】
アプリケーションからのアクセス要求に応じたトランザクションを管理するデータベース管理プログラムであって、
コンピュータを、
アプリケーションが扱うデータを格納するデータ格納手段と、
前記データ格納手段に格納されたデータに対応する索引を格納する索引格納手段と、
アプリケーションからのアクセス要求に応じて、更新された未確定の状態にあるデータをトランザクション毎に格納するための第１の格納手段と、
前記第１の格納手段に格納されたデータに対応する索引を格納するための第２の格納手段と、
前記アプリケーションからの前記データ格納手段に格納されたデータに対するアクセス要求に応じた処理後の更新されたデータを前記第１の格納手段に格納する更新データ格納手段と、
前記更新データ格納手段により前記第１の格納手段に格納されたデータに対応する前記索引格納手段に格納された索引に対して、未確定状態を示すフラグを付加して前記第２の格納手段に格納する更新索引格納手段とに機能させるためのデータベース管理プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、トランザクション管理を実行するデータベース管理システム、データベース管理プログラムに関する。
【０００２】
【従来の技術】
一般に、トランザクション管理を実行するデータベース管理システムでは、トランザクションの独立性を実現するために、トランザクションロックによりトランザクション間でデータを排他する方法が一般に用いられる。
【０００３】
トランザクションは、データ更新に先立って、更新対象のデータの更新ロックを獲得して、更新対象データを他のトランザクションからの更新または参照から保護する。この更新ロックは、トランザクションをコミットまたはロールバックして更新を確定または破棄するまで維持する。
【０００４】
一方、参照を行うトランザクションは、参照に先立って参照対象データに対して参照ロックを獲得して、参照対象データを他のトランザクションからの更新から保護する。
【０００５】
トランザクション管理システムは、トランザクションロックによって複数のトランザクションからのアクセス要求を必要に応じて逐次化して、トランザクションの独立性を実現する。
【０００６】
これはデータに付随する索引の更新に関しても同様の制御が必要であり、索引の中でトランザクションが更新する個所に更新に先立って更新ロックの確保を行うことで、トランザクションの独立性を実現する。
【０００７】
しかしながら、上記した従来技術においては、トランザクションの独立性維持の目的で索引に対してもアクセスに先立ってトランザクションロックを確保するため、競合やデッドロックが起き易くシステムのスループット劣化の大きな要因になっていた。
【０００８】
従来、例えば、マスタファイルアクセスのための更新処理と参照処理の競合待ち合わせを改善するために、マスタデータ索引領域を主記憶へ格納し、更新データは更新データキューに蓄積するようにし、業務の終了までは、マスタデータの更新処理は主記憶上のマスタデータ索引領域と更新データキューを更新し、マスタデータの参照処理はこのマスタデータ索引領域と更新データキューに基き読み出されたマスタデータを更新し参照するようにしたマスタデータ管理方式が考えられている（特許文献１）。
【０００９】
【特許文献１】
特開平８−１７９９７８号公報
【００１０】
【発明が解決しようとする課題】
従来のデータベース管理システムでは、索引対象となる全てのデータに対して、１つの索引を構成しているため、索引対象のデータの何れに対する参照または更新であっても、それに伴って索引に対するトランザクションロックが必要になる。
【００１１】
トランザクションロックで保護する保護範囲を大きくすると、索引のトランザクションロックがトランザクション間で競合しやすくなり、そのため索引の更新と更新、または更新と参照が逐次化され、結果的にデータへのアクセスがこのロックのために逐次化されて、システムのスループットを大きく劣化させる要因になる。
【００１２】
逆にトランザクションロックで保護する保護範囲を小さくすると、索引のトランザクションロックの確保順によりデッドロックが多発して、これもまたシステムのスループットを大きく劣化させる要因になる。
【００１３】
つまり、索引へのトランザクションロックはトランザクションの独立性維持のため必要ではあるが、競合やデッドロックが起き易いため、システムのスループット劣化の大きな要因になっていた。
【００１４】
本発明は前記のような事情を考慮してなされたもので、索引アクセスにおいてトランザクションロックを用いることなくトランザクションの独立性を実現することにより、良好なシステムのスループットを実現することが可能なデータベース管理システム、データベース管理プログラムを提供することを目的とする。
【００１５】
【課題を解決するための手段】
本発明は、アプリケーションからのアクセス要求に応じたトランザクションを管理するデータベース管理システムにおいて、アプリケーションが扱うデータを格納するデータ格納手段と、前記データ格納手段に格納されたデータに対応する索引を格納する索引格納手段と、アプリケーションからのアクセス要求に応じて、更新された未確定の状態にあるデータをトランザクション毎に格納するための第１の格納手段と、前記第１の格納手段に格納されたデータに対応する索引を格納するための第２の格納手段と、前記アプリケーションからの前記データ格納手段に格納されたデータに対するアクセス要求に応じた処理後の更新されたデータを前記第１の格納手段に格納する更新データ格納手段と、前記更新データ格納手段により前記第１の格納手段に格納されたデータに対応する前記索引格納手段に格納された索引に対して、未確定状態を示すフラグを付加して前記第２の格納手段に格納する更新索引格納手段とを具備したことを特徴とする。
【００１６】
【発明の実施の形態】
以下、図面を参照して本発明の実施の形態について説明する。
図１は本実施形態に係わるデータベース管理システムのシステム構成を示すブロック図である。本実施形態におけるデータベース管理システムは、例えば半導体メモリ、ＣＤ−ＲＯＭ、ＤＶＤ、磁気ディスク等の記録媒体に記録されたプログラムを読み込み、このプログラムによって動作が制御されるコンピュータによって実現される。
【００１７】
本実施形態のデータベース管理システムでは、データに付随する索引に対する更新に際してトランザクションロックを用いる代わりに、追加に関する索引更新については即時行い、削除に関する索引更新についてはトランザクション確定まで遅延し、問い合わせ処理において更新ログにより索引の有効無効の判定を行うことで、トランザクションの独立性を実現する。データベース管理システムが何らかの障害等でダウンした場合は、索引に未確定の余分な索引レコードが残るが、未確定索引レコードに削除予定や追加予定のフラグを設けて判別することにより、再起動後にそれらのフラグが設定された索引レコードを回収するように構成する。
【００１８】
図１に示すように、本実施形態におけるデータベース管理システムは、トランザクション管理システム１０、データファイル３４、索引ファイル３６、ログファイル４２を含んでいる。トランザクション管理システム１０は、アプリケーション１２からのトランザクションによる検索アクセス要求、追加アクセス要求、更新アクセス要求、削除アクセス要求、トランザクション確定要求などに対する処理を実行する。
【００１９】
データファイル３４は、データを格納するファイルであり、複数のレコードデータを含むデータページ単位でデータを格納する（詳細については後述する（図２））。索引ファイル３６は、データファイル３４に格納されたデータに対する索引を格納するファイルであり、複数の索引レコードを含む索引ページ単位で索引を格納する（詳細については後述する（図３））。
【００２０】
ログファイル４２は、トランザクション管理システム１０によるデータファイル３４及び索引ファイル３６に対する更新に伴うログを格納するファイルである。本実施形態では、後述するシステムグローバルログバッファ３８及びトランザクションローカルログバッファ４０に格納されたログをトランザクション確定処理によって格納する。
【００２１】
データベース管理システムを実現するコンピュータのメモリ上には、データファイル３４及び索引ファイル３６との間の入出力バッファであるバッファ３２と、索引ページの未確定の更新イメージを格納するシステムグローバルログバッファ３８（第２の格納手段）がそれぞれシステムに１つ設けられる。システムグローバルログバッファ３８は、各トランザクションの処理に参照される。さらにトランザクション毎にそれぞれ１つのトランザクションローカルログバッファ４０（第１の格納手段）が設けられ、データページの未確定の更新イメージ、すなわちアプリケーションからのアクセス要求に応じたトランザクション毎に未確定の状態にある更新されたデータが格納される。
【００２２】
トランザクション管理システム１０には、アクセス処理部２０、トランザクションロック管理部２２、データ更新部２４、索引更新部２６、更新ログ生成部２８、トランザクション確定部３０、バッファ３２、システムグローバルログバッファ３８、及びトランザクションローカルログバッファ４０が含まれる。
【００２３】
アクセス処理部２０は、アプリケーションからのアクセス要求を受け付け、トランザクションロック管理部２２、データ更新部２４、索引更新部２６、更新ログ生成部２８の各部を用いてアクセス処理を実行する。
【００２４】
トランザクションロック管理部２２は、アクセス処理部２０により受け付けられたアクセス要求に応じて、データファイル３４に格納されるデータに対してトランザクションロックを確保する。
【００２５】
データ更新部２４は、アクセス処理部２０により受け付けられたアクセス要求に応じて、データファイル３４に格納されたデータレコードを更新する。
【００２６】
索引更新部２６は、アクセス処理部２０により受け付けられたアクセス要求に応じて、索引ファイル３６からバッファ３２にロードされる索引レコードに対する更新を実行する。索引更新部２６は、アプリケーション１２からのデータレコード追加要求を受け付けた場合には索引へ対応する索引レコードを追加し、アプリケーション１２からデータレコードに対する削除アクセス要求あるいは更新アクセス要求を受け付けた場合、該当する索引から対応する索引レコードの削除を行わない。該当する索引の索引レコードを、トランザクションに対応するトランザクションローカルログバッファ４０にコピーし、トランザクションローカルログバッファ４０上で更新ログ生成部２８により削除させる。
【００２７】
更新ログ生成部２８は、システムグローバルログバッファ３８及びトランザクションローカルログバッファ４０上で、アプリケーション１２からのデータレコード追加要求を受け付けた場合には追加アクセスのログを生成し、アプリケーション１２からのデータレコード削除要求を受け付けた場合には削除アクセスのログを生成する。
【００２８】
トランザクション確定部３０は、例えばアプリケーション１２からのトランザクション確定処理（コミット処理）の要求などに応じたトランザクション確定時に、そのトランザクションに対応するシステムグローバルログバッファ３８に記録された削除ログを元に索引更新部２６に対して索引レコードの削除を要求すると共に、データ更新部２４へデータレコードの削除を要求し、また追加ログを元にデータ更新部２４へデータレコードの追加を要求する。
【００２９】
図２は、データファイル３４へのデータの格納形式の一例を示す図である。  データファイル３４にはデータが格納される。データファイル３４の先頭は、図２（ａ）に示すようにファイルヘッダであり、ファイルの単位の制御情報が格納され、その中にシステムコミット番号が記録される領域が存在する。
【００３０】
ファイル内は一定サイズのデータページに区切られていて、先頭から連番のページ番号（ページ番号（ＰＮＯ）（１，２，３，…，Ｎ））が付与されている。
【００３１】
各データページ内には、図２（ｂ）に示すように、アプリケーションの論理的なデータ処理単位であるレコードの実体データがレコードデータとして格納されている。
【００３２】
ページ末尾には、図２（ｅ）に示すように、ページ制御情報が格納されており、その前方に順にレコード制御情報が格納されている。ページ制御情報には、ページ番号（Ｎ）が格納されている。レコード制御情報は、ページ末尾の方向からの順序をレコード番号（ＲＮＯ（１，２，３，…））として識別される。レコード制御情報の領域には、図２（ｄ）に示すように、レコードデータのページ内開始オフセット（データ開始オフセット）とデータサイズが格納されていて、レコードデータを参照可能である。ページ番号（ＰＮＯ）とレコード番号（ＲＮＯ）でレコードデータを一意に識別することができる。
【００３３】
図３は、索引ファイル３６への索引の格納形式の一例を示す図である。
【００３４】
索引ファイル先頭は、ファイルヘッダであり、ファイルの単位の制御情報が格納されている。
【００３５】
索引ファイル内は、データファイル同様に一定サイズのページに区切られていて、先頭から連番の索引ページ番号（ＩＰＮＯ（１，２，３，…，Ｎ））が付与されている。索引ページ内には、図３（ａ）に示すように、索引の実体である索引レコードが格納されている。ページ末尾にはページ制御情報が格納されており、その中に、図３（ｇ）に示すように、ページ番号（Ｎ）と共に、このページ内の索引レコードの何れかを最後に確定したコミット処理を示すコミット番号（最終コミット番号）を格納する領域が存在する。また、ページ制御情報には、索引ページ中に存在する未確定索引レコード数が格納され、各アクセス処理に伴って更新されるものとする。
【００３６】
ページ制御情報の前方に順にレコード制御情報が格納されている。レコード制御情報は、ページ末尾の方向からの順序を索引レコード番号（ＩＲＮＯ（１，２，３，…））として識別される。レコード制御情報の領域には、図３（ｆ）に示すように、索引レコードのページ内開始オフセット（索引レコード開始オフセット）が格納されていて、索引レコードを参照可能である。索引ページ番号（ＩＰＮＯ）と索引レコード番号（ＩＲＮＯ）で索引レコードを一意に識別可能である。さらに、レコード制御情報の領域には、未確定（コミットされていない）索引レコードであることを識別する未確定フラグを格納するためのフラグ格納領域が存在する。本実施形態では、例えば「１」は追加アクセスの未確定、「２」は削除アクセスの未確定を表すものとする。なお、「０」は確定を表すものとする。
【００３７】
例えば、論理的に木構造を持つＢｔｒｅｅ索引を持つシステムでは、木構造の各ノードをページに対応させて索引ファイルへ格納する。図３（ｂ）には、論理的な索引構造の一例を示している。
【００３８】
木構造のリーフノードでは、索引レコードの内部に、図３（ｃ）に示すように、データレコードの一部が用いられたキー値と、そのキー値に対応するレコードデータへのポインタを格納する。レコードデータへのポインタは、図３（ｅ）に示すように、ページ番号（ＰＮＯ）とレコード番号（ＲＮＯ）との組で表される。
【００３９】
次に、本実施形態におけるデータベース管理システムの動作について説明する。
まず、追加アクセス処理について、図４に示すフローチャート、図５に示す追加アクセスの流れを示す図を参照しながら説明する。
【００４０】
アクセス処理部２０は、アプリケーション１２から追加アクセス要求があると、データ更新部２４により、データファイル３４内から追加レコードを格納可能なサイズの空き領域が存在するページを検索させ（ステップＡ１）、その該当ページに対してトランザクションロック管理部２２により、更新モードのトランザクションロックを確保する（ステップＡ２）（図５▲１▼）。
【００４１】
ここで、アクセス処理部２０は、データ更新部２４により、データファイル３４から検索された該当ページがバッファ３２に格納されているか検索し、バッファ３２に無ければデータファイル３４からロードする（ステップＡ４）。さらに、アクセス処理部２０は、データ更新部２４によりバッファ３２にロードされたページを、トランザクションローカルログバッファ４０へコピーする（ステップＡ５）（図５▲２▼）。
【００４２】
更新ログ生成部２８は、トランザクションローカルログバッファ４０上で、アプリケーション１２からの要求に応じた所望の追加レコードをページの空き領域へ追加すると共に、この追加レコードに対応するレコード制御情報（データサイズ、データ開始オフセット）を作成する。ここで、ページ番号（ＰＮＯ）、レコード番号（ＲＮＯ）が決定する（ステップＡ６）（図５▲３▼）。
【００４３】
次に、更新ログ生成部２８は、トランザクションローカルログバッファ４０上で作成された追加レコードに対応する索引レコードを格納すべき索引ページの索引ページ番号（ＩＰＮＯ）を計算して求め（ステップＡ７）、この索引ページ番号（ＩＰＮＯ）の索引ページをシステムグローバルログバッファ３８上で検索する（ステップＡ８）（図５▲４▼）。
【００４４】
ここで、システムグローバルログバッファ３８に該当索引ページが格納されていない場合（ステップＡ９、Ｎｏ）、アクセス処理部２０は、索引更新部２６により、該当索引ページを索引ファイル３６からバッファ３２にロードさせ、バッファ３２からシステムグローバルログバッファ３８へコピーする（ステップＡ１０）（図５▲５▼）。
【００４５】
更新ログ生成部２８は、システムグローバルログバッファ３８上で索引ページ番号（ＩＰＮＯ）の索引ページへ索引レコードを追加し、この索引レコードに対応するレコード制御情報を作成し（ステップＡ１１）、未確定フラグを「１」（追加未確定）に設定する（ステップＡ１２）（図５▲６▼）。また、更新ログ生成部２８は、索引ページのページ制御情報に未確定索引レコード数を更新して格納しておく。
【００４６】
例えば、追加レコードのデータ「ＡＢＣ」をトランザクションローカルログバッファ４０上で追加した場合、この追加したデータレコードに対応する索引レコードをシステムグローバルログバッファ３８上で追加する（例えば、索引レコード３）。ここで、索引レコード３のキー値は、例えば追加データレコードの先頭「Ａ」を用い（図３（ｄ））、レコードデータへのポインタは、ステップＡ６で決定されたページ番号（ＰＮＯ）、レコード番号（ＲＮＯ）を用いる（図３（ｅ））。また、この索引レコード３に対応するレコード３制御情報において、未確定フラグを「１」に設定して追加する（図３（ｆ））。
【００４７】
なお、トランザクション毎に、追加アクセス処理により更新した索引の「索引ページ番号（ＩＰＮＯ）、索引レコード番号（ＩＲＮＯ）」の組みを更新するたびにメモリ４４に記憶しておくものとする。この索引の「ＩＰＮＯ、ＩＲＮＯ」の組みのデータは、後述するトランザクション確定処理において、確定対象とする索引ページ（索引レコード）を判別する際に参照される。
【００４８】
こうして、トランザクションローカルログバッファ４０上で追加したレコードに対する索引レコードを、該当索引ページをロックをすることなくシステムグローバルログバッファ３８上で追加する。システムグローバルログバッファ３８では、レコード制御情報において、追加未確定を示す未確定フラグ「１」を設定しておくことで、後述するトランザクション確定処理によって確定させることができる。
【００４９】
次に、削除アクセス処理について、図６に示すフローチャート、図７に示す削除アクセスの流れを示す図を参照しながら説明する。
【００５０】
アクセス処理部２０は、アプリケーション１２から削除アクセス要求があると、データ更新部２４により、バッファ３２のみを使用して削除すべきレコード（削除レコード）を検索し（ステップＢ１）、該当するページ番号（ＰＮＯ）とレコード番号（ＲＮＯ）、及び索引ページ番号（ＩＰＮＯ）と索引レコード番号（ＩＲＮＯ）の対を決定する（ステップＢ２）。
【００５１】
なお、削除すべきレコードは、例えばユーザが別の処理によって検索しておき、その検索によって得られたレコードをアプリケーション１２を通じて指定されたり、ユーザによって明示的に指定された削除対象とするデータの索引（索引レコードに格納されるキー値）がアプリケーション１２を通じて指定されたりするなど何れの形態であっても良い。
【００５２】
トランザクションロック管理部２２は、データ更新部２４により決定されたページ番号（ＰＮＯ）に対して更新モードのトランザクションロックを確保する（ステップＢ３）（図７▲１▼）。
【００５３】
次に、アクセス処理部２０は、データ更新部２４により、ページ番号（ＰＮＯ）のデータページがバッファ３２に格納されているか検索し、バッファ３２に無ければデータファイル３４からロードして、バッファ３２からトランザクションローカルログバッファ４０へコピーする（ステップＢ４）（図７▲２▼）。
【００５４】
更新ログ生成部２８は、トランザクションローカルログバッファ４０上で、ページ番号（ＰＮＯ）のデータページからアプリケーション１２からの要求に応じた削除レコードを削除する（ステップＢ５）（図７▲３▼）。
【００５５】
次に、更新ログ生成部２８は、システムグローバルログバッファ３８上で索引ページ番号（ＩＰＮＯ）の索引ページを検索する（ステップＢ６）（図７▲４▼）。
【００５６】
ここで、システムグローバルログバッファ３８に該当索引ページが格納されていない場合（ステップＢ７、Ｎｏ）、アクセス処理部２０は、索引更新部２６により、該当索引ページを索引ファイル３６からバッファ３２にロードさせ、バッファ３２からシステムグローバルログバッファ３８へコピーする（ステップＢ８）（図７▲５▼）。
【００５７】
更新ログ生成部２８は、システムグローバルログバッファ３８上で索引ページ番号（ＩＰＮＯ）の索引ページのレコードについてレコード制御情報の未確定フラグを「２」（削除未確定）に設定する（ステップＢ９）（図７▲６▼）。また、更新ログ生成部２８は、索引ページのページ制御情報に未確定索引レコード数を更新して格納しておく。
【００５８】
なお、削除アクセス処理の場合についても、追加アクセス処理と同様に、トランザクション毎に、更新した索引の「索引ページ番号（ＩＰＮＯ）、索引レコード番号（ＩＲＮＯ）」の組みを更新するたびにメモリ４４に記憶しておくものとする。
【００５９】
こうして、トランザクションローカルログバッファ４０上でアプリケーション１２により指定されたレコードを削除し、この削除したレコードに対する索引レコードを該当索引ページをロックをすることなく、システムグローバルログバッファ３８上で削除未確定を示す未確定フラグ「２」を設定しておく。この時、バッファ３２上では削除レコードは削除されていない。これにより、後述するトランザクション確定処理によって、レコードの削除を索引レコードを索引ファイル３６中の索引ページに反映させることができる。
【００６０】
次に、更新アクセス処理について、図８に示すフローチャート、図９に示す更新アクセスの流れを示す図を参照しながら説明する。更新アクセスは、前述した追加アクセスと削除アクセスとを組み合わせた処理となる。
【００６１】
アクセス処理部２０は、アプリケーション１２から更新アクセス要求があると、データ更新部２４により、バッファ３２のみを使用して更新すべきレコード（更新レコード）を検索し（ステップＣ１）、該当するページ番号（ＰＮＯ）とレコード番号（ＲＮＯ）、及び索引ページ番号（ＩＰＮＯ）と索引レコード番号（ＩＲＮＯ）の対を決定する（ステップＣ２）。
【００６２】
なお、更新すべきレコードは、例えばユーザが別の処理によって検索しておき、その検索によって得られたレコードをアプリケーション１２を通じて指定されたり、ユーザによって明示的に指定された更新対象とするデータの索引（索引レコードに格納されるキー値）がアプリケーション１２を通じて指定されたりするなど何れの形態であっても良い。
【００６３】
トランザクションロック管理部２２は、データ更新部２４により決定されたページ番号（ＰＮＯ）に対して更新モードのトランザクションロックを確保する（ステップＣ３）（図９▲１▼）。
【００６４】
次に、アクセス処理部２０は、データ更新部２４により、ページ番号（ＰＮＯ）のデータページがバッファ３２に格納されているか検索し、バッファ３２に無ければデータファイル３４からロードして、バッファ３２からトランザクションローカルログバッファ４０へコピーする（ステップＣ４）（図９▲２▼）。
【００６５】
データ更新部２４は、トランザクションローカルログバッファ４０上で、ページ番号（ＰＮＯ）のデータページの更新前レコードデータを更新後レコードデータに更新する（ステップＣ５）。同時に更新前のレコード番号（ＲＮＯ）のレコードデータを無効化し、レコード番号（ＲＮＯ）とは別のレコード番号（ＲＮＯ＿Ｐ）を更新後のレコードデータのために確保して（ステップＣ６）、レコード番号（ＲＮＯ＿Ｐ）へ更新後レコードデータのレコード制御情報を作成する（ステップＣ７）（図９▲３▼）。例えば、図９では、更新前のレコードデータ「ＡＢＣ」を無効化して、レコードデータ「ＡＢＣ」とは別の場所に更新後のレコードデータ「ＤＥＦ」を追加する。
【００６６】
次に、更新ログ生成部２８は、更新前のレコードデータに対応する索引ページ番号（ＩＰＮＯ）の索引ページ、及び更新後レコードデータに対応したキーを格納すべき索引ページ（ＩＰＮＯ＿Ｐ）をシステムグローバルログバッファ３８上で検索する（ステップＣ８）（図９▲４▼）。
【００６７】
ここで、システムグローバルログバッファ３８に該当索引ページが格納されていない場合（ステップＣ９、Ｎｏ）、アクセス処理部２０は、索引更新部２６により、該当索引ページを索引ファイル３６からバッファ３２にロードさせ、バッファ３２からシステムグローバルログバッファ３８へコピーする（ステップＣ１０）（図９▲５▼）。
【００６８】
更新ログ生成部２８は、システムグローバルログバッファ３８上で、索引ページ番号（ＩＰＮＯ）の索引ページにおける、更新前のレコードデータに対応する索引レコード番号（ＩＲＮＯ）の索引レコードに対応するレコード制御情報に対して未確定フラグを「２」（削除未確定）に設定する（ステップＣ１１）。例えば、図９において、トランザクションローカルログバッファ４０上で削除されたデータレコード「ＡＢＣ」に対して、索引レコード（キー値「Ａ」）に対応するレコード制御情報に対して削除未確定を示す「２」に設定する。さらに、更新ログ生成部２８は、システムグローバルログバッファ３８上で、索引ページ番号（ＩＰＮＯ＿Ｐ）の索引ページにおける、更新後のレコードデータに対応する索引レコードを追加し、この索引レコードに対応するレコード制御情報を作成する（ステップＣ１２）。この時、レコード制御情報に対して、未確定フラグを「１」（追加未確定）に設定する（ステップＣ１３）。例えば、図９において、トランザクションローカルログバッファ４０上で追加されたデータレコード「ＤＥＦ」に対して、索引レコード（キー値「Ｄ」）に対応するレコード制御情報に対して追加未確定を示す「１」に設定する（図９▲６▼）。また、更新ログ生成部２８は、索引ページのページ制御情報に未確定索引レコード数を更新して格納しておく。
【００６９】
なお、更新アクセス処理の場合についても、追加アクセス処理と同様に、トランザクション毎に、更新した索引の「索引ページ番号（ＩＰＮＯ）、索引レコード番号（ＩＲＮＯ）」の組みを更新するたびにメモリ４４に記憶しておくものとする。
【００７０】
こうして、更新アクセス処理において、トランザクションローカルログバッファ４０上で追加、削除したレコードに対する索引レコードを、該当索引ページをロックをすることなくシステムグローバルログバッファ３８上で追加、削除する。システムグローバルログバッファ３８では、追加したレコードデータに対応するレコード制御情報において追加未確定を示す未確定フラグ「１」を設定し、削除したレコードデータに対応するレコード制御情報において削除未確定を示す未確定フラグ「２」を設定しておくことで、後述するトランザクション確定処理によって確定させることができる。
【００７１】
次に、トランザクション確定処理について、図１０に示すフローチャート、図１１に示すトランザクション確定処理の流れを示す図を参照しながら説明する。
【００７２】
まず、アクセス処理部２０は、アプリケーション１２からトランザクション確定処理（コミット処理）の実行要求があると、更新ログ生成部２８により、システムグローバルログバッファ３８上に存在する今回確定する索引ページのページ制御情報の最終コミット番号に現在のシステムコミット番号を記録する（ステップＤ１）。
【００７３】
なお、図示していないが、データベース管理システムが起動される場合に、システム動作を制御するための各種制御情報がデータファイル３４などから読み出されてメモリ４４に格納される。この時に格納される制御情報には、データファイル３４のファイルヘッダに含まれるシステムコミット番号（図２（ａ））が含まれている。トランザクション管理システム１０は、システム起動時に、システム内に１つ存在するコミットカウンタに、データファイル３４から読み出したシステムコミット番号を初期値としてセットし、トランザクション確定処理を実行するたびにカウンタ更新を実行する。
【００７４】
トランザクション確定処理では、コミットカウンタによりカウントされたシステムコミット番号を、システムグローバルログバッファ３８上の索引ページに最終コミット番号として格納する。
【００７５】
さらに更新ログ生成部２８は、今回確定する索引レコードのレコード制御情報の未確定フラグを「０」（確定）へ更新する（ステップＤ２）（図１１▲１▼）。
【００７６】
なお、何れの索引ページ及び索引レコードを確定させるかは、各アクセス処理（追加、削除、更新）の際に、トランザクション毎に格納された、更新された索引の「索引ページ番号（ＩＰＮＯ）、索引レコード番号（ＩＲＮＯ）」の組みを参照することで判別するものとする。
【００７７】
更新ログ生成部２８は、確定するトランザクションに対応したトランザクションローカルログバッファ４０上のデータページを全てログファイル４２へ記録する（ステップＤ３）（図１１▲２▼）。また、更新ログ生成部２８は、システムグローバルログバッファ３８上の索引ページのうち、今回確定する索引ページをログファイル４２に記録する（ステップＤ４）（図１１▲３▼）。
【００７８】
また、更新ログ生成部２８は、ログファイル４２へコミット番号を記録する（ステップＤ５）（図１１▲４▼）。
【００７９】
アクセス処理部２０は、更新ログ生成部２８により、トランザクションローカルログバッファ４０上のデータページを読み出して、データ更新部２４を通じて全てバッファ３２へ転送する。既に同じページ番号（ＰＮＯ）のページが存在する場合は上書きする（ステップＤ６）（図１１▲５▼）。同時に更新ログ生成部２８は、トランザクションローカルログバッファ４０上のデータページを全て無効化する（ステップＤ７）。
【００８０】
また、アクセス処理部２０は、更新ログ生成部２８により、システムグローバルログバッファ３８から今回確定した索引ページを読み出して、索引更新部２６を通じてバッファ３２へ転送する。既に同じ索引ページ番号（ＩＰＮＯ）のページが存在する場合は上書きする（ステップＤ８）（図１１▲６▼）。同時に更新ログ生成部２８は、今回確定したシステムグローバルログバッファ３８上の索引ページを無効化する（ステップＤ９）。
【００８１】
ここで、トランザクションロック管理部２２は、今回確定したトランザクションに属するトランザクションロックを全て開放する（ステップＤ１０）（図１１▲７▼）。
【００８２】
トランザクション管理システム１０は、ステップＤ６においてシステムグローバルログバッファ３８からバッファ３２に転送されたデータページ、及びステップＤ８においてトランザクションローカルログバッファ４０からバッファ３２に転送された索引ページを、それぞれデータファイル３４も索引ファイル３６へ書き込むように、データ書き込みタスクへ登録する（ステップＤ１１）（図１１▲８▼）。
【００８３】
また、トランザクション管理システム１０は、トランザクション確定処理実行時のコミットカウンタの値（システムコミット番号）を、データファイル３４のファイルヘッダに保存しておく。システムコミット番号は、前述したようにシステム起動時に読み出され、それ以降、トランザクション確定処理が実行されるたびに更新されると共に、システムグローバルログバッファ３８上で確定対象とする索引ページに書き込まれる。索引ページに保存されたシステムコミット番号（最終コミット番号）は、後述するシステムダウン後のリカバリ処理の際に参照される。
【００８４】
こうして、トランザクション確定処理では、アプリケーション１２から要求されたアクセス処理（追加、削除、更新）によってシステムグローバルログバッファ３８に格納された未確定状態にある索引レコードを、索引ファイル３６に対して反映させることができる。
【００８５】
次に、前述した各アクセス処理（追加、削除、更新）の対象となったデータレコードに対する、自トランザクションと他トランザクションのそれぞれによるアクセス処理に伴う更新の参照について説明する。
【００８６】
自トランザクションによるアクセス処理では、自トランザクションにより更新されたレコードが参照され、他トランザクションにより更新されたレコードが参照さない（処理前のレコードが参照される）ようにすることで、トランザクションの独立性が実現される。
【００８７】
図１２は、自トランザクションの更新の参照の流れを示している。
図１２（ａ）は、自トランザクションの追加レコードの参照を説明する図である。
トランザクション管理システム１０は、システムグローバルログバッファ３８を検索して、参照対象とするデータレコードに対応する索引ページ中の索引レコードを参照し、ページ番号（ＰＮＯ）とレコード番号（ＲＮＯ）を得る（図１２（ａ）▲１▼）。図１２（ａ）では、キー値「Ａ」の索引レコードが参照されている。このとき未確定フラグは意識しない（追加未確定「１」となっている）。
【００８８】
トランザクション管理システム１０は、ページ番号（ＰＮＯ）、レコード番号（ＲＮＯ）をもとに、自トランザクションに対応するトランザクションローカルログバッファ４０を検索して、自トランザクションが追加したレコード（追加レコードのデータ「ＡＢＣ」）を得る（図１２（ａ）▲２▼）。
【００８９】
図１２（ｂ）は、自トランザクションの削除レコードの参照を説明する図である。
トランザクション管理システム１０は、システムグローバルログバッファ３８を検索して、参照対象とするデータレコードに対応する索引ページ中の索引レコードを参照し、ページ番号（ＰＮＯ）とレコード番号（ＲＮＯ）を得る（図１２（ｂ）▲１▼）。図１２（ｂ）では、キー値「Ａ」の索引レコードが参照されている。このとき未確定フラグは意識しない（削除未確定「２」となっている）。
【００９０】
トランザクション管理システム１０は、ページ番号（ＰＮＯ）、レコード番号（ＲＮＯ）をもとに、自トランザクションに対応するトランザクションローカルログバッファ４０を検索する。すると、無効化されたレコード制御情報を参照することになり、無効化されたデータレコードであることを検出することができる（図１２（ｂ）▲２▼）。
【００９１】
図１２（ｃ）は、自トランザクションの更新レコードの参照を説明する図である。
トランザクション管理システム１０は、更新前キー（キー値「Ａ」）でシステムグローバルログバッファ３８を検索した場合は、前述した自トランザクションの削除レコードの参照（図１２（ｂ））と同様の手順で無効化されたレコードであることを検出する（図１２（ｃ）▲１▼▲２▼）。
【００９２】
また、更新後キー（キー値「Ｄ」）でシステムグローバルログバッファ３８を検索した場合は、前述した自トランザクションの追加レコードの参照（図１２（ａ）と同様の手順で更新後レコード（追加レコードのデータ「ＤＥＦ」）を検出する（図１２（ｃ）▲１▼▲２▼）。
【００９３】
図１３は、他トランザクションの更新の参照の流れを示している。
図１３（ａ）は、他トランザクションの追加レコードの参照を説明する図である。
トランザクション管理システム１０は、システムグローバルログバッファ３８を検索して、参照対象とするデータレコードに対応する索引ページ中の索引レコードを参照し、ページ番号（ＰＮＯ）とレコード番号（ＲＮＯ）を得る（図１３（ａ）▲１▼）。図１３（ａ）では、キー値「Ａ」の索引レコードが参照されている。このとき未確定フラグは意識しない（追加未確定「１」となっている）。
【００９４】
ここで、ページ番号（ＰＮＯ）をもとに自トランザクションに対応するトランザクションローカルログバッファ４０上で追加レコードを検索するが、これはヒットしない（図１３（ａ）▲２▼）。つまり、データページへのトランザクションロックによって排他されているため、他トランザクションの更新中のページが自トランザクションのトランザクションローカルログバッファ４０に存在することは無い。
【００９５】
トランザクション管理システム１０は、参照対象とするデータレコードがトランザクションローカルログバッファ４０に存在しないので、バッファ３２を検索してページ番号（ＰＮＯ）に対応するデータページを得る（図１３（ａ）▲３▼）。ページ番号（ＰＮＯ）のページの中のレコード番号（ＲＮＯ）が示すデータレコードは空き領域として管理されている状態（だから他トランザクションが追加可能だった）なので、無効レコードであることを検出することができる（他トランザクションによる追加前の状態）。
【００９６】
図１３（ｂ）は、他トランザクションの削除レコードの参照を説明する図である。
トランザクション管理システム１０は、システムグローバルログバッファ３８を検索して、参照対象とするデータレコードに対応する索引ページ中の索引レコードを参照し、ページ番号（ＰＮＯ）とレコード番号（ＲＮＯ）を得る。（図１３（ｂ）▲１▼）。図１３（ｂ）では、キー値「Ａ」の索引レコードが参照されている。このとき未確定フラグは意識しない（削除未確定「２」となっている）。
【００９７】
ここで、ページ番号（ＰＮＯ）をもとに°トランザクションに対応するトランザクションローカルログバッファ４０上でデータレコードを検索するが、前述と同じ理由でこれはヒットしない（図１３（ｂ）▲２▼）。
【００９８】
トランザクション管理システム１０は、参照対象とするデータレコードがトランザクションローカルログバッファ４０に存在しないので、バッファ３２を検索してページ番号（ＰＮＯ）に対応するデータページを得る（図１３（ｂ）▲３▼）。ページ番号（ＰＮＯ）のページの中のレコード番号（ＲＮＯ）が示すデータレコードは、削除前の状態なので、削除前レコードを有効レコードとして得ることができる。すなわち他のトランザクションによるアクセス処理によって削除未確定となっているデータレコードを参照することができる。
【００９９】
図１３（ｃ）は、他トランザクションの更新レコードの参照を説明する図である。
トランザクション管理システム１０は、更新前キー（キー値「Ａ」）でシステムグローバルログバッファ３８を検索した場合は（図１３（ｃ）▲１▼）、前述した他トランザクションの削除レコードの参照（図１３（ｂ））と同様の手順で更新前レコード（「ＡＢＣ」）を得る（図１３（ｃ）▲２▼▲３▼）。
【０１００】
また、更新後キー（キー値「Ｄ」）でシステムグローバルログバッファ３８を検索した場合は（図１３（ｃ）▲１▼）、前述した他トランザクションの追加レコードの参照（図１３（ａ））と同様の手順で無効レコードであることを検出する（図１３（ｃ）▲２▼▲３▼）。
【０１０１】
こうして、自トランザクションの更新したデータについては更新後のデータを参照でき、他トランザクションが更新したデータについては、トランザクション確定処理が実行されていなければ、更新前のデータを参照することができる。これにより、一貫性をもったデータの参照が実現され、トランザクションの独立性を実現することができる。
【０１０２】
次に、システムダウン後のリカバリ処理について、図１４に示すフローチャート、及び図１５に示すリカバリ処理の流れを示す図を参照しながら説明する。
【０１０３】
システムが何らかの障害等によりダウンした後、システム起動されると、トランザクション管理システム１０は、ログファイル４２に格納されたログをデータファイル３４及び索引ファイルに適用する（図１５▲１▼）。この状態ではシステムダウン時に処理中であったトランザクションによる未確定状態の索引レコードが索引ページ中に混在している場合がある。未確定状態の索引レコードは、実際には確定されていないので削除する必要がある。
【０１０４】
また、トランザクション管理システム１０は、システム起動時にはログからシステム停止時のコミット番号を得る（ステップＥ１）。
【０１０５】
アプリケーション１２が起動され、任意のアクセスを処理中に索引ページのバッファ３２へのミスヒットが発生した場合（ステップＥ２）、索引ファイル３６から索引ページをバッファ３２へロードする過程で、索引ページ内のページ制御情報の最終コミット番号を起動時にメモリに保存したシステム起動時のコミット番号と比較する（ステップＥ３，Ｅ４）（図１５▲２▼）。
【０１０６】
ここで、システム起動時のコミット番号の方が新しい場合（ステップＥ５、Ｙｅｓ）、トランザクション管理システム１０は、索引ページのページ制御情報に記録された未確定索引レコード数を確認し（ステップＥ６）、未確定索引レコードが存在するようであれば（ステップＥ７、Ｙｅｓ）、索引ページ内の全てのレコード制御情報を参照して、未確定フラグが「０」（確定）でないレコード制御情報と対応する索引レコードを無効化する（ステップＥ８）（図１５▲３▼）。
【０１０７】
これらの処理を行った上でバッファ３２上の索引ページを有効とする（ステップＥ９）。
【０１０８】
このようにして、システムダウン後のリカバリ処理では、索引ページ参照において索引レコード参照に先立ってシステム内のコミットカウンタとページ内のコミットカウンタ（最終コミット番号）を比較して、ページ内のコミットカウンタの方が小さいことにより、この索引ページへのシステム起動後最初のアクセスであることを識別し、その索引ページ内の未確定索引を全て削除することで索引のダウンリカバリをするので、トランザクションの永続性を実現することができる。
【０１０９】
なお、前述したリカバリ処理では、索引ファイル３６からバッファ３２に索引ページをロードする際に、この索引ページについてシステム起動後最初のアクセスと判断された場合に、この索引ページに対して未確定索引レコードの無効化をしているが、システム起動時に、ログファイル４２のログを索引ファイル３６に適用する際に全ての索引ページについて一括して未確定索引レコードの無効化を実行しても良い。この場合、システム起動時に多くの処理負担がかかるが、各索引ページのシステム起動後最初のアクセスの際の処理負担を軽減することができる。
【０１１０】
このようにして、本実施形態におけるデータベース管理システムでは、索引ファイル３６に対してトランザクションロックを取得することなく、索引のレコードの有効性をアクセスのたびにログ（システムグローバルログバッファ３８、トランザクションローカルログバッファ４０）上で判断することによって、図１２及び図１３を用いて説明したトランザクションの独立性、及び図１５に示すようなトランザクションの永続性を実現することができる。索引ファイル３６に対してトランザクションロックをしないことで、索引ページに対する競合やデッドロックを排除することができるので、システムのスループット劣化を回避する事ができる。
【０１１１】
なお、本実施形態では、トランザクションの永続性を実現するリカバリ方法として、ロギング方式などの他、何れの方式を問わずに適用することが可能である。
【０１１２】
また、本実施形態では、索引ファイル３６の索引ページが図３（ｂ）に示す論理的な索引構造を持つとして説明しているが、索引種別について、ツリー形式、ビットマップ形式などの他、何れの索引種別を問わずに適用することが可能である。
【０１１３】
また、上述した実施形態において記載した手法は、コンピュータに実行させることのできるプログラムとして、例えば磁気ディスク（フレキシブルディスク、ハードディスク等）、光ディスク（ＣＤ−ＲＯＭ、ＤＶＤ等）、半導体メモリなどの記録媒体に書き込んで各種装置に提供することができる。また、通信媒体により伝送して各種装置に提供することも可能である。本装置を実現するコンピュータは、記録媒体に記録されたプログラムを読み込み、または通信媒体を介してプログラムを受信し、このプログラムによって動作が制御されることにより、上述した処理を実行する。
【０１１４】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【０１１５】
【発明の効果】
以上詳述したように本発明によれば、索引アクセスにおいてはトランザクションロックを用いることなくトランザクションの独立性を実現することにより、競合やデッドロックを排除し、良好なシステムのスループットを実現することが可能となるものである。
【図面の簡単な説明】
【図１】本実施形態に係わるデータベース管理システムのシステム構成を示すブロック図。
【図２】データファイル３４へのデータの格納形式の一例を示す図。
【図３】索引ファイル３６への索引の格納形式の一例を示す図。
【図４】本実施形態における追加アクセス処理について説明するためのフローチャート。
【図５】本実施形態における追加アクセス処理の流れを示す図。
【図６】本実施形態における削除アクセス処理について説明するためのフローチャート。
【図７】本実施形態における削除アクセス処理の流れを示す図。
【図８】本実施形態における更新アクセス処理について説明するためのフローチャート。
【図９】本実施形態における更新アクセス処理の流れを示す図。
【図１０】本実施形態におけるトランザクション確定処理について説明するためのフローチャート。
【図１１】本実施形態におけるトランザクション確定処理の流れを示す図。
【図１２】自トランザクションの更新の参照の流れを示す図。
【図１３】他トランザクションの更新の参照の流れを示す図。
【図１４】本実施形態におけるシステムダウン後のリカバリ処理について説明するためのフローチャート。
【図１５】本実施形態におけるリカバリ処理の流れを示す図。
【符号の説明】
１０…トランザクション管理システム、１２…アプリケーション、２０…アクセス処理部、２２…トランザクションロック管理部、２４…データ更新部、２６…索引更新部、２８…更新ログ生成部、３０…トランザクション確定部、３２…バッファ、３４…データファイル、３６…索引ファイル、３８…システムグローバルログバッファ、４０…トランザクションローカルログバッファ、４２…ログファイル。
【図１】
2004341926.tif 000003
【図２】
2004341926.tif 000004
【図３】
2004341926.tif 000005
【図４】
2004341926.tif 000006
【図５】
2004341926.tif 000007
【図６】
2004341926.tif 000008
【図７】
2004341926.tif 000009
【図８】
2004341926.tif 000010
【図９】
2004341926.tif 000011
【図１０】
2004341926.tif 000012
【図１１】
2004341926.tif 000013
【図１２】
2004341926.tif 000014
【図１３】
2004341926.tif 000015
【図１４】
2004341926.tif 000016
【図１５】
2004341926.tif 000017