(57)【要約】【課題】データベースにおいて特定のデータ項目の統計値の応答を高速化する。【解決手段】記憶部１１は、データ項目１３ａ，１３ｂを含むレコードを記憶するデータベース１３に対して、データ項目１３ａに使用され得る候補値に対応付けて、当該候補値を含む２以上のレコードを示すレコード特定情報１４ａと、当該２以上のレコードに含まれるデータ項目１３ｂの値の統計値１４ｂと、を含むインデックス１４を記憶する。処理部１２は、データ項目１３ａの値の条件を示す検索条件と、検索条件に該当するレコードのデータ項目１３ｂの値の統計処理を要求するコマンドとを含むクエリ１５を受け付け、インデックス１４から検索条件に該当する候補値に対応付けられた統計値１４ｂを読み出し、読み出した統計値１４ｂを用いてクエリ１５に対する処理結果１６を出力する。【選択図】図１
2020123181.tif 000002
【特許請求の範囲】
【請求項１】
それぞれが第１のデータ項目および第２のデータ項目を含む複数のレコードを記憶するデータベースに対して、前記第１のデータ項目に使用され得る複数の候補値それぞれに対応付けて、前記第１のデータ項目に当該候補値を含む２以上のレコードを示すレコード特定情報と、前記レコード特定情報が示す前記２以上のレコードに含まれる前記第２のデータ項目の値の統計値と、を含むインデックスを記憶する記憶部と、
前記第１のデータ項目の値の条件を示す検索条件と、前記検索条件に該当するレコードの前記第２のデータ項目の値の統計処理を要求するコマンドとを含むクエリを受け付け、前記インデックスから前記検索条件に該当する候補値に対応付けられた前記統計値を読み出し、読み出した前記統計値を用いて前記クエリに対する処理結果を出力する処理部と、
を有する情報処理装置。
【請求項２】
前記インデックスは、前記複数の候補値に対応する複数のノードを含み、前記複数のノードが木構造に接続されたツリー型インデックスであり、
前記複数のノードそれぞれが、前記レコード特定情報と前記統計値とを含む、
請求項１記載の情報処理装置。
【請求項３】
前記統計値は、前記レコード特定情報が示す前記２以上のレコードに含まれる前記第２のデータ項目の値の合計、最大値、最小値または平均である、
請求項１記載の情報処理装置。
【請求項４】
前記第１のデータ項目は、商品の注文の値段を表し、前記第２のデータ項目は、前記商品の注文の数量を表し、前記クエリは、前記値段が特定の範囲内にあるレコードに含まれる前記数量を合計することを要求する、
請求項１記載の情報処理装置。
【請求項５】
コンピュータに、
それぞれが第１のデータ項目および第２のデータ項目を含む複数のレコードを記憶するデータベースに対して、前記第１のデータ項目の値の条件を示す検索条件と、前記検索条件に該当するレコードの前記第２のデータ項目の値の統計処理を要求するコマンドとを含むクエリを受け付け、
前記第１のデータ項目に使用され得る複数の候補値それぞれに対応付けて、前記第１のデータ項目に当該候補値を含む２以上のレコードを示すレコード特定情報と、前記レコード特定情報が示す前記２以上のレコードに含まれる前記第２のデータ項目の値の統計値と、を含むインデックスから、前記検索条件に該当する候補値に対応付けられた前記統計値を読み出し、
読み出した前記統計値を用いて前記クエリに対する処理結果を出力する、
処理を実行させるデータベース検索プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置およびデータベース検索プログラムに関する。
【背景技術】
【０００２】
情報処理システムの１つとして、ＳＱＬなどのクエリ言語で記述された問い合わせ文（クエリ）を受け付け、受け付けたクエリに基づいて、データを体系的に格納したデータベースにアクセスするデータベースシステムがある。クエリは、特定の条件に該当するレコードをデータベースから読み出す検索クエリであることがある。また、クエリは、ＳＵＭ，ＭＡＸ，ＭＩＮ，ＡＶＧなどの集合関数を用いて、複数のレコードから、合計、最大値、最小値、平均などの統計値を算出することを要求することがある。また、データベースシステムは、特定の条件に該当するレコードを高速に検索できるように、主キー以外のデータ項目の値からレコードを参照できるインデックスを保持することがある。
【０００３】
なお、ある移動軌跡データと類似する他の移動軌跡データを検索する移動軌跡データ検索装置が提案されている。提案の移動軌跡データ検索装置は、データベースに蓄積された移動軌跡データそれぞれについて、その移動軌跡データに含まれる複数の位置座標を平均化した平均を算出し、平均のインデックスを生成する。移動軌跡データ検索装置は、入力された移動軌跡データについて算出した平均とデータベースがもつ上記インデックスとを照合して、入力された移動軌跡データに類似する他の移動軌跡データを絞り込む。
【０００４】
また、合計関数などの集合関数のコマンドを含むクエリを実行するデータベースサーバが提案されている。提案のデータベースサーバは、クエリを受信すると、テーブルを分割して保持する複数のデータノードに対して、特定の値をもつレコードの出現数を問い合わせる。データベースサーバは、複数のデータノードから回答された出現数とクエリで指定された集合関数とに基づいて、クエリに対する処理結果を生成する。
【０００５】
また、関係データベースのクエリに基づいて非関係データベースにアクセスする分析システムが提案されている。提案の分析システムは、非関係データベースからオブジェクトを読み出し、読み出したオブジェクトのスキーマを推定する。分析システムは、読み出したオブジェクトを配列インデックスに格納し、配列インデックスに基づいて、関係データベースのクエリに対する処理結果を生成して応答する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００４−１１８２９０号公報
【特許文献２】特開２０１２−１０８６３５号公報
【特許文献３】特開２０１７−１５７２２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
データベースシステムは、特定の検索条件に該当する複数のレコードを集計して、特定のデータ項目の値の合計、最大値、最小値、平均などの統計値を算出したいことがある。しかし、このような検索処理を単純に行おうとすると、インデックスから検索条件に該当する複数のレコードそれぞれに実際にアクセスし、各レコードに含まれる特定のデータ項目の値を読み出すことになる。１つの統計値を算出する毎にこのような検索処理を行うと、データベースシステムの負荷が高くなり応答時間が長くなるという問題がある。
【０００８】
１つの側面では、本発明は、特定のデータ項目の統計値の応答を高速化できる情報処理装置およびデータベース検索プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
１つの態様では、記憶部と処理部とを有する情報処理装置が提供される。記憶部は、それぞれが第１のデータ項目および第２のデータ項目を含む複数のレコードを記憶するデータベースに対して、第１のデータ項目に使用され得る複数の候補値それぞれに対応付けて、第１のデータ項目に当該候補値を含む２以上のレコードを示すレコード特定情報と、レコード特定情報が示す２以上のレコードに含まれる第２のデータ項目の値の統計値と、を含むインデックスを記憶する。処理部は、第１のデータ項目の値の条件を示す検索条件と、検索条件に該当するレコードの第２のデータ項目の値の統計処理を要求するコマンドとを含むクエリを受け付け、インデックスから検索条件に該当する候補値に対応付けられた統計値を読み出し、読み出した統計値を用いてクエリに対する処理結果を出力する。
【００１０】
また、１つの態様では、データベース検索プログラムが提供される。
【発明の効果】
【００１１】
１つの側面では、特定のデータ項目の統計値の応答を高速化できる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態の情報処理装置の例を説明する図である。
【図２】第２の実施の形態の情報処理システムの例を示す図である。
【図３】サーバ装置のハードウェア例を示すブロック図である。
【図４】サーバ装置の機能例を示すブロック図である。
【図５】注文メッセージの例を示す図である。
【図６】板情報の例を示す図である。
【図７】売注文表の例を示す図である。
【図８】買注文表の例を示す図である。
【図９】インデックスのデータ構造例を示す図である。
【図１０】売注文表の売値インデックスの例を示す図である。
【図１１】買注文表の買値インデックスの例を示す図である。
【図１２】テーブル定義ファイルの例を示す図である。
【図１３】売注文に対する第１のクエリ実行例を示す図である。
【図１４】売注文に対する第２のクエリ実行例を示す図である。
【図１５】売注文に対する第２のクエリ実行例を示す図（続き）である。
【図１６】買注文に対する第１のクエリ実行例を示す図である。
【図１７】買注文に対する第２のクエリ実行例を示す図である。
【図１８】買注文に対する第２のクエリ実行例を示す図（続き）である。
【図１９】データベース起動の手順例を示すフローチャートである。
【図２０】注文処理の手順例を示すフローチャートである。
【図２１】注文処理の手順例を示すフローチャート（続き１）である。
【図２２】注文処理の手順例を示すフローチャート（続き２）である。
【図２３】注文処理の手順例を示すフローチャート（続き３）である。
【図２４】注文処理の手順例を示すフローチャート（続き４）である。
【発明を実施するための形態】
【００１３】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
第１の実施の形態を説明する。
【００１４】
図１は、第１の実施の形態の情報処理装置の例を説明する図である。
第１の実施の形態の情報処理装置１０は、クエリに応じてデータベース検索を行うコンピュータである。情報処理装置１０は、ユーザが操作するクライアント装置でもよいし、クライアント装置または他のサーバ装置から利用されるサーバ装置でもよい。
【００１５】
情報処理装置１０は、記憶部１１および処理部１２を有する。記憶部１１は、ＲＡＭ（Random Access Memory）などの揮発性の半導体メモリでもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性のストレージでもよい。処理部１２は、例えば、ＣＰＵ（Central Processing Unit）、ＧＰＵ（Graphics Processing Unit）、ＤＳＰ（Digital Signal Processor）などのプロセッサである。ただし、処理部１２は、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途の電子回路を含んでもよい。プロセッサは、ＲＡＭなどのメモリ（記憶部１１でもよい）に記憶されたプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【００１６】
記憶部１１は、データベース１３に対応するインデックス１４を記憶する。
データベース１３は、それぞれがデータ項目１３ａ（第１のデータ項目）およびデータ項目１３ｂ（第２のデータ項目）を含む複数のレコードを記憶する。例えば、データベース１３は関係データベースであり、データ項目１３ａ，１３ｂはテーブルのカラムであり、レコードはテーブルのタプル（行方向に並んだ一組のデータ）である。データ項目１３ａ，１３ｂは、主キーではないデータ項目でもよい。一例として、レコードは商品の注文を表し、データ項目１３ａは値段を表し、データ項目１３ｂは数量を表す。
【００１７】
インデックス１４は、データ項目１３ａに使用され得る複数の候補値それぞれに対応付けて、レコード特定情報１４ａおよび統計値１４ｂを記憶する。インデックス１４は、複数の候補値に対応する複数のノードを含み、それら複数のノードが木構造に接続されたツリー型インデックスであってもよい。例えば、インデックス１４はＢ−ｔｒｅｅでもよい。その場合、各ノードにレコード特定情報１４ａおよび統計値１４ｂが登録される。
【００１８】
レコード特定情報１４ａは、データベース１３に記憶された複数のレコードのうち、データ項目１３ａに当該候補値を含む２以上のレコードを示す。レコード特定情報１４ａは、該当するレコードのアドレスを列挙したものであってもよい。統計値１４ｂは、レコード特定情報１４ａが示す２以上のレコードに含まれるデータ項目１３ｂの値を統計処理して算出される数値である。統計値１４ｂは、例えば、２以上のレコードに含まれるデータ項目１３ｂの値の合計、最大値、最小値、平均などである。インデックス１４に、候補値毎に２種類以上の統計値が登録されてもよい。
【００１９】
一例として、データベース１３の１番目のレコードは、データ項目１３ａ＝８５００、データ項目１３ｂ＝１００を含む。２番目のレコードは、データ項目１３ａ＝８６００、データ項目１３ｂ＝２００を含む。３番目のレコードは、データ項目１３ａ＝８５００、データ項目１３ｂ＝３００を含む。４番目のレコードは、データ項目１３ａ＝８６００、データ項目１３ｂ＝４００を含む。その場合、インデックス１４は、データ項目１３ａ＝８５００に対応付けて、レコード特定情報１４ａ＝｛＃１，＃３｝と、統計値１４ｂ＝４００を含む。また、インデックス１４は、データ項目１３ａ＝８６００に対応付けて、レコード特定情報１４ａ＝｛＃２，＃４｝と、統計値１４ｂ＝６００を含む。なお、この例では、統計値１４ｂはデータ項目１３ｂの値の合計である。
【００２０】
処理部１２は、データベース１３に対するクエリ１５を受け付ける。クエリ１５は、情報処理装置１０で実行されるアプリケーションソフトウェアが発行したものであってもよいし、他の情報処理装置から受信されたものであってもよい。また、クエリ１５は、ＳＱＬなどのクエリ言語で記述された文字列であってもよい。
【００２１】
クエリ１５は、データ項目１３ａの値の条件を示す検索条件を含む。検索条件は、データ項目１３ａの値が特定の値であることであってもよいし、データ項目１３ａの値が特定の範囲に属することであってもよい。また、クエリ１５は、検索条件に該当するレコードのデータ項目１３ｂの値の統計処理を要求するコマンドを含む。コマンドは、合計関数ＳＵＭ、最大値関数ＭＡＸ、最小値関数ＭＩＮ、平均関数ＡＶＧなどの集合関数を使用してもよい。一例として、クエリ１５は、データ項目１３ａ＝８５００であることを検索条件とし、検索条件に該当するレコードのデータ項目１３ｂの値の合計を要求する。クエリ１５は、特定の値段をもつレコードに含まれる数量の合計を要求するものであってもよい。
【００２２】
処理部１２は、クエリ１５に応答して、インデックス１４から検索条件に該当する候補値を検索し、その候補値に対応付けられた統計値１４ｂを読み出す。このとき、処理部１２は、その候補値に対応付けられたレコード特定情報１４ａから個々のレコードにアクセスしなくてよい。処理部１２は、読み出した統計値１４ｂを用いて、クエリ１５に対する処理結果１６を出力する。処理結果１６は、クエリ１５が要求する統計処理の結果を含む。処理結果１６は、インデックス１４から読み出された統計値１４ｂそのものを含んでもよいし、インデックス１４から読み出された２以上の統計値１４ｂから算出される数値（例えば、２以上の統計値１４ｂの合計）を含んでもよい。一例として、処理部１２は、データ項目１３ａ＝８５００に対応付けられた統計値１４ｂ＝４００をインデックス１４から読み出し、読み出した統計値１４ｂ＝４００を含む処理結果１６を出力する。
【００２３】
第１の実施の形態の情報処理装置１０によれば、データ項目１３ａに使用され得る候補値を含む２以上のレコードを示すレコード特定情報１４ａと、それら２以上のレコードに含まれるデータ項目１３ｂの値の統計値１４ｂとを含むインデックス１４が用意される。データ項目１３ａの値の条件を示す検索条件と、検索条件に該当するレコードのデータ項目１３ｂの値の統計処理を要求するコマンドとを含むクエリ１５が受信される。すると、インデックス１４から、検索条件に該当する候補値に対応付けられた統計値１４ｂが読み出される。そして、読み出された統計値１４ｂを用いてクエリ１５に対する処理結果１６が出力される。これにより、インデックス１４を使用すれば、検索条件に該当する個々のレコードにアクセスしてデータ項目１３ｂの値を読み出さなくてもよく、統計処理を要求するクエリ１５に対して処理結果１６を効率的に生成することができる。よって、情報処理装置１０の負荷を低減し、クエリ１５に対する応答を高速化できる。
【００２４】
［第２の実施の形態］
次に、第２の実施の形態を説明する。
図２は、第２の実施の形態の情報処理システムの例を示す図である。
【００２５】
第２の実施の形態の情報処理システムは、株式の売買を仲介する証券取引システムである。この情報処理システムは、サーバ装置１００、仲介装置２１０，２２０を含む複数の仲介装置、および、クライアント装置２３０，２４０を含む複数のクライアント装置を有する。これらの装置は、インターネットなどの広域データ通信ネットワークに接続され、広域データ通信ネットワークを介して相互に通信する。なお、サーバ装置１００は、第１の実施の形態の情報処理装置１０に対応する。
【００２６】
サーバ装置１００は、証券取引所３１が有するサーバコンピュータである。サーバ装置１００は、仲介装置２１０，２２０などの仲介装置から、売注文または買注文を示す注文メッセージを受信する。サーバ装置１００は、売注文と買注文との間のマッチングを行い、希望の条件を満たすような売注文と買注文のペアを検出して約定を成立させる。すなわち、サーバ装置１００は、売注文の注文主と買注文の注文主との間で株式売買契約を成立させる。サーバ装置１００は、約定が成立した売注文および買注文について、注文メッセージの送信元の仲介装置に対して約定通知メッセージを送信する。
【００２７】
仲介装置２１０は、証券会社３２が有するサーバコンピュータである。仲介装置２２０は、証券会社３３が有するサーバコンピュータである。証券会社３２，３３などの証券会社は、個人投資家や機関投資家などの投資家を代理して、証券取引所３１での株式売買を実行する。仲介装置２１０，２２０などの仲介装置は、証券取引所３１が有するサーバ装置１００に対してはクライアントとして動作し、投資家が使用するクライアント装置２３０，２４０などのクライアント装置に対してはサーバとして動作する。
【００２８】
仲介装置２１０は、証券会社３２の会員の投資家が使用するクライアント装置２３０などのクライアント装置から、株式の売注文や買注文を受け付けるインタフェースを有する。仲介装置２１０は、会員の投資家からの売注文や買注文に応じて、サーバ装置１００に注文メッセージを送信し、サーバ装置１００から約定通知メッセージを受信する。仲介装置２１０は、約定通知メッセージの受信状況に応じて、クライアント装置２３０などのクライアント装置に対して注文結果を出力する。
【００２９】
同様に、仲介装置２２０は、証券会社３３の会員の投資家が使用するクライアント装置２４０などのクライアント装置から、株式の売注文や買注文を受け付けるインタフェースを有する。仲介装置２２０は、会員の投資家からの売注文や買注文に応じて、サーバ装置１００に注文メッセージを送信し、サーバ装置１００から約定通知メッセージを受信する。仲介装置２２０は、約定通知メッセージの受信状況に応じて、クライアント装置２４０などのクライアント装置に対して注文結果を出力する。
【００３０】
クライアント装置２３０，２４０は、個人投資家や機関投資家などの投資家が使用するクライアントコンピュータである。投資家は、証券会社３２，３３などの証券会社に依頼して株式を売買する。クライアント装置２３０を使用する投資家は、証券会社３２の会員である。クライアント装置２３０は、仲介装置２１０に売注文や買注文を送信し、仲介装置２１０から約定通知を受信する。クライアント装置２４０を使用する投資家は、証券会社３３の会員である。クライアント装置２４０は、仲介装置２２０に売注文や買注文を送信し、仲介装置２２０から約定通知を受信する。
【００３１】
図３は、サーバ装置のハードウェア例を示すブロック図である。
サーバ装置１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像インタフェース１０４、入力インタフェース１０５、媒体リーダ１０６および通信インタフェース１０７を有する。これらのユニットはバスに接続されている。ＣＰＵ１０１は、第１の実施の形態の処理部１２に対応する。ＲＡＭ１０２またはＨＤＤ１０３は、第１の実施の形態の記憶部１１に対応する。仲介装置２１０，２２０およびクライアント装置２３０，２４０も、サーバ装置１００と同様のハードウェアを有する。
【００３２】
ＣＰＵ１０１は、プログラムの命令を実行するプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されたプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。なお、ＣＰＵ１０１は複数のプロセッサコアを備えてもよく、サーバ装置１００は複数のプロセッサを備えてもよい。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【００３３】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムやＣＰＵ１０１が演算に使用するデータを一時的に記憶する揮発性の半導体メモリである。なお、サーバ装置１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数のメモリを備えてもよい。
【００３４】
ＨＤＤ１０３は、ＯＳ（Operating System）やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性ストレージである。なお、サーバ装置１００は、フラッシュメモリやＳＳＤ（Solid State Drive）など他の種類のストレージを備えてもよく、複数のストレージを備えてもよい。
【００３５】
画像インタフェース１０４は、ＣＰＵ１０１からの命令に従って、サーバ装置１００に接続された表示装置１１１に画像を出力する。表示装置１１１として、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイ、プロジェクタなど、任意の種類の表示装置を使用することができる。
【００３６】
入力インタフェース１０５は、サーバ装置１００に接続された入力デバイス１１２から入力信号を受け付ける。入力デバイス１１２として、マウス、タッチパネル、タッチパッド、キーボードなど、任意の種類の入力デバイスを使用することができる。また、サーバ装置１００に複数種類の入力デバイスが接続されてもよい。
【００３７】
媒体リーダ１０６は、記録媒体１１３に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体１１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。媒体リーダ１０６は、例えば、記録媒体１１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００３８】
通信インタフェース１０７は、ネットワーク１１４に接続され、ネットワーク１１４を介して仲介装置２１０，２２０と通信を行う。通信インタフェース１０７は、スイッチやルータなどの有線通信装置に接続される有線インタフェースである。ただし、基地局やアクセスポイントなどの無線通信装置に接続される無線インタフェースであってもよい。
【００３９】
次に、サーバ装置１００の機能について説明する。
図４は、サーバ装置の機能例を示すブロック図である。
サーバ装置１００は、注文受信部１２１、注文キュー１２２、マッチング部１２３、データベース管理システム（ＤＢＭＳ）１２４、注文データベース１２５、約定データベース１２６、板生成部１２７、約定キュー１２８および約定送信部１２９を有する。
【００４０】
サーバ装置１００が使用するデータベース管理システム１２４は、データをＲＡＭ１０２などの主記憶装置上に保持するインメモリＤＢＭＳである。ただし、データをＨＤＤ１０３などの補助記憶装置に保持する通常のＤＢＭＳを使用することも可能である。注文キュー１２２、注文データベース１２５、約定データベース１２６および約定キュー１２８は、例えば、ＲＡＭ１０２の記憶領域を用いて実現される。注文受信部１２１、マッチング部１２３、データベース管理システム１２４、板生成部１２７および約定送信部１２９は、例えば、ＣＰＵ１０１が実行するプログラムを用いて実現できる。
【００４１】
注文受信部１２１は、仲介装置２１０，２２０などの仲介装置から注文メッセージを受信する。注文受信部１２１は、受信した注文メッセージを注文キュー１２２に挿入する。
注文キュー１２２は、未処理の注文メッセージを受信順に記憶するＦＩＦＯ（First In First Out）型のバッファメモリである。注文受信部１２１により、最新の注文メッセージが注文キュー１２２の末尾に挿入される。マッチング部１２３により、未処理の注文メッセージのうち最も古い注文メッセージが注文キュー１２２の先頭から取り出される。
【００４２】
マッチング部１２３は、売注文と買注文の間のマッチングを行う。具体的には、マッチング部１２３は、注文キュー１２２の先頭から注文メッセージを１つずつ取り出す。
取り出した注文メッセージが売注文を示す場合、マッチング部１２３は、今回の売注文と、過去に取り出した注文メッセージが示す買注文のうち未約定の買注文とを対比する。希望する条件が合う相手方の買注文が存在する場合、マッチング部１２３は、約定を成立させて、約定が成立した売注文と買注文のペアを示す約定通知メッセージを約定キュー１２８に挿入する。希望する条件が合う相手方の買注文が存在しない場合、マッチング部１２３は、今回の売注文を未約定の売注文として保持する。
【００４３】
取り出した注文メッセージが買注文を示す場合、マッチング部１２３は、今回の買注文と、過去に取り出した注文メッセージが示す売注文のうち未約定の売注文とを対比する。希望する条件が合う相手方の売注文が存在する場合、マッチング部１２３は、約定を成立させて、約定が成立した売注文と買注文のペアを示す約定通知メッセージを約定キュー１２８に挿入する。希望する条件が合う相手方の売注文が存在しない場合、マッチング部１２３は、今回の買注文を未約定の買注文として保持する。
【００４４】
上記の売買処理を実現するため、マッチング部１２３は関係データベースを利用する。マッチング部１２３は、関係データベースのクエリであるＳＱＬ文をデータベース管理システム１２４に発行し、ＳＱＬ文に対する処理結果をデータベース管理システム１２４から取得する。マッチング部１２３がデータベース管理システム１２４に発行するＳＱＬ文には、テーブルから特定の条件のレコードを検索する検索クエリ、テーブルに新規レコードを挿入する挿入クエリ、テーブルの特定の既存レコードの値を書き換える更新クエリ、テーブルから特定のレコードを削除する削除クエリが含まれる。
【００４５】
データベース管理システム１２４は、注文データベース１２５および約定データベース１２６を管理する。データベース管理システム１２４は、関係データベースのクエリであるＳＱＬ文を受け付け、受け付けたＳＱＬ文に従って注文データベース１２５や約定データベース１２６に対して処理を実行する。データベース管理システム１２４は、処理結果をＳＱＬ文の発行元に対して出力する。データベース管理システム１２４が受け付けるＳＱＬ文には、検索クエリ、挿入クエリ、更新クエリおよび削除クエリが含まれる。データベース管理システム１２４は、マッチング部１２３からＳＱＬ文を受け付けることがあり、板生成部１２７からＳＱＬ文を受け付けることがある。
【００４６】
注文データベース１２５は、株式の銘柄毎に、未約定の売注文を示すテーブルである売注文表を記憶する。注文データベース１２５は、売注文表の中の特定のカラム（列）の値に基づいてレコードを高速に検索できるようにインデックスを更に記憶している。また、注文データベース１２５は、株式の銘柄毎に、未約定の買注文を示すテーブルである買注文表を記憶する。注文データベース１２５は、買注文表の中の特定のカラムの値に基づいてレコードを高速に検索できるようにインデックスを更に記憶している。
【００４７】
約定データベース１２６は、株式の銘柄毎に、約定が成立した売注文を示すテーブルである売約定表を記憶する。また、約定データベース１２６は、株式の銘柄毎に、約定が成立した買注文を示すテーブルである買約定表を記憶する。なお、第２の実施の形態では、主に注文データベース１２５のデータ処理に着目して説明する。
【００４８】
板生成部１２７は、株式の銘柄毎に、未約定の売注文と未約定の買注文の蓄積状況を示す板情報を生成する。板情報を生成するため、板生成部１２７は、データベース管理システム１２４に対して検索クエリを発行し、データベース管理システム１２４から売注文の数量および買注文の数量を示す処理結果を取得する。板情報は、投資家が現在の取引価格（現値）や約定が成立する可能性のある価格を把握する上で有用な情報である。板生成部１２７は、生成した板情報を、証券会社３２，３３などの証券会社に送信してもよいし、投資情報を表示する各種の情報提供システムに送信してもよい。
【００４９】
約定キュー１２８は、未送信の約定通知メッセージを生成順に記憶するＦＩＦＯ型のバッファメモリである。マッチング部１２３により、最新の約定通知メッセージが約定キュー１２８の末尾に挿入される。約定送信部１２９により、未送信の約定通知メッセージのうち最も古い約定通知メッセージが約定キュー１２８の先頭から取り出される。
【００５０】
約定送信部１２９は、約定キュー１２８の先頭から約定通知メッセージを１つずつ取り出す。約定送信部１２９は、取り出した約定通知メッセージを、証券会社３２，３３などの証券会社のうち約定通知の宛先となる証券会社の仲介装置に対して送信する。宛先の証券会社は、約定が成立した売注文または買注文を行った証券会社である。
【００５１】
図５は、注文メッセージの例を示す図である。
注文メッセージ１３１は、注文キュー１２２に記憶される。注文メッセージ１３１は、売買種別、指値、数量、注文日時、注文番号、銘柄コードおよび依頼元の項目を有する。
【００５２】
売買種別は、売注文と買注文を区別するフラグである。売買種別＝１は買注文を表し、売買種別＝２は売注文を表す。指値は、投資家によって指定された取引単価の条件である。売注文の場合、指値は取引単価の下限であり、指値以上の売却単価での取引を要求することを示す。買注文の場合、指値は取引単価の上限であり、指値以下の買入単価での取引を要求することを示す。指値は空欄であってもよい。指値が与えられる注文が指値注文であり、指値が与えられない注文が成行注文である。指値注文は、相手注文（売注文に対する買注文、または、買注文に対する売注文）が存在しても価格条件が合わなければ約定が成立しないのに対し、成行注文は、相手注文が存在すれば約定が成立する。
【００５３】
数量は、１回の注文で取引したい株式の数量（株数）である。ただし、注文メッセージ１３１が指定する数量のうち一部の数量だけ先行して約定が成立することがある。注文日時は、注文を行った日時である。注文番号は、注文を識別する識別番号である。注文番号は昇順の整数であり、古い注文ほど小さい注文番号が付与され、新しい注文ほど大きい注文番号が付与される。注文番号は、サーバ装置１００が注文メッセージ１３１を受信したときに、注文受信部１２１が注文メッセージ１３１に対して付与してもよい。銘柄コードは、株式の銘柄を識別する識別番号である。依頼元は、注文メッセージ１３１を送信した仲介装置を有する証券会社を示す文字列である。
【００５４】
図６は、板情報の例を示す図である。
板情報１３２は、注文データベース１２５に基づいて板生成部１２７により生成される。板情報１３２は、ある銘柄の未約定の売注文および買注文の蓄積状況を示す。板情報１３２は、気配値、売数量および買数量の項目を有する。
【００５５】
気配値は、その銘柄の株式の価格であり、売注文および買注文の指値に対応する。売数量は、ある気配値を指値とする売注文によって指定された数量を合計した合計数量である。すなわち、売数量は、指値毎に残っている売却希望数量の合計である。買数量は、ある気配値を指値とする買注文によって指定された数量を合計した合計数量である。すなわち、買数量は、指値毎に残っている買入希望数量の合計である。一例として、図６の板情報１３２は、９０００円で２１９００株、８９００で６９７００株、８８００円で１１００株、８７００円で５３００株、８６００円で２００株の売注文が残っていることを示す。また、板情報１３２は、８５００円で４００株、８４００円で１６００株、８３００円で９００株、８２００円で１８２００株の買注文が残っていることを示す。
【００５６】
売注文と買注文は、原則として指値に基づいてマッチングされる。新しい注文が到着すると、その注文の指値を満たす相手注文のうち、その注文にとって取引価格が有利な方から優先的に約定相手として選択される。すなわち、新しい売注文が到着すると、その売注文の指値以上の買値をもつ買注文のうち、買値が高い方から優先的に約定相手として選択される。また、新しい買注文が到着すると、その買注文の指値以下の売値をもつ売注文のうち、売値が低い方から優先的に約定相手として選択される。ただし、取引価格が同じになる複数の相手注文がある場合、注文日時が古い方から優先的に選択される。
【００５７】
例えば、図６の例において、８６００円で１００株の買注文が到着すると、８６００円で２００株の売注文のうち注文日時が古い方から１００株の売注文が相手となって約定が成立する。これにより、８６００円の売数量が１００株に減少する。また、８６００円で５００株の買注文が到着すると、８６００円で２００株の売注文が相手となって約定が成立し、残りの３００株の買注文は約定が成立しない。これにより、８６００円の売数量が０株に減少し、８６００円の買数量が３００株に増加する。
【００５８】
また、８７００円で１００株の買注文が到着すると、８６００円で２００株の売注文のうち注文日時が古い方から１００株の売注文が相手となって約定が成立する。これにより、８６００円の売数量が１００株に減少する。また、８７００円で５００株の買注文が到着すると、８６００円で２００株の売注文が相手となり、８７００円で５３００株の売注文のうち注文日時が古い方から３００株の売注文が相手となって約定が成立する。これにより、８６００円の売数量が０株、８７００円の売数量が５０００株に減少する。
【００５９】
また、８５００円で１００株の売注文が到着すると、８５００円で４００株の買注文のうち注文日時が古い方から１００株の買注文が相手となって約定が成立する。これにより、８５００円の買数量が３００株に減少する。また、８５００円で５００株の売注文が到着すると、８５００円で４００株の買注文が相手となって約定が成立し、残りの１００株の売注文は約定が成立しない。これにより、８５００円の買数量が０株に減少し、８５００円の売数量が１００株に増加する。
【００６０】
また、８４００円で１００株の売注文が到着すると、８５００円で４００株の買注文のうち注文日時が古い方から１００株の買注文が相手となって約定が成立する。これにより、８５００円の買数量が３００株に減少する。また、８４００円で５００株の売注文が到着すると、８５００円で４００株の買注文が相手となり、８４００円で１６００株の買注文のうち注文日時が古い方から１００株の買注文が相手となって約定が成立する。これにより、８５００円の買数量が０株、８４００円の買数量が１５００株に減少する。
【００６１】
ここで、株式取引では、株価の変動時に利益を得ることを狙って、現値を大きく超える指値の売注文や現値を大きく下回る指値の買注文を行う投資家が存在する。よって、売数量は現値から指値が大きい方に向かって広く分布し、買数量は現値から指値が小さい方に向かって広く分布する。一方で、平時の株式取引では、現値を大きく超える指値の買注文や現値を大きく下回る指値の売注文が到着することは少ない。よって、平時の株式取引では、到着した注文の約定相手を決定するにあたり、価格条件を満たす約定相手の候補は比較的少数でありデータベース検索の負荷は比較的低い。
【００６２】
ただし、投資家による企業価値の評価に大きな影響を与える投資情報が公開されると、パニック的な株式取引が行われる。企業価値の上昇を投資家が予測する場面では、現値を大きく超える指値の買注文が到着するようになる。また、企業価値の下落を投資家が予測する場面では、現値を大きく下回る指値の売注文が到着するようになる。よって、パニック時の株式取引では、到着した注文の約定相手を決定するにあたり、価格条件を満たす約定相手の候補が多数存在してデータベース検索の負荷が高くなる。
【００６３】
すなわち、現値を大きく超える指値の買注文が到着すると、現値からその買注文の指値までの間の売値をもつ多数の売注文が約定相手の候補になる。また、現値を大きく下回る指値の売注文が到着すると、現値からその売注文の指値までの間の買値をもつ多数の買注文が約定相手の候補になる。例えば、図６の例において、指値が９０００円の買注文が到着すると、売値が８６００円から９０００円までの９８２００株の売注文が約定相手の候補になる。また、指値が８２００円の売注文が到着すると、買値が８５００円から８２００円までの２１１００株の買注文が約定相手の候補になる。
【００６４】
そこで、第２の実施の形態のサーバ装置１００は、後述するように、売注文表および買注文表のインデックスを工夫してデータベース検索を高速化する。
図７は、売注文表の例を示す図である。
【００６５】
売注文表１３３は、注文データベース１２５に記憶される。売注文表１３３は、ある銘柄の未約定の売注文を列挙する。売注文表１３３は、売値、数量、注文日時、注文番号、銘柄コードおよび依頼元の項目を有する。売注文表１３３に登録される１つのレコードは、注文キュー１２２から取り出された注文メッセージのうち売注文を示す注文メッセージ、すなわち、売買種別＝２である注文メッセージに対応する。売値は、図５に示した注文メッセージ１３１に含まれる指値に対応する。数量、注文日時、注文番号、銘柄コードおよび依頼元は、注文メッセージ１３１に含まれる数量、注文日時、注文番号、銘柄コードおよび依頼元に対応する。ただし、売注文表１３３に登録された数量は、売注文の一部が約定成立することで注文当初の数量より減少していることがある。
【００６６】
一例として、売注文表１３３には、８６００円で１００株の売注文、８６００円で１００株の売注文が登録されている。また、売注文表１３３には、８７００円で１０００株の売注文、８７００円で３００株の売注文、８７００円で１５００株の売注文、８７００円で５００株の売注文、８７００円で１０００株の売注文が登録されている。売注文表１３３の数量を売値毎に合計することで、板情報１３２の売数量を算出することができる。８６００円で２００株の新たな売注文が到着した場合、約定相手の買注文が存在しないため、その新たな売注文を示すレコードが売注文表１３３に登録される。
【００６７】
図８は、買注文表の例を示す図である。
買注文表１３４は、注文データベース１２５に記憶される。買注文表１３４は、ある銘柄の未約定の買注文を列挙する。買注文表１３４は、買値、数量、注文日時、注文番号、銘柄コードおよび依頼元の項目を有する。買注文表１３４に登録される１つのレコードは、注文キュー１２２から取り出された注文メッセージのうち買注文を示す注文メッセージ、すなわち、売買種別＝１である注文メッセージに対応する。買値は、図５に示した注文メッセージ１３１に含まれる指値に対応する。数量、注文日時、注文番号、銘柄コードおよび依頼元は、注文メッセージ１３１に含まれる数量、注文日時、注文番号、銘柄コードおよび依頼元に対応する。ただし、買注文表１３４に登録された数量は、買注文の一部が約定成立することで注文当初の数量より減少していることがある。
【００６８】
一例として、買注文表１３４には、８５００円で１００株の買注文、８５００円で２００株の買注文、８５００円で１００株の買注文が登録されている。また、買注文表１３４には、８４００円で５００株の買注文、８４００円で１００株の買注文、８４００円で１０００株の売注文が登録されている。また、買注文表１３４には、８３００円で１００株の買注文が登録されている。買注文表１３４の数量を買値毎に合計することで、板情報１３２の買数量を算出することができる。８５００円で２００株の新たな買注文が到着した場合、その新たな買注文を示すレコードが買注文表１３４に登録される。
【００６９】
なお、売注文表１３３からは、約定が成立した売注文を示すレコードが削除される。約定データベース１２６に記憶される売約定表には、約定が成立した売注文について売注文表１３３と同様の情報を登録することができる。また、買注文表１３４からは、約定が成立した買注文を示すレコードが削除される。約定データベース１２６に記憶される買約定表には、約定が成立した買注文について買注文表１３４と同様の情報を登録することができる。以下の第２の実施の形態の説明では、売注文表１３３および買注文表１３４に対するレコードの検索、挿入、更新、削除などのデータベース操作に着目し、売約定表および買約定表に対するデータベース操作については説明を省略している。
【００７０】
なお、処理を高速化するため、売注文表１３３からのレコードの削除は、実際にレコードを削除する代わりに、削除されたレコードであることを示す削除フラグをレコードに付与することで行ってもよい。売注文表１３３のレコードのうち削除フラグがＯＮであるレコードは、売注文表１３３に存在しないものとみなされる。同様に、買注文表１３４からのレコードの削除は、削除されたレコードであることを示す削除フラグをレコードに付与することで行ってもよい。買注文表１３４のレコードのうち削除フラグがＯＮであるレコードは、買注文表１３４に存在しないものとみなされる。
【００７１】
ところで、売注文表１３３のレコードを一意に識別するためのカラムである主キーは、注文番号である。注文番号は売注文の古い順に付与される昇順の整数であるため、複数のレコードを古い順にソートするためのソート基準値としても使用される。そこで、売注文表１３３からは、注文番号から当該注文番号をもつレコードを高速に参照できるようにするプライマリインデックスが生成される。プライマリインデックスは、注文データベース１２５に記憶される。また、売注文表１３３に対しては、売値を検索条件として用いてレコードを絞り込む検索を行うことが多い。そこで、売注文表１３３からは、売値から当該売値をもつレコードを高速に参照できるようにする売値インデックスが生成される。売値インデックスは、注文データベース１２５に記憶される。
【００７２】
同様に、買注文表１３４のレコードを一意に識別するためのカラムである主キーは、注文番号である。買注文表１３４からは、注文番号から当該注文番号をもつレコードを高速に参照できるようにするプライマリインデックスが生成される。プライマリインデックスは、注文データベース１２５に記憶される。また、買注文表１３４に対しては、買値を検索条件として用いてレコードを絞り込む検索を行うことが多い。そこで、買注文表１３４からは、買値から当該買値をもつレコードを高速に参照できるようにする買値インデックスが生成される。買値インデックスは、注文データベース１２５に記憶される。
【００７３】
ここで、売値インデックスおよび買値インデックスの構造について説明する。
図９は、インデックスのデータ構造例を示す図である。
売値インデックスおよび買値インデックスは、複数のノード（節点）が木構造に接続されたＢ−ｔｒｅｅである。ただし、売値インデックスおよび買値インデックスを、Ｂ−ｔｒｅｅ以外の木構造にしてもよいし、木構造以外のデータ構造にしてもよい。また、以下の説明では、売値インデックスおよび買値インデックスを、各ノードが２つの子ノードをもつ二分木としているが、各ノードが３つ以上の子ノードをもつようにしてもよい。
【００７４】
ノード１３５は、売値インデックスまたは買値インデックスに含まれるノードの例である。ノード１３５は、売値または買値、レコード数、アドレスリストへのポインタ、合計数量、左子ノードへのポインタおよび右子ノードへのポインタを含む。
【００７５】
ノード１３５が売値インデックスのノードである場合、ノード１３５に含まれる売値は、売注文表１３３の売値のカラムに出現し得る数値である。レコード数は、売注文表１３３に登録されたレコードのうち当該売値をもつレコードの数である。アドレスリストへのポインタは、売注文表１３３に登録されたレコードのうち当該売値をもつレコードのアドレスを列挙したアドレスリストを指し示す。例えば、アドレスリストへのポインタは、アドレスリストの先頭にあるリスト要素１３５−１を指し示す。リスト要素１３５−１は、当該売値をもつ１番目のレコードのアドレスと、２番目のリスト要素１３５−２を指し示す次ポインタとを含む。リスト要素１３５−２は、当該売値をもつ２番目のレコードのアドレスと、３番目のリスト要素を指し示す次ポインタとを含む。このように、リスト構造によって複数のレコードのアドレスが列挙される。ただし、リスト構造に代えて配列など他のデータ構造によって複数のレコードのアドレスを列挙してもよい。
【００７６】
合計数量は、売注文表１３３に登録されたレコードのうち当該売値をもつレコードの数量を合計した数値である。後述するように、売値毎に合計数量を売値インデックスがもつことで、売注文と買注文のマッチングを高速化することができる。左子ノードへのポインタは、ノード１３５より小さい売値をもつ左子ノードを指し示す。右子ノードへのポインタは、ノード１３５より大きい売値をもつ右子ノードを指し示す。
【００７７】
売注文表１３３に対してレコードの挿入または削除が行われる毎に、そのレコードの売値に対応するノードのレコード数、アドレスリストおよび合計数量が更新される。売注文表１３３にレコードが挿入されると、レコード数が１だけ増加し、アドレスリストに当該レコードのアドレスが登録され、合計数量が当該レコードの数量だけ増加する。売注文表１３３からレコードが削除されると、レコード数が１だけ減少し、アドレスリストから当該レコードのアドレスが削除され、合計数量が当該レコードの数量だけ減少する。
【００７８】
ノード１３５が買値インデックスのノードである場合、ノード１３５に含まれる買値は、買注文表１３４の買値のカラムに出現し得る数値である。レコード数は、買注文表１３４に登録されたレコードのうち当該買値をもつレコードの数である。アドレスリストへのポインタは、買注文表１３４に登録されたレコードのうち当該買値をもつレコードのアドレスを列挙したアドレスリストを指し示す。合計数量は、買注文表１３４に登録されたレコードのうち当該買値をもつレコードの数量を合計した数値である。左子ノードへのポインタは、ノード１３５より小さい買値をもつ左子ノードを指し示す。右子ノードへのポインタは、ノード１３５より大きい買値をもつ右子ノードを指し示す。
【００７９】
買注文表１３４に対してレコードの挿入または削除が行われる毎に、そのレコードの買値に対応するノードのレコード数、アドレスリストおよび合計数量が更新される。買注文表１３４にレコードが挿入されると、レコード数が１だけ増加し、アドレスリストに当該レコードのアドレスが登録され、合計数量が当該レコードの数量だけ増加する。買注文表１３４からレコードが削除されると、レコード数が１だけ減少し、アドレスリストから当該レコードのアドレスが削除され、合計数量が当該レコードの数量だけ減少する。
【００８０】
なお、第２の実施の形態では、マッチング部１２３が合計数量を使用することが多いため、ノード１３５に合計数量を登録している。ただし、データベース管理システム１２４を使用するアプリケーションに応じて、ノード１３５に合計数量以外の統計値を登録することも可能である。例えば、ＳＱＬ文では、複数のレコードから１つの値を算出する集合関数として、合計を求める関数ＳＵＭの他に、最大値を求める関数ＭＡＸ、最小値を求める関数ＭＩＮ、平均を求める関数ＡＶＧなどを使用できる。そこで、ノード１３５に、最大数量、最小数量、平均数量などを登録してもよい。また、第２の実施の形態では数量のカラムの統計値を登録しているが、他のカラムの統計値を登録してもよい。
【００８１】
図１０は、売注文表の売値インデックスの例を示す図である。
売値インデックス１３６は、売注文表１３３から生成される。売値インデックス１３６は、ある銘柄の未約定の売注文を示すレコードを、売値から絞り込むことを高速化する。売値インデックス１３６は、ノード１３６−１〜１３６−７を含む。
【００８２】
ノード１３６−１は、売値が８９００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が６９７００株であることを示す。ノード１３６−２は、売値が８７００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が５３００株であることを示す。ノード１３６−３は、売値が９１００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が２１００株であることを示す。
【００８３】
ノード１３６−４は、売値が８６００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が２００株であることを示す。ノード１３６−５は、売値が８８００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が１１００株であることを示す。ノード１３６−６は、売値が９０００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が２１９００株であることを示す。ノード１３６−７は、売値が９２００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が１１０株であることを示す。
【００８４】
なお、データベース管理システム１２４は、売値インデックス１３６に含まれるノードのうち所望の売値をもつノードを、二分探索によって検索する。データベース管理システム１２４は、まず所望の売値とルートノードがもつ売値とを比較する。所望の売値がルートノードの売値より小さい場合には左子ノードに進み、所望の売値がルートノードの売値より大きい場合には右子ノードに進む。データベース管理システム１２４は、所望の売値をもつノードが見つかるまで、左子ノードまたは右子ノードの探索を繰り返す。
【００８５】
図１１は、買注文表の買値インデックスの例を示す図である。
買値インデックス１３７は、買注文表１３４から生成される。買値インデックス１３７は、ある銘柄の未約定の買注文を示すレコードを、買値から絞り込むことを高速化する。買値インデックス１３７は、ノード１３７−１〜１３７−７を含む。
【００８６】
ノード１３７−１は、買値が８０００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が３１００株であることを示す。ノード１３７−２は、買値が７７００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が７２３０株であることを示す。ノード１３７−３は、買値が８３００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が９００株であることを示す。
【００８７】
ノード１３７−４は、買値が７６００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が２２８００株であることを示す。ノード１３７−５は、買値が７８００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が１１０００株であることを示す。ノード１３７−６は、買値が８１００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が６４００株であることを示す。ノード１３７−７は、買値が８５００円のレコードのアドレスを列挙したアドレスリストをもつと共に、列挙されたレコードの数量の合計が４００株であることを示す。
【００８８】
なお、データベース管理システム１２４は、買値インデックス１３７に含まれるノードのうち所望の買値をもつノードを、二分探索によって検索する。
図１２は、テーブル定義ファイルの例を示す図である。
【００８９】
テーブル定義ファイル１３８は、予め注文データベース１２５に記憶される。データベース管理システム１２４は、起動時にテーブル定義ファイル１３８から、売注文表１３３、買注文表１３４、売値インデックス１３６および買値インデックス１３７を生成する。
【００９０】
テーブル定義ファイル１３８は、売注文表１３３の構造および売値インデックス１３６の構造を定義したＳＱＬ文を含む。売注文表１３３は、整数型の売値、整数型の数量、文字列型の注文日時、整数型の注文番号、整数型の銘柄コードおよび文字列型の依頼元のカラムを含むことが定義される。また、売注文表１３３の注文番号が主キーであることが定義される。また、売値インデックス１３６は、売注文表１３３の売値のカラムに対して生成され、数量のカラムに合計関数ＳＵＭを適用した値をもつことが定義される。
【００９１】
また、テーブル定義ファイル１３８は、買注文表１３４の構造および買値インデックス１３７の構造を定義したＳＱＬ文を含む。買注文表１３４は、整数型の買値、整数型の数量、文字列型の注文日時、整数型の注文番号、整数型の銘柄コードおよび文字列型の依頼元のカラムを含むことが定義される。また、買注文表１３４の注文番号が主キーであることが定義される。また、買値インデックス１３７は、買注文表１３４の買値のカラムに対して生成され、数量のカラムに合計関数ＳＵＭを適用した値をもつことが定義される。
【００９２】
次に、マッチング部１２３が売注文と買注文のマッチングを行うにあたり、データベース管理システム１２４に対して発行される一連のＳＱＬ文について説明する。
図１３は、売注文に対する第１のクエリ実行例を示す図である。
【００９３】
マッチング部１２３は、注文メッセージ１４１−１を注文キュー１２２から取り出す。注文メッセージ１４１−１は、８５００円で５００株の売注文を示す。すると、マッチング部１２３は、ＳＱＬ文１４１−２をデータベース管理システム１２４に発行する。ＳＱＬ文１４１−２は、買注文表１３４から買値が８５００円以上のレコードを検索して該当レコードに含まれる数量の総和を求める検索クエリである。
【００９４】
データベース管理システム１２４は、ＳＱＬ文１４１−２を受け付けると、買値インデックス１３７から買値が８５００円以上のノードを検索し、該当ノードに含まれる合計数量の総和を求める。このとき、データベース管理システム１２４は、買注文表１３４にアクセスしなくてよい。データベース管理システム１２４は、ＳＱＬ文１４１−２に対する処理結果１４１−３をマッチング部１２３に応答する。処理結果１４１−３は、ＳＱＬ文１４１−２によって要求された数量の総和が４００株であることを示す。
【００９５】
マッチング部１２３は、処理結果１４１−３が示す４００株が、注文メッセージ１４１−１が示す５００株以下であるため、ＳＱＬ文１４１−２の検索条件に合う全てのレコードが約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４１−４をデータベース管理システム１２４に発行する。ＳＱＬ文１４１−４は、買注文表１３４から買値が８５００円以上のレコードを削除する削除クエリである。
【００９６】
データベース管理システム１２４は、ＳＱＬ文１４１−４を受け付けると、買値インデックス１３７から買値が８５００円以上のノードを検索し、該当ノードから買注文表１３４のレコードを特定する。データベース管理システム１２４は、特定したレコードを買注文表１３４から削除する。また、データベース管理システム１２４は、レコードの削除が反映されるように買値インデックス１３７を更新する。データベース管理システム１２４は、ＳＱＬ文１４１−４に対する処理結果１４１−５をマッチング部１２３に応答する。処理結果１４１−５は、レコードの削除が成功したことを示す。
【００９７】
マッチング部１２３は、注文メッセージ１４１−１が示す５００株のうち１００株が未約定であるため、ＳＱＬ文１４１−６をデータベース管理システム１２４に発行する。ＳＱＬ文１４１−６は、売注文表１３３に、売値が８５００円で１００株の売注文を示すレコードを挿入する挿入クエリである。データベース管理システム１２４は、ＳＱＬ文１４１−６を受け付けると、売注文表１３３にレコードを挿入し、レコードの挿入が反映されるように売値インデックス１３６を更新する。データベース管理システム１２４は、ＳＱＬ文１４１−６に対する処理結果１４１−７をマッチング部１２３に応答する。処理結果１４１−７は、レコードの挿入が成功したことを示す。これにより、注文メッセージ１４１−１が示す売注文に対する注文処理が終了する。
【００９８】
図１４は、売注文に対する第２のクエリ実行例を示す図である。
マッチング部１２３は、注文メッセージ１４２−１を注文キュー１２２から取り出す。注文メッセージ１４２−１は、８４００円で９００株の売注文を示す。すると、マッチング部１２３は、ＳＱＬ文１４２−２をデータベース管理システム１２４に発行する。ＳＱＬ文１４２−２は、買注文表１３４から買値が８４００円以上のレコードを検索して該当レコードに含まれる数量の総和を求める検索クエリである。
【００９９】
データベース管理システム１２４は、ＳＱＬ文１４２−２を受け付けると、買値インデックス１３７から買値が８４００円以上のノードを検索し、該当ノードに含まれる合計数量の総和を求める。このとき、データベース管理システム１２４は、買注文表１３４にアクセスしなくてよい。データベース管理システム１２４は、ＳＱＬ文１４２−２に対する処理結果１４２−３をマッチング部１２３に応答する。処理結果１４２−３は、ＳＱＬ文１４２−２によって要求された数量の総和が２０００株であることを示す。
【０１００】
マッチング部１２３は、処理結果１４２−３が示す２０００株が、注文メッセージ１４２−１が示す９００株を超えるため、買値に基づいて絞り込んだ一部のレコードが約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４２−４をデータベース管理システム１２４に発行する。ＳＱＬ文１４２−４は、買注文表１３４から買値が８４００円以上のレコードを検索し、買値毎に該当レコードに含まれる数量の合計を求め、合計数量を買値の降順にソートする検索クエリである。
【０１０１】
データベース管理システム１２４は、ＳＱＬ文１４２−４を受け付けると、検索結果を一行ずつ取り出すためのカーソル（カーソル１）をオープンし、カーソル１を示す処理結果１４２−５をマッチング部１２３に応答する。
【０１０２】
マッチング部１２３は、処理結果１４２−５が示すカーソル１を用いて、検索結果の次の一行を取り出すＳＱＬ文１４２−６をデータベース管理システム１２４に発行する。データベース管理システム１２４は、ＳＱＬ文１４２−６を受け付けると、買値インデックス１３７から最大の買値である８５００円のノードを検索し、該当ノードから合計数量を読み出す。このとき、データベース管理システム１２４は、買注文表１３４にアクセスしなくてよい。データベース管理システム１２４は、ＳＱＬ文１４２−６に対する処理結果１４２−７をマッチング部１２３に応答する。処理結果１４２−７は、買値が８５００円であり合計数量が４００株であることを示す。
【０１０３】
マッチング部１２３は、処理結果１４２−７が示す４００株が、注文メッセージ１４２−１が示す９００株以下であるため、買値が８５００円の全てのレコードが約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４２−８をデータベース管理システム１２４に発行する。ＳＱＬ文１４２−８は、買注文表１３４から処理結果１４２−７に該当するレコードを削除する削除クエリである。
【０１０４】
データベース管理システム１２４は、ＳＱＬ文１４２−８を受け付けると、買値インデックス１３７から買値が８５００円のノードを検索し、該当ノードから買注文表１３４のレコードを特定する。データベース管理システム１２４は、特定したレコードを買注文表１３４から削除する。また、データベース管理システム１２４は、レコードの削除が反映されるように買値インデックス１３７を更新する。データベース管理システム１２４は、ＳＱＬ文１４２−８に対する処理結果１４２−９をマッチング部１２３に応答する。処理結果１４２−９は、レコードの削除が成功したことを示す。
【０１０５】
図１５は、売注文に対する第２のクエリ実行例を示す図（続き）である。
マッチング部１２３は、処理結果１４２−５が示すカーソル１を用いて、検索結果の次の一行を取り出すＳＱＬ文１４３−１をデータベース管理システム１２４に発行する。データベース管理システム１２４は、ＳＱＬ文１４３−１を受け付けると、買値インデックス１３７から次に大きい買値である８４００円のノードを検索し、該当ノードから合計数量を読み出す。このとき、データベース管理システム１２４は、買注文表１３４にアクセスしなくてよい。データベース管理システム１２４は、ＳＱＬ文１４３−１に対する処理結果１４３−２をマッチング部１２３に応答する。処理結果１４３−２は、買値が８４００円であり合計数量が１６００株であることを示す。
【０１０６】
マッチング部１２３は、処理結果１４３−２が示す１６００株が、注文メッセージ１４２−１が示す９００株のうち未約定の５００株を超えるため、注文番号に基づいて絞り込んだ一部のレコードが約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４３−３をデータベース管理システム１２４に発行する。ＳＱＬ文１４３−３は、買注文表１３４から買値が８４００円以上のレコードを検索し、該当レコードを買値の降順にソートし、同じ買値の中では注文番号の昇順にソートする検索クエリである。
【０１０７】
データベース管理システム１２４は、ＳＱＬ文１４３−３を受け付けると、買値インデックス１３７から買値が８４００円以上のノードを検索し、該当ノードから買注文表１３４のレコードを特定する。データベース管理システム１２４は、該当レコードを読み出して一時領域に格納し、一時領域のレコードを買値および注文番号でソートする。データベース管理システム１２４は、検索結果を一行ずつ取り出すためのカーソル（カーソル２）をオープンし、カーソル２を示す処理結果１４３−４をマッチング部１２３に応答する。
【０１０８】
マッチング部１２３は、処理結果１４３−４が示すカーソル２を用いて、検索結果の次の一行を取り出すＳＱＬ文１４３−５をデータベース管理システム１２４に発行する。データベース管理システム１２４は、ＳＱＬ文１４３−５を受け付けると、一時領域に記憶されたソート済みの検索結果から先頭のレコードを読み出し、読み出したレコードを示す処理結果１４３−６をマッチング部１２３に応答する。処理結果１４３−６は、買値が８４００円であり数量が５００株であることを示す。
【０１０９】
マッチング部１２３は、処理結果１４３−６が示す５００株が、注文メッセージ１４２−１が示す９００株のうち未約定の５００株以下であるため、処理結果１４３−６が示すレコードの全数量が約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４３−７をデータベース管理システム１２４に発行する。ＳＱＬ文１４３−７は、買注文表１３４から処理結果１４３−６が示すレコードを削除する削除クエリである。
【０１１０】
データベース管理システム１２４は、ＳＱＬ文１４３−７を受け付けると、処理結果１４３−６が示すレコードを買注文表１３４から削除する。該当レコードは注文番号から特定してもよい。また、データベース管理システム１２４は、レコードの削除が反映されるように買値インデックス１３７を更新する。データベース管理システム１２４は、ＳＱＬ文１４３−７に対する処理結果１４３−８をマッチング部１２３に応答する。処理結果１４３−８は、レコードの削除が成功したことを示す。これにより、注文メッセージ１４２−１が示す売注文に対する注文処理が終了する。
【０１１１】
図１６は、買注文に対する第１のクエリ実行例を示す図である。
マッチング部１２３は、注文メッセージ１４４−１を注文キュー１２２から取り出す。注文メッセージ１４４−１は、９０００円で１０００００株の買注文を示す。すると、マッチング部１２３は、ＳＱＬ文１４４−２をデータベース管理システム１２４に発行する。ＳＱＬ文１４４−２は、売注文表１３３から売値が９０００円以下のレコードを検索して該当レコードに含まれる数量の総和を求める検索クエリである。
【０１１２】
データベース管理システム１２４は、ＳＱＬ文１４４−２を受け付けると、売値インデックス１３６から売値が９０００円以下のノードを検索し、該当ノードに含まれる合計数量の総和を求める。このとき、データベース管理システム１２４は、売注文表１３３にアクセスしなくてよい。データベース管理システム１２４は、ＳＱＬ文１４４−２に対する処理結果１４４−３をマッチング部１２３に応答する。処理結果１４４−３は、ＳＱＬ文１４４−２によって要求された数量の総和が９８２００株であることを示す。
【０１１３】
マッチング部１２３は、処理結果１４４−３が示す９８２００株が、注文メッセージ１４４−１が示す１０００００株以下であるため、ＳＱＬ文１４４−２の検索条件に合う全てのレコードが約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４４−４をデータベース管理システム１２４に発行する。ＳＱＬ文１４４−４は、売注文表１３３から売値が９０００円以下のレコードを削除する削除クエリである。
【０１１４】
データベース管理システム１２４は、ＳＱＬ文１４４−４を受け付けると、売値インデックス１３６から売値が９０００円以下のノードを検索し、該当ノードから売注文表１３３のレコードを特定する。データベース管理システム１２４は、特定したレコードを売注文表１３３から削除する。また、データベース管理システム１２４は、レコードの削除が反映されるように売値インデックス１３６を更新する。データベース管理システム１２４は、ＳＱＬ文１４４−４に対する処理結果１４４−５をマッチング部１２３に応答する。処理結果１４４−５は、レコードの削除が成功したことを示す。
【０１１５】
マッチング部１２３は、注文メッセージ１４４−１が示す１０００００株のうち１８００株が未約定であるため、ＳＱＬ文１４４−６をデータベース管理システム１２４に発行する。ＳＱＬ文１４４−６は、買注文表１３４に、買値が９０００円で１８００株の買注文を示すレコードを挿入する挿入クエリである。データベース管理システム１２４は、ＳＱＬ文１４４−６を受け付けると、買注文表１３４にレコードを挿入し、レコードの挿入が反映されるように買値インデックス１３７を更新する。データベース管理システム１２４は、ＳＱＬ文１４４−６に対する処理結果１４４−７をマッチング部１２３に応答する。処理結果１４４−７は、レコードの挿入が成功したことを示す。これにより、注文メッセージ１４４−１が示す買注文に対する注文処理が終了する。
【０１１６】
図１７は、買注文に対する第２のクエリ実行例を示す図である。
マッチング部１２３は、注文メッセージ１４５−１を注文キュー１２２から取り出す。注文メッセージ１４５−１は、８７００円で４００株の買注文を示す。すると、マッチング部１２３は、ＳＱＬ文１４５−２をデータベース管理システム１２４に発行する。ＳＱＬ文１４５−２は、売注文表１３３から売値が８７００円以下のレコードを検索して該当レコードに含まれる数量の総和を求める検索クエリである。
【０１１７】
データベース管理システム１２４は、ＳＱＬ文１４５−２を受け付けると、売値インデックス１３６から売値が８７００円以下のノードを検索し、該当ノードに含まれる合計数量の総和を求める。このとき、データベース管理システム１２４は、売注文表１３３にアクセスしなくてよい。データベース管理システム１２４は、ＳＱＬ文１４５−２に対する処理結果１４５−３をマッチング部１２３に応答する。処理結果１４５−３は、ＳＱＬ文１４５−２によって要求された数量の総和が５５００株であることを示す。
【０１１８】
マッチング部１２３は、処理結果１４５−３が示す５５００株が、注文メッセージ１４５−１が示す４００株を超えるため、売値に基づいて絞り込んだ一部のレコードが約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４５−４をデータベース管理システム１２４に発行する。ＳＱＬ文１４５−４は、売注文表１３３から売値が８７００円以下のレコードを検索し、売値毎に該当レコードに含まれる数量の合計を求め、合計数量を売値の昇順にソートする検索クエリである。
【０１１９】
データベース管理システム１２４は、ＳＱＬ文１４５−４を受け付けると、検索結果を一行ずつ取り出すためのカーソル（カーソル１）をオープンし、カーソル１を示す処理結果１４５−５をマッチング部１２３に応答する。
【０１２０】
マッチング部１２３は、処理結果１４５−５が示すカーソル１を用いて、検索結果の次の一行を取り出すＳＱＬ文１４５−６をデータベース管理システム１２４に発行する。データベース管理システム１２４は、ＳＱＬ文１４５−６を受け付けると、売値インデックス１３６から最小の売値である８６００円のノードを検索し、該当ノードから合計数量を読み出す。このとき、データベース管理システム１２４は、売注文表１３３にアクセスしなくてよい。データベース管理システム１２４は、ＳＱＬ文１４５−６に対する処理結果１４５−７をマッチング部１２３に応答する。処理結果１４５−７は、売値が８６００円であり合計数量が２００株であることを示す。
【０１２１】
マッチング部１２３は、処理結果１４５−７が示す２００株が、注文メッセージ１４５−１が示す４００株以下であるため、売値が８６００円の全てのレコードが約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４５−８をデータベース管理システム１２４に発行する。ＳＱＬ文１４５−８は、売注文表１３３から処理結果１４５−７に該当するレコードを削除する削除クエリである。
【０１２２】
データベース管理システム１２４は、ＳＱＬ文１４５−８を受け付けると、売値インデックス１３６から売値が８６００円のノードを検索し、該当ノードから売注文表１３３のレコードを特定する。データベース管理システム１２４は、特定したレコードを売注文表１３３から削除する。また、データベース管理システム１２４は、レコードの削除が反映されるように売値インデックス１３６を更新する。データベース管理システム１２４は、ＳＱＬ文１４５−８に対する処理結果１４５−９をマッチング部１２３に応答する。処理結果１４５−９は、レコードの削除が成功したことを示す。
【０１２３】
図１８は、買注文に対する第２のクエリ実行例を示す図（続き）である。
マッチング部１２３は、処理結果１４５−５が示すカーソル１を用いて、検索結果の次の一行を取り出すＳＱＬ文１４６−１をデータベース管理システム１２４に発行する。データベース管理システム１２４は、ＳＱＬ文１４６−１を受け付けると、売値インデックス１３６から次に小さい売値である８７００円のノードを検索し、該当ノードから合計数量を読み出す。このとき、データベース管理システム１２４は、売注文表１３３にアクセスしなくてよい。データベース管理システム１２４は、ＳＱＬ文１４６−１に対する処理結果１４６−２をマッチング部１２３に応答する。処理結果１４６−２は、売値が８７００円であり合計数量が５３００株であることを示す。
【０１２４】
マッチング部１２３は、処理結果１４６−２が示す５３００株が、注文メッセージ１４５−１が示す４００株のうち未約定の２００株を超えるため、注文番号に基づいて絞り込んだ一部のレコードが約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４６−３をデータベース管理システム１２４に発行する。ＳＱＬ文１４６−３は、売注文表１３３から売値が８７００円以下のレコードを検索し、該当レコードを売値の昇順にソートし、同じ売値の中では注文番号の昇順にソートする検索クエリである。
【０１２５】
データベース管理システム１２４は、ＳＱＬ文１４６−３を受け付けると、売値インデックス１３６から売値が８７００円以下のノードを検索し、該当ノードから売注文表１３３のレコードを特定する。データベース管理システム１２４は、該当レコードを読み出して一時領域に格納し、一時領域のレコードを売値および注文番号でソートする。データベース管理システム１２４は、検索結果を一行ずつ取り出すためのカーソル（カーソル２）をオープンし、カーソル２を示す処理結果１４６−４をマッチング部１２３に応答する。
【０１２６】
マッチング部１２３は、処理結果１４６−４が示すカーソル２を用いて、検索結果の次の一行を取り出すＳＱＬ文１４６−５をデータベース管理システム１２４に発行する。データベース管理システム１２４は、ＳＱＬ文１４６−５を受け付けると、一時領域に記憶されたソート済みの検索結果から先頭のレコードを読み出し、読み出したレコードを示す処理結果１４６−６をマッチング部１２３に応答する。処理結果１４６−６は、売値が８７００円であり数量が１０００株であることを示す。
【０１２７】
マッチング部１２３は、処理結果１４６−６が示す１０００株が、注文メッセージ１４５−１が示す４００株のうち未約定の２００株を超えるため、処理結果１４６−６が示すレコードの一部数量が約定相手になると判定する。すると、マッチング部１２３は、ＳＱＬ文１４６−７をデータベース管理システム１２４に発行する。ＳＱＬ文１４６−７は、処理結果１４６−６が示すレコードの数量を２００株だけ減らす更新クエリである。
【０１２８】
データベース管理システム１２４は、ＳＱＬ文１４６−７を受け付けると、処理結果１４６−６が示すレコードを売注文表１３３から特定する。該当レコードは注文番号から特定してもよい。データベース管理システム１２４は、該当レコードの数量を１０００株から８００株に更新する。また、データベース管理システム１２４は、レコードの更新が反映されるように売値インデックス１３６を更新する。データベース管理システム１２４は、ＳＱＬ文１４６−７に対する処理結果１４６−８をマッチング部１２３に応答する。処理結果１４６−８は、レコードの更新が成功したことを示す。これにより、注文メッセージ１４５−１が示す買注文に対する注文処理が終了する。
【０１２９】
このように、関係データベースを利用した売注文と買注文のマッチングでは、マッチング部１２３は、集合関数の一種である合計関数ＳＵＭを含むＳＱＬ文を頻繁に発行する。これに対して、データベース管理システム１２４は、売値インデックス１３６および買値インデックス１３７に合計値を付加することで、売注文表１３３および買注文表１３４へのアクセスを削減して効率的にＳＱＬ文を処理することができる。なお、上記ではマッチング部１２３が発行するＳＱＬ文について説明したが、板生成部１２７が板情報１３２を生成するためのＳＱＬ文についても、売値インデックス１３６および買値インデックス１３７に付加された合計値を用いて効率的に処理することができる。
【０１３０】
次に、サーバ装置１００の処理手順について説明する。
図１９は、データベース起動の手順例を示すフローチャートである。
（Ｓ１０）データベース管理システム１２４は、テーブル定義ファイル１３８をロードする。例えば、テーブル定義ファイル１３８は、ＨＤＤ１０３に記憶されているテーブル定義ファイル１３８をＲＡＭ１０２にロードする。
【０１３１】
（Ｓ１１）データベース管理システム１２４は、ステップＳ１０でロードされたテーブル定義ファイル１３８に定義された構造のテーブルをＲＡＭ１０２上に生成する。生成されるテーブルには、売注文表１３３および買注文表１３４が含まれる。売注文表１３３および買注文表１３４は、注文データベース１２５に属する。
【０１３２】
（Ｓ１２）データベース管理システム１２４は、ステップＳ１１で生成された空のテーブルに、予め退避されている初期データをロードする。例えば、テーブル定義ファイル１３８は、ＨＤＤ１０３に記憶されている初期データをロードする。
【０１３３】
（Ｓ１３）データベース管理システム１２４は、テーブル定義ファイル１３８から各テーブルの主キーを特定し、主キーの値からレコードを辿ることができるプライマリインデックスを生成する。生成されるプライマリインデックスには、売注文表１３３に対応するプライマリインデックスであって注文番号を主キーとするものと、買注文表１３４に対応するプライマリインデックスであって注文番号を主キーとするものが含まれる。
【０１３４】
（Ｓ１４）データベース管理システム１２４は、テーブル定義ファイル１３８に従って、初期データがロードされた売注文表１３３から、売値からレコードを検索できる売値インデックス１３６を生成する。ここで生成される売値インデックス１３６の各ノードは、売値、レコード数、アドレスリストへのポインタおよび子ノードへのポインタを含む。また、データベース管理システム１２４は、テーブル定義ファイル１３８に従って、初期データがロードされた買注文表１３４から、買値からレコードを検索できる買値インデックス１３７を生成する。ここで生成される買値インデックス１３７の各ノードは、買値、レコード数、アドレスリストへのポインタおよび子ノードへのポインタを含む。
【０１３５】
（Ｓ１５）データベース管理システム１２４は、ステップＳ１４で生成された売値インデックス１３６の各ノードに合計数量を挿入する。具体的には、データベース管理システム１２４は、ノード毎に、アドレスリストから参照されるレコードの中の数量の値を売注文表１３３から読み出し、読み出した数量の値を合計する。また、データベース管理システム１２４は、買値インデックス１３７の各ノードに合計数量を挿入する。具体的には、データベース管理システム１２４は、ノード毎に、アドレスリストから参照されるレコードの中の数量の値を買注文表１３４から読み出し、読み出した数量の値を合計する。
【０１３６】
図２０は、注文処理の手順例を示すフローチャートである。
（Ｓ２０）マッチング部１２３は、注文キュー１２２から注文メッセージを抽出する。以降の注文処理の説明では、売注文を示す注文メッセージ、すなわち、売買種別＝２の注文メッセージが抽出された場合を考える。ただし、売注文に対する処理と買注文に対する処理は対称であるため、買注文に対する処理についても併せて言及する。
【０１３７】
（Ｓ２１）マッチング部１２３は、買値が売注文の指値以上であるレコードを買注文表１３４から検索して、検索されたレコードに含まれる数量の総和を求めるクエリを発行する。ここで発行されるクエリは、前述のＳＱＬ文１４１−２，１４２−２に対応する。なお、買注文の注文メッセージに対しては、マッチング部１２３は、売値が買注文の指値以下であるレコードを売注文表１３３から検索して、検索されたレコードに含まれる数量の総和を求めるクエリを発行する。この場合に発行されるクエリは、前述のＳＱＬ文１４４−２，１４５−２に対応する。
【０１３８】
（Ｓ２２）データベース管理システム１２４は、買値インデックス１３７の中に、クエリに記載された「買値が売注文の指値以上である」という買値条件を満たすノードが存在するか判断する。該当ノードがある場合はステップＳ２３に進み、該当ノードがない場合はステップＳ２９に進む。なお、買注文の注文メッセージに対しては、データベース管理システム１２４は、売値インデックス１３６の中に、クエリに記載された「売値が買注文の指値以下である」という売値条件を満たすノードが存在するか判断する。
【０１３９】
（Ｓ２３）データベース管理システム１２４は、クエリに記載された買値条件を満たす１以上のノードを買値インデックス１３７から検索し、検索された１以上のノードそれぞれから合計数量を読み出し、読み出した合計数量の総和を算出する。データベース管理システム１２４は、算出した総和を含む処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４１−３，１４２−３に対応する。なお、買注文の注文メッセージに対しては、データベース管理システム１２４は、クエリに記載された売値条件を満たす１以上のノードを売値インデックス１３６から検索し、検索された１以上のノードそれぞれから合計数量を読み出し、読み出した合計数量の総和を算出する。
【０１４０】
（Ｓ２４）マッチング部１２３は、ステップＳ２３の総和を「相手数量１」とする。
（Ｓ２５）マッチング部１２３は、「相手数量１」が、注文メッセージに含まれる注文数量以下であるか判断する。「相手数量１」が注文数量以下の場合はステップＳ２６に進み、注文数量を超える場合はステップＳ３６に進む。
【０１４１】
（Ｓ２６）マッチング部１２３は、買値が売注文の指値以上であるレコードを買注文表１３４から削除するクエリを発行する。ここで発行されるクエリは、前述のＳＱＬ文１４１−４に対応する。なお、買注文の注文メッセージに対しては、マッチング部１２３は、売値が買注文の指値以下であるレコードを売注文表１３３から削除するクエリを発行する。この場合に発行されるクエリは、前述のＳＱＬ文１４４−４に対応する。
【０１４２】
（Ｓ２７）データベース管理システム１２４は、ステップＳ２６のクエリの買値条件を満たすノードを買値インデックス１３７から検索し、検索されたノードが指し示すレコードを買注文表１３４から削除する。また、データベース管理システム１２４は、検索されたノードから当該レコードのアドレスを削除し、合計数量を０にするように買値インデックス１３７を更新する。また、データベース管理システム１２４は、プライマリインデックスを更新する。そして、データベース管理システム１２４は、ステップＳ２６のクエリに対する処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４１−５に対応する。なお、買注文の注文メッセージに対しては、データベース管理システム１２４は、クエリの売値条件を満たすノードを売値インデックス１３６から検索し、検索されたノードが指し示すレコードを売注文表１３３から削除する。この場合に生成される処理結果は、前述の処理結果１４４−５に対応する。
【０１４３】
（Ｓ２８）マッチング部１２３は、注文数量からステップＳ２４の「相手数量１」を引いた値を「注文残数量」とする。そして、ステップＳ３１に進む。
（Ｓ２９）データベース管理システム１２４は、データなしを示す処理結果を生成してマッチング部１２３に応答する。
【０１４４】
（Ｓ３０）マッチング部１２３は、注文数量を「注文残数量」とする。
図２１は、注文処理の手順例を示すフローチャート（続き１）である。
（Ｓ３１）マッチング部１２３は、「注文残数量」が０より大きいか判断する。０より大きい場合はステップＳ３２に進み、０である場合はステップＳ３４に進む。
【０１４５】
（Ｓ３２）マッチング部１２３は、「注文残数量」に相当する売注文を示すレコードを売注文表１３３に挿入するクエリを発行する。レコード中の数量は「注文残数量」であり、他のカラムは注文メッセージと同じである。ここで発行されるクエリは、前述のＳＱＬ文１４１−６に対応する。なお、買注文の注文メッセージに対しては、マッチング部１２３は、「注文残数量」に相当する買注文を示すレコードを買注文表１３４に挿入するクエリを発行する。この場合に発行されるクエリは、前述のＳＱＬ文１４４−６に対応する。
【０１４６】
（Ｓ３３）データベース管理システム１２４は、売注文表１３３にレコードを挿入する。また、データベース管理システム１２４は、挿入したレコードの売値に対応するノードに当該レコードのアドレスを追加し、当該レコードの数量を当該ノードの合計数量に加算するように、売値インデックス１３６を更新する。また、データベース管理システム１２４は、プライマリインデックスを更新する。そして、データベース管理システム１２４は、処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４１−７に対応する。なお、買注文の注文メッセージに対しては、データベース管理システム１２４は、買注文表１３４にレコードを挿入して買値インデックス１３７を更新する。この場合に生成される処理結果は、前述の処理結果１４４−７に対応する。
【０１４７】
（Ｓ３４）マッチング部１２３は、これまでの一連のデータ操作を確定させるためのトランザクションコミットを示すクエリをデータベース管理システム１２４に発行する。
（Ｓ３５）データベース管理システム１２４は、これまでの一連のデータ操作を含むトランザクションを確定させて注文データベース１２５に反映させる。データベース管理システム１２４は、トランザクションコミットの処理結果をマッチング部１２３に応答する。そして、ステップＳ２０の注文メッセージに対する注文処理が終了する。
【０１４８】
図２２は、注文処理の手順例を示すフローチャート（続き２）である。
（Ｓ３６）マッチング部１２３は、注文数量を「注文残数量」とする。
（Ｓ３７）マッチング部１２３は、買値が売注文の指値以上であるレコードを買注文表１３４から検索し、検索されたレコードに含まれる数量を買値毎に合計して、買値と合計数量の一覧を求めるクエリを発行する。このとき、処理結果が買値の降順にソートされるようにクエリで指定する。ここで発行されるクエリは、前述のＳＱＬ文１４２−４に対応する。なお、買注文の注文メッセージに対しては、マッチング部１２３は、売値が買注文の指値以下であるレコードを売注文表１３３から検索し、検索されたレコードに含まれる数量を売値毎に合計して、売値と合計数量の一覧を求めるクエリを発行する。このとき、処理結果が売値の昇順にソートされるようにクエリで指定する。この場合に発行されるクエリは、前述のＳＱＬ文１４５−４に対応する。
【０１４９】
（Ｓ３８）データベース管理システム１２４は、クエリ結果を一行ずつ参照させる「カーソル１」をオープンし、「カーソル１」を示す処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４２−５，１４５−５に対応する。
【０１５０】
（Ｓ３９）マッチング部１２３は、ステップＳ３８でオープンされた「カーソル１」によりクエリ結果の次の一行を取り出すクエリを発行する。ここで発行されるクエリは、前述のＳＱＬ文１４２−６，１４３−１，１４５−６，１４６−１に対応する。
【０１５１】
（Ｓ４０）データベース管理システム１２４は、買値インデックス１３７から、「買値が売注文の指値以上」という買値条件を満たす１以上のノードのうち、買値の高い方から優先的に未選択のノード（次のノード）を１つ選択する。データベース管理システム１２４は、選択したノードから買値および合計数量を読み出し、読み出した買値および合計数量を含む処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４２−７，１４３−２に対応する。なお、買注文を示す注文メッセージに対しては、データベース管理システム１２４は、売値インデックス１３６から、「売値が買注文の指値以下」という売値条件を満たす１以上のノードのうち、売値の低い方から優先的に未選択のノード（次のノード）を１つ選択する。この場合に生成される処理結果は、前述の処理結果１４５−７，１４６−２に対応する。
【０１５２】
（Ｓ４１）マッチング部１２３は、取り出した合計数量を「相手数量２」とする。
（Ｓ４２）マッチング部１２３は、「相手数量２」が「注文残数量」以下であるか判断する。「相手数量２」が「注文残数量」以下である場合はステップＳ４３に進み、「相手数量２」が「注文残数量」を超える場合はステップＳ４８に進む。
【０１５３】
（Ｓ４３）マッチング部１２３は、「カーソル１」が現在参照しているクエリ結果に相当するレコードを買注文表１３４から削除するクエリを発行する。ここで発行されるクエリは、前述のＳＱＬ文１４２−８に対応する。なお、買注文の注文メッセージに対しては、マッチング部１２３は、「カーソル１」が現在参照しているクエリ結果に相当するレコードを売注文表１３３から削除するクエリを発行する。この場合に発行されるクエリは、前述のＳＱＬ文１４５−８に対応する。
【０１５４】
（Ｓ４４）データベース管理システム１２４は、「カーソル１」が参照する買値を含むノードを買値インデックス１３７から検索し、検索されたノードが指し示すレコードを買注文表１３４から削除する。また、データベース管理システム１２４は、検索されたノードから当該レコードのアドレスを削除し、合計数量を０にするように買値インデックス１３７を更新する。また、データベース管理システム１２４は、プライマリインデックスを更新する。そして、データベース管理システム１２４は、ステップＳ４３のクエリに対する処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４２−９に対応する。なお、買注文の注文メッセージに対しては、データベース管理システム１２４は、「カーソル１」が参照する売値を含むノードを売値インデックス１３６から検索し、検索されたノードが指し示すレコードを売注文表１３３から削除する。この場合に生成される処理結果は、前述の処理結果１４５−９に対応する。
【０１５５】
（Ｓ４５）マッチング部１２３は、「注文残数量」から「相手数量２」を引く。
（Ｓ４６）マッチング部１２３は、「注文残数量」が０より大きいか判断する。０より大きい場合はステップＳ３９に進み、０である場合はステップＳ４７に進む。
【０１５６】
（Ｓ４７）マッチング部１２３は、「カーソル１」をクローズするクエリを発行する。データベース管理システム１２４は、「カーソル１」の情報を破棄し、クローズ成功を示す処理結果をマッチング部１２３に応答する。そして、ステップＳ３４に進む。
【０１５７】
図２３は、注文処理の手順例を示すフローチャート（続き３）である。
（Ｓ４８）マッチング部１２３は、買値が売注文の指値以上であるレコードを買注文表１３４から検索し、検索されたレコードを、買値の降順を第１ソート基準とし注文番号の昇順を第２ソート基準としてソートするクエリを発行する。ここで発行されるクエリは、前述のＳＱＬ文１４３−３に対応する。なお、買注文の注文メッセージに対しては、マッチング部１２３は、売値が買注文の指値以下であるレコードを売注文表１３３から検索し、検索されたレコード売値の昇順かつ注文番号の昇順でソートするクエリを発行する。この場合に発行されるクエリは、前述のＳＱＬ文１４６−３に対応する。
【０１５８】
（Ｓ４９）データベース管理システム１２４は、ステップＳ４８の買値条件を満たすノードを買値インデックス１３７から検索し、検索されたノードが指し示すレコードを買注文表１３４から読み出す。データベース管理システム１２４は、読み出したレコードをＲＡＭ１０２上の一時領域に格納し、買値の降順を第１ソート基準とし注文番号の昇順を第２ソート基準としてソートする。なお、買注文の注文メッセージに対しては、データベース管理システム１２４は、売値条件を満たすノードを売値インデックス１３６から検索し、検索されたノードが指し示すレコードを売注文表１３３から読み出す。
【０１５９】
（Ｓ５０）データベース管理システム１２４は、クエリ結果を一行ずつ参照させる「カーソル２」をオープンし、「カーソル２」を示す処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４３−４，１４６−４に対応する。
【０１６０】
（Ｓ５１）マッチング部１２３は、ステップＳ５０でオープンされた「カーソル２」によりクエリ結果の次の一行を取り出すクエリを発行する。ここで発行されるクエリは、前述のＳＱＬ文１４３−５，１４６−５に対応する。データベース管理システム１２４は、ステップＳ４９の一時領域にある１以上のレコードのうち、先頭に近い方から優先的に未選択のレコード（次のレコード）を１つ読み出す。データベース管理システム１２４は、読み出したレコードを含む処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４３−６，１４６−６に対応する。
【０１６１】
（Ｓ５２）マッチング部１２３は、取り出した数量を「相手数量３」とする。
（Ｓ５３）マッチング部１２３は、「相手数量３」が「注文残数量」以下であるか判断する。「相手数量３」が「注文残数量」以下である場合はステップＳ５４に進み、「相手数量３」が「注文残数量」を超える場合はステップＳ５９に進む。
【０１６２】
（Ｓ５４）マッチング部１２３は、「カーソル２」が参照するレコードを買注文表１３４から削除するクエリを発行する。ここで発行されるクエリは、前述のＳＱＬ文１４３−７に対応する。なお、買注文の注文メッセージに対しては、マッチング部１２３は、「カーソル１」が参照するレコードを売注文表１３３から削除するクエリを発行する。
【０１６３】
（Ｓ５５）データベース管理システム１２４は、「カーソル２」が参照するレコードを買注文表１３４から削除する。このとき、データベース管理システム１２４は、削除するレコードを注文番号を用いて特定してもよく、プライマリインデックスを使用してもよい。また、データベース管理システム１２４は、削除したレコードの買値に対応するノードから当該レコードのアドレスを削除し、合計数量を当該レコードの数量だけ減少させるように買値インデックス１３７を更新する。また、データベース管理システム１２４は、プライマリインデックスを更新する。そして、データベース管理システム１２４は、ステップＳ５４のクエリに対する処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４３−８に対応する。なお、買注文の注文メッセージに対しては、データベース管理システム１２４は、「カーソル２」が参照するレコードを売注文表１３３から削除し、売値インデックス１３６を更新する。
【０１６４】
（Ｓ５６）マッチング部１２３は、「注文残数量」から「相手数量３」を引く。
（Ｓ５７）マッチング部１２３は、「注文残数量」が０より大きいか判断する。０より大きい場合はステップＳ５１に進み、０である場合はステップＳ５８に進む。
【０１６５】
（Ｓ５８）マッチング部１２３は、「カーソル２」をクローズするクエリを発行する。データベース管理システム１２４は、「カーソル２」の情報を破棄し、クローズ成功を示す処理結果をマッチング部１２３に応答する。そして、ステップＳ４６に進む。
【０１６６】
図２４は、注文処理の手順例を示すフローチャート（続き４）である。
（Ｓ５９）マッチング部１２３は、ステップＳ５２の「相手数量３」から現在の「注文残数量」を引いた数量を「相手残数量」とする。
【０１６７】
（Ｓ６０）マッチング部１２３は、「カーソル２」が参照するレコードに含まれる数量をステップＳ５９の「相手残数量」に更新するクエリを発行する。ここで発行されるクエリは、前述のＳＱＬ文１４６−７に対応する。
【０１６８】
（Ｓ６１）データベース管理システム１２４は、「カーソル２」が参照するレコードを買注文表１３４から特定し、特定したレコードに含まれる数量を更新する。このとき、データベース管理システム１２４は、更新するレコードを注文番号を用いて特定してもよく、プライマリインデックスを使用してもよい。また、データベース管理システム１２４は、更新したレコードの買値に対応するノードの合計数量を、更新前後の数量の差だけ減少させるように買値インデックス１３７を更新する。そして、データベース管理システム１２４は、ステップＳ６０のクエリに対する処理結果をマッチング部１２３に応答する。ここで生成される処理結果は、前述の処理結果１４６−８に対応する。なお、買注文の注文メッセージに対しては、データベース管理システム１２４は、「カーソル２」が参照する売注文表１３３のレコードを更新し、売値インデックス１３６を更新する。
【０１６９】
（Ｓ６２）マッチング部１２３は、「注文残数量」を０にする。これは、全ての注文数量について約定が成立したことを示す。そして、ステップＳ５７に進む。
第２の実施の形態の情報処理システムによれば、売注文表１３３に対応する売値インデックス１３６の各ノードに、当該ノードが示す売値をもつレコードの合計数量が登録される。また、買注文表１３４に対応する買値インデックス１３７の各ノードに、当該ノードが示す買値をもつレコードの合計数量が登録される。このため、データベース管理システム１２４は、合計関数ＳＵＭを含むクエリに対して、売注文表１３３や買注文表１３４から数量のカラムの値を読み出さずに合計関数ＳＵＭの結果を応答することができる。よって、合計関数ＳＵＭを含むクエリの処理を高速化できる。また、データベース管理システム１２４が合計関数ＳＵＭを含むクエリを高速に実行できるため、データベース管理システム１２４を使用するアプリケーションが個々のレコードを取得して合計数量を計算しなくてよく、アプリケーションの負荷を軽減することができる。
【０１７０】
また、株式の注文処理では、売値毎の合計数量や買値毎の合計数量を用いることで、個々のレコードの数量や注文番号を読み出さなくても、特定の売値をもつレコード群や特定の買値をもつレコード群を一括して処理することができる場合がある。よって、データベース管理システム１２４が合計関数ＳＵＭを含むクエリを高速に実行することで、証券取引所３１における株式取引を高速化することができる。特に、現値を大きく下回る指値の売注文または現値を大きく超える指値の買注文が発生するパニック時の株式取引では、１つの注文に対して多数の約定相手の候補が存在する。この場合であっても、合計関数ＳＵＭを含むクエリを高速に実行することで、個々のレコードの数量を読み出す方法と比べて株式取引を高速に実行することが可能となる。
【０１７１】
なお、第２の実施の形態ではデータベースを利用して株式取引を実現する例を説明したが、第２の実施の形態のデータベース処理を、株式以外の有価証券の取引、先物取引、商品取引など様々な売買取引に適用することも可能である。
【符号の説明】
【０１７２】
１０  情報処理装置
１１  記憶部
１２  処理部
１３  データベース
１３ａ，１３ｂ  データ項目
１４  インデックス
１４ａ  レコード特定情報
１４ｂ  統計値
１５  クエリ
１６  処理結果
【図１】
2020123181.tif 000003
【図２】
2020123181.tif 000004
【図３】
2020123181.tif 000005
【図４】
2020123181.tif 000006
【図５】
2020123181.tif 000007
【図６】
2020123181.tif 000008
【図７】
2020123181.tif 000009
【図８】
2020123181.tif 000010
【図９】
2020123181.tif 000011
【図１０】
2020123181.tif 000012
【図１１】
2020123181.tif 000013
【図１２】
2020123181.tif 000014
【図１３】
2020123181.tif 000015
【図１４】
2020123181.tif 000016
【図１５】
2020123181.tif 000017
【図１６】
2020123181.tif 000018
【図１７】
2020123181.tif 000019
【図１８】
2020123181.tif 000020
【図１９】
2020123181.tif 000021
【図２０】
2020123181.tif 000022
【図２１】
2020123181.tif 000023
【図２２】
2020123181.tif 000024
【図２３】
2020123181.tif 000025
【図２４】
2020123181.tif 000026