(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2025-01-16
(45)【発行日】2025-01-24
(54)【発明の名称】情報処理方法、情報処理装置及びプログラム
(51)【国際特許分類】
G06F 16/28 20190101AFI20250117BHJP
G06F 16/24 20190101ALN20250117BHJP
【FI】
G06F16/28
G06F16/24
(21)【出願番号】P 2022574916
(86)(22)【出願日】2021-01-13
(86)【国際出願番号】 JP2021000851
(87)【国際公開番号】W WO2022153400
(87)【国際公開日】2022-07-21
【審査請求日】2023-07-19
(73)【特許権者】
【識別番号】523066680
【氏名又は名称】株式会社ESSホールディングス
(74)【代理人】
【識別番号】100107766
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【氏名又は名称】伊東 忠彦
(72)【発明者】
【氏名】古庄 晋二
【審査官】松尾 真人
(56)【参考文献】
【文献】特開2004-145692(JP,A)
【文献】特許第5916974(JP,B1)
【文献】特表2020-537251(JP,A)
【文献】特開平10-269248(JP,A)
【文献】Tableauユーザー会,Tableauデータ分析 ~実践から活用まで~ 一歩進んだ7つの使い方,第1版,株式会社秀和システム 斉藤 和邦,2018年08月29日,pp.55-65,ISBN:978-4-7980-5424-7
(58)【調査した分野】(Int.Cl.,DB名)
G06F 16/00-16/958
(57)【特許請求の範囲】
【請求項1】
自然数インデックス形式の2つのテーブルが所定のキーでJOIN結合された仮想テーブルに含まれる複数の次元で集計を行う情報処理方法であって、
前記キーの値ごとに、前記2つのテーブルに含まれる前記複数の次元で集計を行う集計手順と、
前記集計手順による集計の結果の和を計算する和計算手順と、
をコンピュータが実行
し、
前記集計手順は、
前記キーの値ごとに、前記2つのテーブルを第1のサブテーブルと第2のサブテーブルとにそれぞれ分解し、前記第1のサブテーブルと前記第2のサブテーブルとの間の積を計算することで、前記複数の次元で集計を行う、情報処理方法。
【請求項2】
前記集計手順は、
前記第1のサブテーブルに含まれる前記次元の出現回数をカウントし、前記カウントの値を前記第1のサブテーブルに追加した上で、前記第1のサブテーブルと前記第2のサブテーブルとの間の積を計算する、請求項
1に記載の情報処理方法。
【請求項3】
前記積及び前記和は、ソート法又はキューブ法のいずれかにより計算される、請求項
1又は
2に記載の情報処理方法。
【請求項4】
前記集計の測度は、最小、最大、合計、又は件数のいずれかであり、
前記集計手順は、
前記集計の測度に応じて、前記第1のサブテーブルと前記第2のサブテーブルとの間の積を計算する、請求項
1乃至
3の何れか一項に記載の情報処理方法。
【請求項5】
前記和計算手順は、
前記集計の測度に応じて、前記集計の結果の和を計算する、請求項
4に記載の情報処理方法。
【請求項6】
自然数インデックス形式の2つのテーブルが所定のキーでJOIN結合された仮想テーブルに含まれる複数の次元で集計を行う情報処理方法であって、
前記キーの値ごとに、前記2つのテーブルに含まれる前記複数の次元で集計を行う集計手順と、
前記集計手順による集計の結果の和を計算する和計算手順と、
をコンピュータが実行し、
前記複数の次元には集計の優先度が付与されており、
前記2つのテーブルは、一方がマスタ側テーブル、他方がスレイブ側テーブルであり、
前記情報処理方法には、
前記スレイブ側テーブルに含まれる次元の中に、前記マスタ側テーブルに含まれる次元よりも高い優先度の次元が含まれる場合、前記スレイブ側テーブルに含まれる次元の優先度が、前記マスタ側テーブルに含まれる次元の優先度よりも低くなるように、優先度の入れ替えを行う入れ替え手順が含まれ、
前記入れ替え手順は、
前記和計算手順により前記和が計算された場合、前記入れ替えた優先度を元に戻す
、情報処理方法。
【請求項7】
自然数インデックス形式の2つのテーブルが所定のキーでJOIN結合された仮想テーブルに含まれる複数の次元で集計を行う情報処理装置であって、
前記キーの値ごとに、前記2つのテーブルに含まれる前記複数の次元で集計を行う集計部と、
前記集計部による集計の結果の和を計算する和計算部と、
を有
し、
前記集計部は、
前記キーの値ごとに、前記2つのテーブルを第1のサブテーブルと第2のサブテーブルとにそれぞれ分解し、前記第1のサブテーブルと前記第2のサブテーブルとの間の積を計算することで、前記複数の次元で集計を行う、情報処理装置。
【請求項8】
自然数インデックス形式の2つのテーブルが所定のキーでJOIN結合された仮想テーブルに含まれる複数の次元で集計を行う情報処理装置であって、
前記キーの値ごとに、前記2つのテーブルに含まれる前記複数の次元で集計を行う集計部と、
前記集計部による集計の結果の和を計算する和計算部と、
を有し、
前記複数の次元には集計の優先度が付与されており、
前記2つのテーブルは、一方がマスタ側テーブル、他方がスレイブ側テーブルであり、
前記情報処理装置は、
前記スレイブ側テーブルに含まれる次元の中に、前記マスタ側テーブルに含まれる次元よりも高い優先度の次元が含まれる場合、前記スレイブ側テーブルに含まれる次元の優先度が、前記マスタ側テーブルに含まれる次元の優先度よりも低くなるように、優先度の入れ替えを行う入れ替え部を更に有し、
前記入れ替え部は、
前記和計算部により前記和が計算された場合、前記入れ替えた優先度を元に戻す、情報処理装置。
【請求項9】
自然数インデックス形式の2つのテーブルが所定のキーでJOIN結合された仮想テーブルに含まれる複数の次元で集計を行う情報処理方法であって、
前記キーの値ごとに、前記2つのテーブルに含まれる前記複数の次元で集計を行う集計手順と、
前記集計手順による集計の結果の和を計算する和計算手順と、
が含まれる情報処理方法をコンピュータに実行させ
、
前記集計手順は、
前記キーの値ごとに、前記2つのテーブルを第1のサブテーブルと第2のサブテーブルとにそれぞれ分解し、前記第1のサブテーブルと前記第2のサブテーブルとの間の積を計算することで、前記複数の次元で集計を行う、プログラム。
【請求項10】
自然数インデックス形式の2つのテーブルが所定のキーでJOIN結合された仮想テーブルに含まれる複数の次元で集計を行う情報処理方法であって、
前記キーの値ごとに、前記2つのテーブルに含まれる前記複数の次元で集計を行う集計手順と、
前記集計手順による集計の結果の和を計算する和計算手順と、
が含まれる情報処理方法をコンピュータに実行させ、
前記複数の次元には集計の優先度が付与されており、
前記2つのテーブルは、一方がマスタ側テーブル、他方がスレイブ側テーブルであり、
前記情報処理方法には、
前記スレイブ側テーブルに含まれる次元の中に、前記マスタ側テーブルに含まれる次元よりも高い優先度の次元が含まれる場合、前記スレイブ側テーブルに含まれる次元の優先度が、前記マスタ側テーブルに含まれる次元の優先度よりも低くなるように、優先度の入れ替えを行う入れ替え手順が含まれ、
前記入れ替え手順は、
前記和計算手順により前記和が計算された場合、前記入れ替えた優先度を元に戻す、プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理方法、情報処理装置及びプログラムに関する。
【背景技術】
【0002】
従来から、リレーショナルデータベース(RDB)に代表される種々のデータベースが知られている。RDB等のデータベースでは表形式データを対象としており、JOINや検索、ソート、集計等の様々な演算がサポートされている。大量のメモリを利用することなく、複数の表形式データを高速にJOINする従来技術として特許文献1に記載されている技術が知られている。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
上記の特許文献1に記載されている技術では配列や値リストを利用して複数の表形式データに対するJOINの高速化を実現しているが、JOIN後の表形式データに対する様々な演算も高速化することが可能である。
【0005】
本発明の一実施形態は、上記の点に鑑みてなされたもので、JOIN後の表形式データに対する演算の高速化を実現することを目的とする。
【課題を解決するための手段】
【0006】
上記目的を達成するため、一実施形態に係る情報処理方法は、自然数インデックス形式の2つのテーブルが所定のキーでJOIN結合された仮想テーブルに含まれる複数の次元で集計を行う情報処理方法であって、前記キーの値ごとに、前記2つのテーブルに含まれる前記複数の次元で集計を行う集計手順と、前記集計手順による集計の結果の和を計算する和計算手順と、をコンピュータが実行する。
【発明の効果】
【0007】
JOIN後の表形式データに対する演算の高速化を実現することができる。
【図面の簡単な説明】
【0008】
【
図1】本実施形態に係るデータ処理装置のハードウェア構成の一例を示す図である。
【
図2】本実施形態に係るデータ処理装置の機能構成の一例を示す図である。
【
図4】NNI形式のテーブルの一例を示す図である。
【
図5】変換配列及びnewSVLの準備の一例を説明するための図である。
【
図6】newSVLの作成の一例を説明するための図である。
【
図7】NNCの変換の一例を説明するための図である。
【
図9】InnerJOIN及びOuterJOINの一例を示す図である。
【
図10】NNI形式テーブルの表現方法の変更の一例を説明するための図である。
【
図11】JOIN対象のテーブル及びそのNNI形式の一例を示す図である。
【
図12】SVL共通化処理後のテーブルの一例を説明するための図である。
【
図13】InnerJOINにおけるSAcm作成処理の一例を説明するための図である。
【
図14】InnerJOINにおけるMAcm作成処理の一例を説明するための図である。
【
図15】NNI形式のInnerJOINテーブルの一例を示す図である。
【
図16】InnerJOINテーブルの一例を示す図である。
【
図17】OuterJOINにおけるSAcm作成処理の一例を説明するための図(その1)である。
【
図18】OuterJOINにおけるSAcm作成処理の一例を説明するための図(その2)である。
【
図19】OuterJOINにおけるSAcm作成処理の一例を説明するための図(その3)である。
【
図20】OuterJOINにおけるMAcm作成処理の一例を説明するための図(その1)である。
【
図21】OuterJOINにおけるMAcm作成処理の一例を説明するための図(その2)である。
【
図22】NNI形式のOuterJOINテーブルの一例を示す図である。
【
図23】OuterJOINテーブルの一例を示す図である。
【
図24】RightOuterJOIN部分の読み出しの一例を説明するための図である。
【
図25】LeftOuterJOIN部分の読み出しの一例を説明するための図である。
【
図26】InnerJOIN部分の読み出しの一例を説明するための図である。
【
図27】複数カラムをキーとしたJOIN対象のテーブル及びそのNNI形式の一例を示す図である。
【
図28】SVL共通化後における複数カラムをキーとしたJOIN対象のテーブル及びそのNNI形式の一例を示す図である。
【
図29】マルチキーフィールドの一例を示す図である。
【
図30】EOrdSetのソート及び転置の一例を説明するための図である。
【
図31】SVLとConv配列の作成の一例を説明するための図(その1)である。
【
図32】SVLとConv配列の作成の一例を説明するための図(その2)である。
【
図33】複数カラムをキーとしたJOIN用のNNI形式テーブルの一例を示す図である。
【
図34】複数カラムをキーとしたJOINにおけるSVL共通化処理の一例を説明するための図である。
【
図36】JOINキー値での分解の一例を説明するための図である。
【
図37】テーブルの積の一例を説明するための図である。
【
図39】ソート法における和及び積の一例を説明するための図である。
【
図40】キューブ法における和及び積の一例を説明するための図である。
【
図41】カラム転送の一例を説明するための図である。
【
図42】JOINにマッチした集合/マッチしなかった集合の抽出対象テーブルの一例を示す図である。
【
図43】JOINにマッチした集合/マッチしなかった集合の抽出対象テーブルのNNI形式の一例を示す図である。
【
図44】JOINにマッチした集合/マッチしなかった集合の抽出の一例を説明するための図(その1)である。
【
図45】JOINにマッチした集合/マッチしなかった集合の抽出の一例を説明するための図(その2)である。
【発明を実施するための形態】
【0009】
以下、本発明の一実施形態について説明する。本実施形態では、複数の表形式データをJOINした後の表形式データに対する種々の演算を高速に実行することが可能なデータ処理装置10について説明する。ここで、本実施形態では、これら種々の演算の一例として、JOIN後の表形式データに対するソート、検索、集計、JOINにマッチした集合とマッチしなかった集合の抽出、カラム転送の5つの演算を対象に説明する。なお、以下、表形式データのことを「テーブルデータ」又は単に「テーブル」ともいい、テーブルを構成するデータ(つまり、テーブルの行)の各々を「レコード」ともいう。また、テーブルの列(データ項目)のことを「カラム」ともいう。
【0010】
<自然数インデックス>
まず、自然数インデックス(NNI:Natural Number Index)と呼ばれる手法について説明する。自然数インデックスとは本発明者が考案した手法であり、テーブルをカラムごとのデータ列に分割し、それぞれのデータ列を以下の2種類の配列に分割する。以下、この分割を「成分分解」ともいう。
【0011】
・SVL(Sorted Value List)
・NNC(Natural Numbered Column)
SVLは、カラムの出現値を重複なく、かつ、昇順に並べた配列である。NNCは、カラムの各値を、SVL中のその値の格納位置に置き換えて表した配列である。したがって、NNCの各要素の値は、高々、SVLの配列サイズを超えない。また、自然数インデックスでは、NNCの各要素の格納位置がレコード番号として参照される。
【0012】
なお、上記のSVLは特許文献1で「値リスト」と呼ばれているものであり、NNCは「ポインタ配列」と呼ばれているものである。つまり、自然数インデックスとは、特許文献1でテーブルをカラムごとに値リストとポインタ配列に分割する手法のことを命名したものである。
【0013】
自然数インデックスは、数学で言う「順序集合」を扱うための配列であるOrdSet(Ordered Set)を使う。OrdSetは、レコード番号(NNC内の位置)を並べて作成する。OrdSetは集合であるため、重複する要素は出現しない。また、各要素の値はNNCのサイズを超えない。なお、上記のOrdSetは特許文献1で「順序付き集合」と呼ばれているものである。
【0014】
OrdSetを用いることで、検索でヒットしたレコード群を記録したり、ソートで並べ替えたレコード群の順を記録したりすることができる。また、このとき、検索やソートが行われる度に、新たなOrdSetが作成される。したがって、OrdSetを切り替えることで、検索やソート等の処理を行う前のテーブルも、検索やソート等の処理を行った後のテーブルも読み出すことが可能となる。
【0015】
本実施形態では、複数のテーブルを自然数インデックスで表現し、そのSVLを共通化した上で、共通化したSVLを利用してJOINを行って、自然数インデックスで表現されたJOINテーブルを作成する。そして、そのJOINテーブルに対してソートや検索、集計、JOINにマッチした集合とマッチしなかった集合の抽出、カラム転送等の種々の演算を行う。これにより、JOINテーブルに対するこれら種々の演算を高速に実行することが可能となる。なお、以下、自然数インデックスで表現されたテーブルを「自然数インデックス形式テーブル」や「NNI形式テーブル」等ともいう。
【0016】
なお、自然数インデックスでは配列を多用するが、本実施形態では、配列に関して以下のように定義するものとする。
【0017】
・配列は0ベースで、その要素は0以上の整数で参照されるものとする。したがって、例えば、大きさNの配列Aの要素はA[0],A[1],・・・,A[N-1]である。
【0018】
・Aを配列とするとき、A[-1]=0とする。
【0019】
<ハードウェア構成>
次に、本実施形態に係るデータ処理装置10のハードウェア構成について、
図1を参照しながら説明する。
図1は、本実施形態に係るデータ処理装置10のハードウェア構成の一例を示す図である。
【0020】
図1に示すように、本実施形態に係るデータ処理装置10は一般的なコンピュータ又はコンピュータシステムのハードウェア構成で実現され、入力装置11と、表示装置12と、外部I/F13と、通信I/F14と、プロセッサ15と、メモリ装置16とを有する。これら各ハードウェアは、それぞれがバス17を介して通信可能に接続されている。
【0021】
入力装置11は、例えば、キーボードやマウス、タッチパネル等である。表示装置12は、例えば、ディスプレイ等である。なお、データ処理装置10は、例えば、入力装置11及び表示装置12のうちの少なくとも一方を有していなくてもよい。
【0022】
外部I/F13は、記録媒体13a等の外部装置とのインタフェースである。データ処理装置10は、外部I/F13を介して、記録媒体13aの読み取りや書き込み等を行うことができる。なお、記録媒体13aとしては、例えば、CD(Compact Disc)、DVD(Digital Versatile Disk)、SDメモリカード(Secure Digital memory card)、USB(Universal Serial Bus)メモリカード等が挙げられる。
【0023】
通信I/F14は、データ処理装置10を通信ネットワークに接続するためのインタフェースである。プロセッサ15は、例えば、CPU(Central Processing Unit)やGPU(Graphics Processing Unit)等の各種演算装置である。メモリ装置16は、例えば、HDD(Hard Disk Drive)やSSD(Solid State Drive)、RAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリ等の各種記憶装置である。
【0024】
本実施形態に係るデータ処理装置10は、
図1に示すハードウェア構成を有することにより、後述する各種処理を実現することができる。なお、
図1に示すハードウェア構成は一例であって、データ処理装置10は、他のハードウェア構成を有していてもよい。例えば、データ処理装置10は、複数のプロセッサ15を有していてもよいし、複数のメモリ装置16を有していてもよい。
【0025】
<機能構成>
次に、本実施形態に係るデータ処理装置10の機能構成について、
図2を参照しながら説明する。
図2は、本実施形態に係るデータ処理装置10の機能構成の一例を示す図である。
【0026】
図2に示すように、本実施形態に係るデータ処理装置10は、SVL共通化処理部101と、JOIN作成処理部102と、検索処理部103と、ソート処理部104と、集計処理部105と、カラム転送処理部106と、集合抽出処理部107とを有する。これら各部は、例えば、データ処理装置10にインストールされた1以上のプログラムがプロセッサ15に実行させる処理により実現される。
【0027】
また、本実施形態に係るデータ処理装置10は、記憶部108を有する。記憶部108は、例えば、メモリ装置16により実現される。ただし、記憶部108は、例えば、データ処理装置10と通信ネットワークを介して接続される記憶装置(データベースサーバ等)により実現されていてもよい。
【0028】
記憶部108には、JOINや各種演算の対象となる種々のテーブルが記憶されている。なお、記憶部108に記憶されているテーブルはNNI形式テーブルであるものとする。
【0029】
SVL共通化処理部101は、NNI形式テーブルのSVLを共通化する。JOIN作成処理部102は、複数のNNI形式テーブルのJOINを行って、NNI形式のJOINテーブルを作成する。検索処理部103は、NNI形式のJOINテーブルに対して検索を行う。ソート処理部104は、NNI形式のJOINテーブルに対してソートを行う。集計処理部105は、NNI形式のJOINテーブルに対して集計を行う。カラム転送処理部106は、NNI形式のJOINテーブルに対して、JOIN元となった一方のテーブルのカラムを他方のテーブルに転送するためのカラム転送を行う。集合抽出処理部107は、NNI形式のJOINテーブルに対して、JOINにマッチした集合とマッチしなかった集合の抽出を行う。
【0030】
<実施例>
以降では、2つのテーブルのJOIN、及びJOINテーブルに対する検索、ソート、集計、カラム転送、JOINにマッチした集合とマッチしなかった集合の抽出の実施例について説明する。また、JOINについて説明する前に、NNI形式の2つのテーブルをJOINする際に必要となるSVLの共通化について説明する。
【0031】
[SVL共通化]
本実施例では、一例として、
図3に示すテーブル1000(Table-A)とテーブル2000(Table-B)を対象にSVL共通化について説明する。
【0032】
テーブル1000はカラム「Name」が含まれるレコードで構成されており、各レコードのName値は以下の通りである。
【0033】
・レコード番号「0」のレコードのName値は「Tom」
・レコード番号「1」のレコードのName値は「Bob」
・レコード番号「2」のレコードのName値は「Dolly」
また、テーブル2000もカラム「Name」が含まれるレコードで構成されており、各レコードのName値は以下の通りである。
【0034】
・レコード番号「0」のレコードのName値は「Bob」
・レコード番号「1」のレコードのName値は「Cathy」
・レコード番号「2」のレコードのName値は「Alice」
・レコード番号「3」のレコードのName値は「Jerry」
・レコード番号「4」のレコードのName値は「Bob」
なお、
図3に示す例では、テーブル1000及びテーブル2000の各レコードは1つのカラムのみを含むものとしたが、これは本実施例の説明を簡単にするためであって、当然に複数のカラムが含まれていてもよい。各レコードに複数のカラムが含まれている場合、上述したように、自然数インデックスのNNC及びSVLは各テーブルでカラムごとに作成される。
【0035】
図3に示すテーブル1000及びテーブル2000をそれぞれ自然数インデックスで表現したものを
図4に示す。
【0036】
なお、上述したように、OrdSetはテーブルごとに作成され、また検索やソート等が行われる度に新たなOrdSetが作成される。このため、どのテーブルのどのOrdSetかを明記するため、右肩に「(テーブル名-識別番号)」を付与して表記する場合がある。例えば、Table-Aの0番目のOrdSetは、OrdSet(A-0)と表記する場合がある。ただし、テーブル名が自明な場合は、左肩に「(識別番号)」を付与し、テーブル名は省略する。
【0037】
また、SVL及びNNCはどのテーブルのどのカラムに対応するかを明記するため、右肩に「(テーブル名-カラム名)」を付与して表記する場合がある。例えば、Table-Aのカラム「Name」に対応するSVLは、SVL(A-Name)と表記する場合がある。
【0038】
図4では、テーブル1000(Table-A)がOrdSet1100(OrdSet
(A-0))とNNC1200(NNC
(A-Name))とSVL1300(SVL
(A-Name))に成分分解された例を示している。また、同様に、
図4では、テーブル2000(Table-B)がOrdSet2100(OrdSet
(A-0))とNNC2200(NNC
(B-Name))とSVL2300(SVL
(B-Name))に成分分解された例を示している。
【0039】
なお、SVL1300はテーブル1000のカラム「Name」の出現値を重複なく、かつ、昇順に並べた配列である。一方で、NNC1200は、テーブル1000のカラム「Name」の各値を、SVL1300中のその値の格納位置に置き換えて表した配列である。例えば、テーブル1000のレコード番号「0」のName値「Tom」はSVL1300中で格納位置「2」に格納されているため、NNC1200の格納位置「0」の要素は「2」となる。同様に、テーブル1000のレコード番号「1」のName値「Bob」はSVL1300中で格納位置「0」に格納されているため、NNC1200の格納位置「1」の要素は「0」となる。同様に、テーブル1000のレコード番号「2」のName値「Dolly」はSVL1300中で格納位置「1」に格納されているため、NNC1200の格納位置「2」の要素は「1」となる。
【0040】
また、OrdSet1100は、テーブル1000のレコード番号(つまり、NNC内の位置)をそのまま並べて作成する。OrdSet2100、NNC2200及びSVL2300についても同様の方法で配列の各要素の値が決定される。
【0041】
以下では、
図4に示すNNC1200及びSVL1300とNNC2200及びSVL2300とを用いて、SVLを共通化する場合について説明する。なお、OrdSet1100及びOrdSet2100はSVLの共通化では特に用いられない。
【0042】
まず、SVL共通化処理部101は、SVLと同じサイズの変換配列と、各SVLの各値を格納する共通SVL(newSVL)とを準備する。すなわち、
図5に示すように、SVL共通化処理部101は、SVL1300と同じサイズの変換配列1400(Conv0)、SVL2300と同じサイズの変換配列2400(Conv1)、及びSVL1300及びSVL2300の各値を格納するnewSVL3100を準備する。ここで、newSVL3100のサイズは、SVL1300及びSVL2300で重複を除いた値の総数(つまり、SVL1300のサイズ+SVL2300のサイズ-SVL1300及びSVL2300で重複する値の数)である。
【0043】
次に、SVL共通化処理部101は、各SVLの値を先頭から比較し、小さい方の値をnewSVLに格納すると共に、その格納位置を、当該小さい方の値が格納されていたSVLに対応する変換配列に格納する。また、変換配列に格納位置が格納された場合、SVL共通化処理部101は、その変換配列に対応するSVLの比較位置を1つ下げる。なお、各SVLで比較位置にある値が同じ場合は、SVL共通化処理部101は、newSVLにおけるその値の格納位置を両方の変換配列に格納し、両方のSVLの比較位置を共に1つ下げる。
【0044】
具体的には、
図6に示すように、SVL共通化処理部101は、Step1-1~Step1-6を実行する。なお、SVL1300の比較位置とSVL2300の比較位置の初期状態は共に先頭(つまり、位置「0」)である。
【0045】
Step1-1:まず、SVL共通化処理部101は、SVL1300の位置「0」に格納されている値「Bob」と、SVL2300の位置「0」に格納されている値「Alice」とを比較する。この場合、「Alice」の方が小さい値であるため、SVL共通化処理部101は、「Alice」をnewSVL3100に格納すると共に、その格納位置「0」を変換配列2400(Conv1)に格納する。そして、SVL共通化処理部101は、SVL2300の比較位置を1つ下げて、比較位置を「1」とする。
【0046】
Step1-2:次に、SVL共通化処理部101は、SVL1300の位置「0」に格納されている値「Bob」と、SVL2300の位置「1」に格納されている値「Bob」とを比較する。この場合、同じ値であるため、SVL共通化処理部101は、「Bob」をnewSVL3100に格納すると共に、その格納位置「1」を変換配列1400(Conv0)及び変換配列2400(Conv1)に格納する。そして、SVL共通化処理部101は、SVL1300の比較位置を1つ下げて「1」とすると共に、SVL2300の比較位置を1つ下げて「2」とする。
【0047】
Step1-3:次に、SVL共通化処理部101は、SVL1300の位置「1」に格納されている値「Dolly」と、SVL2300の位置「2」に格納されている値「Cathy」とを比較する。この場合、「Cathy」の方が小さい値であるため、SVL共通化処理部101は、「Cathy」をnewSVL3100に格納すると共に、その格納位置「2」を変換配列2400(Conv1)に格納する。そして、SVL共通化処理部101は、SVL2300の比較位置を1つ下げて、比較位置を「3」とする。
【0048】
Step1-4:次に、SVL共通化処理部101は、SVL1300の位置「1」に格納されている値「Dolly」と、SVL2300の位置「3」に格納されている値「Jerry」とを比較する。この場合、「Dolly」の方が小さい値であるため、SVL共通化処理部101は、「Dolly」をnewSVL3100に格納すると共に、その格納位置「3」を変換配列1400(Conv0)に格納する。そして、SVL共通化処理部101は、SVL1300の比較位置を1つ下げて、比較位置を「2」とする。
【0049】
Step1-5:次に、SVL共通化処理部101は、SVL1300の位置「2」に格納されている値「Tom」と、SVL2300の位置「3」に格納されている値「Jerry」とを比較する。この場合、「Jerry」の方が小さい値であるため、SVL共通化処理部101は、「Jerry」をnewSVL3100に格納すると共に、その格納位置「4」を変換配列2400(Conv1)に格納する。そして、SVL共通化処理部101は、SVL2300の比較位置を1つ下げて、比較位置を「4」とする。なお、いずれか一方のSVLの比較位置が、そのSVLのサイズ数を超えた場合、比較終了となる。
【0050】
Step1-6:最後に、SVL共通化処理部101は、SVL2300の位置「4」には値が格納されていないため、SVL1300の位置「2」に格納されている値「Tom」をnewSVL3100に格納すると共に、その格納位置「5」を変換配列1400(Conv0)に格納する。そして、SVL共通化処理部101は、SVL1300の比較位置を1つ下げて、比較位置を「3」とする。
【0051】
これにより、SVL1300とSVL2300とを共通化したnewSVL3100が作成される。このnewSVL3100を作成した際に、変換配列1400及び変換配列2400が作成されたが、これらはそれぞれNNC1200及びNNC2200を変換するのに用いられる。
【0052】
そして、SVL共通化処理部101は、各変換配列を用いて、各NNCの値をそれぞれ変換する。
【0053】
具体的には、
図7に示すように、SVL共通化処理部101は、Step2-1~Step2-3及びStep3-1~Step3-5を実行する。
【0054】
Step2-1:まず、SVL共通化処理部101は、NNC1200の位置「0」に格納されている値「2」を、変換配列1400のその値「2」の位置に格納されている値「5」で更新する。これにより、NNC1200の位置「0」に格納されている値「2」が「5」に更新される。
【0055】
Step2-2:次に、SVL共通化処理部101は、NNC1200の位置「1」に格納されている値「0」を、変換配列1400のその値「0」の位置に格納されている値「1」で更新する。これにより、NNC1200の位置「1」に格納されている値「0」が「1」に更新される。
【0056】
Step2-3:そして、SVL共通化処理部101は、NNC1200の位置「2」に格納されている値「1」を、変換配列1400のその値「1」の位置に格納されている値「3」で更新する。これにより、NNC1200の位置「2」に格納されている値「1」が「3」に更新される。
【0057】
Step3-1:まず、SVL共通化処理部101は、NNC2200の位置「0」に格納されている値「1」を、変換配列2400のその値「1」の位置に格納されている値「1」で更新する。これにより、NNC1200の位置「0」に格納されている値「1」が「1」に更新される。
【0058】
Step3-2:次に、SVL共通化処理部101は、NNC2200の位置「1」に格納されている値「2」を、変換配列2400のその値「2」の位置に格納されている値「2」で更新する。これにより、NNC1200の位置「1」に格納されている値「2」が「2」に更新される。
【0059】
Step3-3:次に、SVL共通化処理部101は、NNC2200の位置「2」に格納されている値「0」を、変換配列2400のその値「0」の位置に格納されている値「0」で更新する。これにより、NNC1200の位置「2」に格納されている値「0」が「0」に更新される。
【0060】
Step3-4:次に、SVL共通化処理部101は、NNC2200の位置「3」に格納されている値「3」を、変換配列2400のその値「3」の位置に格納されている値「4」で更新する。これにより、NNC1200の位置「3」に格納されている値「3」が「4」に更新される。
【0061】
Step3-5:そして、SVL共通化処理部101は、NNC2200の位置「4」に格納されている値「1」を、変換配列2400のその値「1」の位置に格納されている値「1」で更新する。これにより、NNC1200の位置「4」に格納されている値「1」が「1」に更新される。
【0062】
これにより、NNC1200及びNNC2200が変換配列1400及び変換配列2400によりそれぞれ変換される。この変換後のNNC1200及びNNC2200をそれぞれnewNNC1210及びnewNNC2210と表記する。
【0063】
以上により、
図8に示すnewSVL3100と、newNNC1
210及びnewNNC2
210とが得られる。これらのnewSVL3100とnewNNC1
210及びnewNNC2
210とがSVL共通化処理の結果であり、この結果を用いることで2つのテーブルのJOIN及びJOINテーブルに対する各種演算を高速に実現することができる。
【0064】
[JOIN]
2つのテーブル間のJOINについて説明する。JOINとは2つのテーブルを仮想的に結合して1つのテーブルを作成する操作のことであり、主に、InnerJOINとOuterJOINの2つに大別される。なお、2つのテーブルを仮想的に結合することを明示して、JOINを「仮想JOIN」等と呼んでもよい。
【0065】
InnerJOINでは、例えば、
図9の上段に示すように、左右のいずれのテーブルのレコードも、反対側のテーブルにJOINキー(JKey)がマッチするレコードがある場合のみJOINテーブル中に出現する。ただし、出現回数は1回とは限らない。
【0066】
一方で、OuterJOINでは、例えば、
図9の下段に示すように、左右のいずれのテーブルのレコードも、反対側のテーブルにJOINキー(JKey)がマッチするレコードがあるか否かに関わらずJOINテーブル中に出現する。ただし、出現回数は1回とは限らない。また、マッチしたJOINキーが存在しない側のテーブルのカラムには「NULL」が設定される。
【0067】
なお、以下、JOIN対象のテーブルのうち、レコードの順序が保存されるテーブルを「Master側テーブル」や「Master側」等という。一方で、レコードの順序が必ずしも保存されないテーブルを「Slave側テーブル」や「Slave側」等という。
図9に示す例では、Table-XがMaster側、Table-YがSlave側である。
【0068】
OuterJOINでは、Slave側のみに存在するJOINキー値を持つレコードはJOINテーブル上で位置が決まらないため、通常、先頭又は末尾から順に配置する。
図9に示す例では、Table-Yのみに存在するJOINキー値「D」を持つレコードをJOINテーブルの先頭に配置した。
【0069】
図9に示したように、OuterJOINでは、マッチしたJOINキーが存在しない側のテーブルのカラムには「NULL」が設定される。このため、JOINを行う対象のテーブル内に事前にNULLレコードを内包しておくと便利である。そこで、本実施形態では、
図10に示すように、JOIN対象のNNI形式テーブルのOrdSetを「1」から開始するようにすると共に、NNCの先頭に「0」、SVLの位置「0」に「NULL」を追加する。このようにNNI形式の表現方法を変更することで、JOIN前では「NULL」は隠蔽されており見えないが、JOINテーブルで必要に応じて「NULL」を利用することができる。
【0070】
なお、SVLは各値を昇順に格納しているため、NULLは最小値である必要がある。したがって、実際には、SVLに格納されている値が整数であれば263、浮動小数点であれば-∞、文字列であれば空文字等をNULLとすればよい。
【0071】
JOINテーブルは2つのテーブルの仮想的な結合であるため、データの加工や編集はできない一方で、検索やソート、集計等の演算は高速に行うことができる。これは、実テーブルではメモリ不足等のため運用が困難な大量のレコード(例えば、数十億レコード等)でも仮想的な結合であるため、実テーブル上のレコード数で運用可能なためである。
【0072】
(InnerJOIN)
以下、
図11に示すテーブル4000(Table-A)とテーブル5000(Table-
B)を対象として、JOINキー「Name」によりInnerJOIN(より正確にはLeftInnerJOIN)を行ってJOINテーブルを作成する場合について説明する。ここで、テーブル4000は、OrdSet4100(OrdSet
(A-0))とNNC4210(NNC
(A-Name))とSVL4310(SVL
(A-Name))とNNC4220(NNC
(A-Point))とSVL4320(SVL
(A-Point))とに成分分解されている。同様に、テーブル5000は、OrdSet5100(OrdSet
(B-0))とNNC5210(NNC
(B-Name))とSVL5310(SVL
(B-Name))とNNC5220(NNC
(B-Area))とSVL5320(SVL
(B-Area))とに成分分解されている。
【0073】
このとき、以下のStep4-1~Step4-3が実行されることにより、テーブル4000とテーブル5000をInnerJOINで結合したJOINテーブルが作成される。
【0074】
Step4-1:まず、SVL共通化処理部101は、JOINキーに関するSVL及びNNCを用いて、JOIN対象のNNI形式テーブルのSVLを共通化する。すなわち、
図12に示すように、SVL共通化処理部101は、NNC4210(NNC
(A-Name))及びSVL4310(SVL
(A-Name))とNNC5210(NNC
(B-Name))及びSVL5310(SVL
(B-Name))とを用いて、上述したSVL共通化処理によりSVLを共通化する。これにより、newNNC4211(newNNC
(A-Name))とnewNNC5211(newNNC
(B-Name))とnewSVL6100(newSVL
(Name))とが作成される。なお、以降では、SVL共通化処理によって作成されたNNCやSVLについて、「new」との表記を省略する場合がある。
【0075】
Step4-2:次に、JOIN作成処理部102は、OrdSet(B-0)を用いて、SAcm(Slave-side Accumulation array)と呼ぶ配列を作成する。SAcmとはSlave側のOrdSetをJOINキーでソートした際に、各JOINキー値に対応するSlave側テーブルのレコード群の終了位置の次の位置を特定する値が格納された配列である。この配列はAggrとも呼ばれ、上記の特許文献1では「スレイブ側累計数配列」と呼ばれているものである。
【0076】
具体的には、
図13に示すように、JOIN作成処理部102は、OrdSet5100(OrdSet
(B-0))をJOINキー「Name」で昇順にソートしてOrdSet5110(OrdSet
(B-1))を作成する。このOrdSet5110(OrdSet
(B-1))に格納されている値は、順に、JOINキー値「Alice」、「Amy」、「Bob」、「Bob」、「Dolly」、「Dolly」を表す。
【0077】
また、JOIN作成処理部102は、先頭に「0」を格納したAggr配列5400を準備した上で、JOINキー値の累計数を順にAggr配列5400に格納する。これにより、Aggr配列5400としてSAcm5400が作成される。このSAcm5400の各要素にはそれぞれ以下が格納される。
【0078】
・0番目の要素:JOINキー値「NULL」の累計数
・1番目の要素:JOINキー値「Alice」の累計数
・2番目の要素:JOINキー値「Alice」及び「Amy」の累計数
・3番目の要素:JOINキー値「Alice」~「Bob」の累計数
・4番目の要素:JOINキー値「Alice」~「Cathy」の累計数
・5番目の要素:JOINキー値「Alice」~「Dolly」の累計数
したがって、Slave側のテーブル5000で、i番目のJOINキー値newSVL[i]を持つレコードの数(出現数)は、SAcm[i]-SAcm[i-1]で算出することができる。また、i番目のJOINキー値newSVL[i]を持つレコードのレコード番号は、SAcm[i-1]≦x≦SAcm[i]-1を満たす各xに対してOrdSet(B-1)[x]で算出することができる。
【0079】
Step4-3:次に、JOIN作成処理部102は、OrdSet(A-0)とNNC(A-Name)とSAcmとを用いて、MAcm(Master-side Accumulation array)と呼ぶ配列を作成する。MAcmとはJOINテーブルにおけるMaster側テーブルのJOINキー値の繰り返し数の累計数を表す配列である。この配列は、上記の特許文献1では「マスタ側累計数配列」と呼ばれているものである。
【0080】
具体的には、JOIN作成処理部102は、以下によりCount(Master[i])を計算する。
【0081】
Count(Master[i])=SAcm[NNC
(A-Name)[OrdSet
(A-0)[i]]]-SAcm[NNC
(A-Name)[OrdSet
(A-0)[i]]-1]
上記のCount(Master[i])は、JOINキーに関して、Master側テーブルのi番目のレコードMaster[i]に対応するSlave側テーブルのレコード数を表している。i=0,1,・・・,5に関する各Count(Master[i])は
図14の左図のようになる。これは、例えば、テーブル4000の0番目のレコードには、テーブル5000の2つのレコード(1番目及び3番目のレコード)が対応することを意味している。同様に、テーブル4000の1番目のレコードには、テーブル5000の2つのレコード(2番目及び4番目のレコード)が対応することを意味している。同様に、テーブル4000の3番目のレコードには、テーブル5000で対応するレコードが無いことを意味している。他についても同様である。
【0082】
そして、JOIN作成処理部102は、i=0,1.・・・,5に対して順にCount(Master[i])の累計数を算出する。これにより、MAcm4400が作成される。
【0083】
なお、MAcm[i-1]はMaster[i]のJOINテーブル中の出現開始位置を表す。また、MAcm[i]-MAcm[i-1]はMaster[i]のJOINテーブル中のリピート回数を表す。
【0084】
以上のStep4-1~Step4-3により、
図15に示すようなJOINテーブルが作成される。
図15に示すJOINテーブルは、MAcm4400、OrdSet4100、NNC4211、SVL6100、NNC4220、SVL4320、SAcm5400、OrdSet51
10、NNC5211、NNC5
220、及びSVL5320で構成されている。このJOINテーブルを表形式で表現したものを
図16に示す。
【0085】
ここで、InnerJOINにより結合されたJOINテーブルからレコードを読み出す場合について説明する。JOINテーブルは仮想的なテーブルであるため、JOINテーブルのレコード番号I
(JOIN)が指定された際に、Master側テーブルのレコード番号I
(master)とSlave側テーブルのレコード番号I
(slave)を特定できることが、JOINテーブルからレコード番号I
(JOIN)のレコードが読み出せることに相当する。一例として、
図16に示すJOINテーブルの1番目(つまり、I
(JOIN)=1)のレコードを読み出す場合について、
図15を参照しながら、以下のStep5-1~Step5-4により説明する。
【0086】
Step5-1:JOIN作成処理部102は、I
(master)を特定する。これは、MAcm[j]>I
(JOIN)を満たす最小のjを求めて、I
(master)=jとすればよい。なお、MAcm[j]>I
(JOIN)を満たす最小のjは、例えば、バイセクション法等を使用して求めればよい。
図15に示すJOINテーブルでは、MAcm[0]が、MAcm[j]>I
(JOIN)を満たす最小のjであるためj=0が特定され、I
(master)=0となる。
【0087】
Step5-2:JOIN作成処理部102は、offsetを求める。offsetとは、Master[I(master)]に対応する1以上のSlave[I(slave)]があるが、その中の0から始まる順位である。なお、Slave[I(slave)]はSlave側テーブルのI(slave)番目のレコードを表す。
【0088】
MAcm[I(master)-1]はJOINテーブルにおけるMaster[I(master)]の開始位置を表すため、offsetは以下により求まる。
【0089】
offset=I
(JOIN)-MAcm[I
(master)-1]
したがって、
図15に示すJOINテーブルでは、offset=1と求まる。
【0090】
Step5-3:JOIN作成処理部102は、baseを求める。baseとは、Master[I(master)]に対応する1以上のSlave[I(slave)]があるが、OrdSet(B-1)でのその開始位置である。baseは以下により求まる。
【0091】
base=SAcm[NNC
(A-Name)[OrdSet
(A-0)[I
(master)]]-1]
したがって、
図15に示すJOINテーブルでは、base=2と求まる。
【0092】
Step5-4:JOIN作成処理部102は、以下によりI(slave)を求める。
【0093】
I
(slave)=base+offset
したがって、
図15に示すJOINテーブルでは、I
(slave)=3と求まる。
【0094】
以上により、I(JOIN)に対してI(master)及びI(slave)が特定されたため、JOINテーブルのi番目のレコードをJoin[i]と表記すれば、Join[I(JOIN)]=Master[I(master)]&Slave[I(slave)]によりレコードを読み出すことが可能となる。なお、&はレコードの結合を表す。例えば、Join[I(JOIN)=1]=Master[I(master)]&Slave[I(slave)]=Master[0]&Slave[3]=(Bob,10)&(Bab,East)と読み出すことが可能となる。
【0095】
(OuterJOIN)
以下、
図11に示すテーブル4000(Table-A)とテーブル5000(Table-
B)を対象として、JOINキー「Name」によりOuterJOIN(より正確にはFullOuterJOIN)を行ってJOINテーブルを作成する場合について説明する。
【0096】
なお、FullOuterJOINでは、InnerJOINとLeftOuterJOINとRightOuterJOINの3つのJOINを行うことに相当する。LeftOuterJOINとは、Slave側に対応するレコードがないMaster側レコードに関してはその順序が保存されたままSlave側のカラムにNULLが設定されるものである。一方で、RightOuterJOINとは、Master側に対応するレコードがないSlave側レコードに関しては先頭(又は末尾)に移動させた上で、Master側のカラムにNULLが設定されるものである。
【0097】
このとき、以下のStep6-1~Step6-3が実行されることにより、テーブル4000とテーブル5000をOuterJOINで結合したJOINテーブルが作成される。
【0098】
Step6-1:まず、SVL共通化処理部101は、上記のStep4-1と同様に、JOINキーに関するSVL及びNNCを用いて、JOIN対象のNNI形式テーブルのSVLを共通化する。
【0099】
Step6-2:次に、JOIN作成処理部102は、OrdSet(B-0)を用いて、SAcmを作成する。具体的には、JOIN作成処理部102は、以下の(1-1)~(1-3)によりSAcmを作成する。
【0100】
(1-1)まず、
図17に示すように、JOIN作成処理部102は、OrdSet5100を、JOINにマッチした集合とマッチしなかった集合とに分離する。このとき、Slave側のJOINキーがNULLのものもマッチしない集合に入れる。NULLはマッチさせないという慣習があるためである。以下、マッチした集合をOrdSet5120(OrdSet
(B-1))、マッチしなかった集合をOrdSet5130(OrdSet
(B-2))とする。なお、JOINにマッチした集合とマッチしなかった集合とを抽出する演算の詳細については後述する。
【0101】
(1-2)次に、
図18に示すように、JOIN作成処理部102は、JOINにマッチした集合であるOrdSet5120(OrdSet
(B-1))をソートしてOrdSet5121(OrdSet
(B-3))を作成する。また、このとき、JOIN作成処理部102は、Aggr5410を作成する。Aggr5410は、上述したように、先頭に「0」を格納した上で、JOINキー値の累計数を順に格納することで作成される。
【0102】
(1-3)そして、
図19に示すように、JOIN作成処理部102は、Agg
r5410の各要素に対してOrdSet5130の要素数(サイズ)分だけ加算すると共に、OrdSet5130とOrdSet5121とを結合してOrdSet5140(OrdSet
(B-4))を作成する。OrdSet5130の要素数が加算された後のAgg
r5410がSAcm5410となる。なお、OrdSet5140はSlave側テーブルのソート集合となる。
【0103】
Step6-3:次に、JOIN作成処理部102は、OrdSet(A-0)とNNC(A-Name)とSAcmとを用いて、MAcmを作成する。
【0104】
具体的には、JOIN作成処理部102は、以下の(2-1)~(2-3)によりMAcmを作成する。
【0105】
(2-1)まず、JOIN作成処理部102は、以下によりCount(Master[i])を計算する。
【0106】
Count(Master[i])=SAcm[NNC
(A-Name)[OrdSet
(A-0)[i]]]-SAcm[NNC
(A-Name)[OrdSet
(A-0)[i]]-1]
(2-2)次に、
図20に示すように、JOIN作成処理部102は、Count(Master[i])=
0である場合は「1」を加える。そして、JOIN作成処理部102は、i=0,1.・・・,5に対して順にCount(Master[i])の累計数を算出する。これにより、中間段階のMAcm4410が作成される。
【0107】
なお、Count(Master[i])=0である場合に1を加えるのはLeftOuterJOINを実現するためである。
図20に示す例では、Count(Master[2])とCount(Master[5])のそれぞれに1を加えることでJOINキー値「Cathy」のレコードが消滅せずにJOINテーブルに残ることになり、LeftOuterJOINが実現できる。
【0108】
(2-3)そして、
図21に示すように、JOIN作成処理部102は、中間段階のMAcm4410から最終的なMAcm4420を作成すると共に、OrdSet4100からOrdSet4110(OrdSet
(A-1))を作成する。ここで、JOINにマッチしなかった集合であるOrdSet5130のサイズを「size(B-2)」と表記すれば、MAcm4420は、中間段階のMAcm4410の先頭に「size(B-2)」を追加した上で、各要素に「size(B-2)」を加算することで作成される。なお、MAcm4420の先頭の要素「size(B-2)=1」はNULLが設定されたレコードのリピート回数を表す。
【0109】
一方で、OrdSet4110は、OrdSet4100の先頭に「0」を追加することで作成される。なお、OrdSet4110の先頭の要素「0」は、Master側のレコードにNULLが設定されていることを表す。
【0110】
以上のStep6-1~Step6-3により、
図22に示すようなJOINテーブルが作成される。
図22に示すJOINテーブルは、MAcm4410、OrdSet4110、NNC4211、SVL6100、NNC4220、SVL4320、SAcm5410、OrdSet5140、NNC5211、NNC5
220、及びSVL5320で構成されている。このJOINテーブルを表形式で表現したものを
図23に示す。
【0111】
ここで、OuterJOINにより結合されたJOINテーブルからレコードを読み出す場合について説明する。OuterJOINにより結合されたJOINテーブルには、RightOuterJOINで結合されたレコードと、LeftOuterJOINで結合されたレコードと、InnerJOINで結合されたレコードとが含まれる。以下、それぞれのレコードの読み出しについて説明する。
【0112】
・RightOuterJOIN部分の読み出し
一例として、
図23に示すJOINテーブルの0番目(つまり、I
(JOIN)=0)のレコードを読み出す場合について、
図24を参照しながら、以下のStep7-1~Step7-2により説明する。
【0113】
Step7-1:JOIN作成処理部102は、I
(master)を特定する。これは、MAcm[j]>I
(JOIN)を満たす最小のjを求めて、I
(master)=jとすればよい。なお、MAcm[j]>I
(JOIN)を満たす最小のjは、例えば、バイセクション法等を使用して求めればよい。
図24に示すように、
図22に示すJOINテーブルでは、MAcm[0]が、MAcm[j]>I
(JOIN)を満たす最小のjであるためj=0が特定され、I
(master)=0となる。
【0114】
Step7-2:JOIN作成処理部102は、I(JOIN)=0のレコードがRightOuterJOINであるか否かをチェックする。これは、OrdSet(A-1)[I(master)]=0であるか否かをチェックすればよい。OrdSet(A-1)[I(master)]=0であればI(JOIN)のレコードはRightOuterJOINで結合されたレコードであり、I(slave)=I(JOIN)となる。
【0115】
図24に示すように、
図22に示すJOINテーブルでは、OrdSet
(A-1)[0]=0であるため、I
(JOIN)=0のレコードはRightOuterJOINで結合されたレコードであり、I
(slave)=I
(JOIN)=0である。
【0116】
以上により、Join[I(JOIN)=0]=Master[I(master)]&Slave[I(slave)]=Master[0]&Slave[0]=(NULL,NULL)&(Amy,West)と読み出すことが可能となる。
【0117】
・LeftOuterJOIN部分の読み出し
一例として、
図23に示すJOINテーブルの9番目(つまり、I
(JOIN)=9)のレコードを読み出す場合について、
図25を参照しながら、以下のStep8-1~Step8-3により説明する。
【0118】
Step8-1:JOIN作成処理部102は、I
(master)を特定する。
図25に示すように、
図22に示すJOINテーブルでは、MAcm[6]が、MAcm[j]>I
(JOIN)を満たす最小のjであるためj=6が特定され、I
(master)=6となる。
【0119】
Step8-2:JOIN作成処理部102は、I
(JOIN)=9のレコードがRightOuterJOINであるか否かをチェックする。
図25に示すように、
図22に示すJOINテーブルでは、OrdSet
(A-1)[I
(master)]=6であるため、I
(JOIN)=9のレコードはRightOuterJOINで結合されたレコードではない。
【0120】
Step8-3:JOIN作成処理部102は、I(JOIN)=9のレコードがLeftOuterJOINであるか否かをチェックする。これは、Count(Master[I(master)])=0であるか否かをチェックすればよい。Count(Master[I(master)])=0であればI(JOIN)のレコードはLeftOuterJOINで結合されたレコードであり、この場合、I(slave)は存在しないが、Slave側の値はNULL(つまり、SVL[0])となる。
【0121】
図25に示すように、
図22に示すJOINテーブルでは、Count(Master[6])=SAcm[NNC
(A-Name)[OrdSet
(A-1)[6]]]-SAcm[NNC
(A-Name)[OrdSet
(A-1)[6]]-1]=4-4=0である。このため、I
(JOIN)=9のレコードはLeftOuterJOINで結合されたレコードである。
【0122】
以上により、Join[I(JOIN)=9]=Master[I(master)]&(NULL,NULL)=(Cathy,12)&(NULL,NULL)と読み出すことが可能となる。
【0123】
・InnerJOIN部分の読み出し
一例として、
図23に示すJOINテーブルの4番目(つまり、I
(JOIN)=4)のレコードを読み出す場合について、
図26を参照しながら、以下のStep9-1~Step9-6により説明する。
【0124】
Step9-1:JOIN作成処理部102は、I
(master)を特定する。
図26に示すように、
図22に示すJOINテーブルでは、MAcm[2]が、MAcm[j]>I
(JOIN)を満たす最小のjであるためj=2が特定され、I
(master)=2となる。
【0125】
Step9-2:JOIN作成処理部102は、I
(JOIN)=4のレコードがRightOuterJOINであるか否かをチェックする。
図26に示すように、
図22に示すJOINテーブルでは、OrdSet
(A-1)[I
(master)]=2であるため、I
(JOIN)=4のレコードはRightOuterJOINで結合されたレコードではない。
【0126】
Step9-3:JOIN作成処理部102は、I
(JOIN)=4のレコードがLeftOuterJOINであるか否かをチェックする。
図26に示すように、
図22に示すJOINテーブルでは、Count(Master[2])=SAcm[NNC
(A-Name)[OrdSet
(A-1)[2]]]-SAcm[NNC
(A-Name)[OrdSet
(A-1)[2]]-1]=6-4=2である。このため、I
(JOIN)=4のレコードはLeftOuterJOINで結合されたレコードではない。
【0127】
Step9-4:JOIN作成処理部102は、offset=I(JOIN)-MAcm[I(master)-1]によりoffset=1を求める。
【0128】
Step9-5:JOIN作成処理部102は、base=SAcm[NNC(A-Name)[OrdSet(A-1)[I(master)]]-1]によりbase=4を求める。
【0129】
Step9-6:JOIN作成処理部102は、I(slave)=base+offsetによりI(slave)=5を求める。
【0130】
以上により、Join[I(JOIN)=4]=Master[I(master)]&Slave[I(slave)]=Master[2]&Slave[5]=(Dolly,12)&(Dolly,North)と読み出すことが可能となる。
【0131】
(複数カラムをJOINキーとした場合)
複数のカラムをJOINキーとしてJOINテーブルを作成したい場合がある。そこで、以下では、
図27に示すテーブル7000(Table-A)とテーブル8000(Table-
B)を対象として、JOINキー「First」及び「Family」によりJOINを行ってJOINテーブルを作成する場合について説明する。
【0132】
ここで、テーブル7000は、OrdSet7100(OrdSet(A-0))とNNC7210(NNC(A-First))とSVL7310(SVL(A-First))とNNC7220(NNC(A-Family))とSVL7320(SVL(A-Family))とに成分分解されている。なお、テーブル7000はカラム「Country」に関してもNNC(A-Country)とSVL(A-Country)と成分分解されているが、図示を省略している。
【0133】
同様に、テーブル8000は、OrdSet8100(OrdSet(B-0))とNNC8210(NNC(B-First))とSVL8310(SVL(B-First))とNNC8220(NNC(B-Family))とSVL8320(SVL(B-Family))とに成分分解されている。なお、テーブル8000はカラム「Age」に関してもNNC(B-Age)とSVL(B-Age)と成分分解されているが、図示を省略している。
【0134】
このとき、まず、以下のStep10-1~Step10-5が実行されることにより、複数のカラムをJOINキーとしたJOINテーブルが作成される。
【0135】
Step10-1:まず、SVL共通化処理部101は、JOINキーに関するSVL及びNNCを用いて、JOINキーごとに、JOIN対象のNNI形式テーブルのSVLを共通化する。
【0136】
すなわち、SVL共通化処理部101は、NNC7210(NNC
(A-First))及びSVL7310(SVL
(A-First))とNNC8210(NNC
(B-First))及びSVL8310(SVL
(B-First))とを用いて、上述したSVL共通化処理によりSVLを共通化する。これにより、
図28に示すように、NNC7211(NNC
(A-First))及びSVL7311(SVL
(A-First))と、NNC8211(NNC
(B-First))及びSVL8311(SVL
(B-First))とが作成される。なお、SVL7311及びSVL8311が、カラム「First」で共通化されたSVLである。
【0137】
同様に、SVL共通化処理部101は、NNC7220(NNC
(A-Family))及びSVL7320(SVL
(A-Family))とNNC8220(NNC
(B-Family))及びSVL8320(SVL
(B-Family))とを用いて、上述したSVL共通化処理によりSVLを共通化する。これにより、
図28に示すように、NNC7221(NNC
(A-Family))及びSVL7321(SVL
(A-Family))と、NNC8221(NNC
(B-Family))及びSVL8321(SVL
(B-Family))とが作成される。なお、SVL7321及びSVL8321が、カラム「Family」で共通化されたSVLである。
【0138】
Step10-2:JOIN作成処理部102は、JOINに使用するNNI形式テーブルを作成する。具体的には、JOIN作成処理部102は、以下の(3-1)~(3-6)によりNNI形式テーブルを作成する。
【0139】
(3-1)まず、
図29に示すように、JOIN作成処理部102は、NNC7211とNNC7221を並べたマルチキーフィールド7250と、NNC8211とNNC8221を並べたマルチキーフィールド8250とを作成する。なお、マルチキーフィールド7250及びマルチキーフィールド8250は2次元の配列である。
【0140】
(3-2)次に、
図30に示すように、JOIN作成処理部102は、EOrdSet7110(EOrdSet
(A-0))とEOrdSet8110(EOrdSet
(B-0))を作成する。EOrdSet7110及びEOrdSet8110は拡張全体集合と呼ばれ、それぞれOrdSet7100(OrdSet
(A-0))及びOrdSet8100(OrdSet
(B-0))の先頭に「0」を追加した配列である。
【0141】
(3-3)次に、
図30に示すように、JOIN作成処理部102は、EOrdSet7110をカラム「Family」で昇順にソートしてEOrdSet7120(EOrdSet
(A-1))を作成した後、カラム「First」で昇順にソートしてEOrdSet7130(EOrdSet
(A-2))を作成する。同様に、JOIN作成処理部102は、EOrdSet8110をカラム「Family」で昇順にソートしてEOrdSet8120(EOrdSet
(B-1))を作成した後、カラム「First」で昇順にソートしてEOrdSet8130(EOrdSet
(B-2))を作成する。
【0142】
(3-4)次に、
図30に示すように、JOIN作成処理部102は、EOrdSet7130に対して転置操作を行ってEOrdSet7140(EOrdSet
(A-3))を作成する。同様に、JOIN作成処理部102は、EOrdSet8130に対して転置操作を行ってEOrdSet8140(EOrdSet
(B-3))を作成する。ここで、i,j=0,・・・,nとして、Aをi≠jのときA[i]≠A[j]を満たす配列であるとした場合、Aに対する転置操作とは、j=A[i]のときi=A
-1[j]を満たす配列A
-1に変換する操作のことをいう。
【0143】
(3-5)次に、JOIN作成処理部102は、SVL及びConv配列を作成する。
【0144】
具体的には、JOIN作成処理部102は、
図31に示す手順1-1~手順1-6を実行することで、SVL7251(SVL
(A-Comb))とConv7430(Conv
A)を作成する。すなわち、JOIN作成処理部102は、EOrdSet7130に従ってマルチキーフィールド7250の値を出力することでSVL7251(SVL
(A-Comb))を作成すると共に、SVL7251におけるその出力位置をConv7430(Conv
A)とする。ただし、出力対象の値が前回と同じ値である場合は出力しない。
【0145】
手順1-1:JOIN作成処理部102は、EOrdSet7130の位置「0」に格納されている値「0」を用いて、マルチキーフィールド7250の位置「0」にある値「(0,0)」をSVL7251の位置「0」に出力する。また、JOIN作成処理部102は、出力位置「0」をConv7430に格納する。
【0146】
手順1-2:次に、JOIN作成処理部102は、EOrdSet7130の位置「1」に格納されている値「3」を用いて、マルチキーフィールド7250の位置「3」にある値「(2,2)」をSVL7251の位置「1」に出力する。また、JOIN作成処理部102は、出力位置「1」をConv7430に格納する。
【0147】
以降、同様に、手順1-3~手順1-6を繰り返すことで、SVL7251(SVL(A-Comb))とConv7430(ConvA)が作成される。
【0148】
同様に、JOIN作成処理部102は、
図32に示す手順2-1~手順2-6を実行することで、SVL8251(SVL
(B-Comb))とConv8430(Conv
B)を作成する。すなわち、JOIN作成処理部102は、EOrdSet8130に従ってマルチキーフィールド8250の値を出力することでSVL8251(SVL
(B-Comb))を作成すると共に、SVL8251におけるその出力位置をConv8430(Conv
B)とする。ただし、出力対象の値が前回と同じ値である場合は出力しない。
【0149】
手順2-1:JOIN作成処理部102は、EOrdSet8130の位置「0」に格納されている値「0」を用いて、マルチキーフィールド8250の位置「0」にある値「(0,0)」をSVL8251の位置「0」に出力する。また、JOIN作成処理部102は、出力位置「0」をConv8430に格納する。
【0150】
手順2-2:次に、JOIN作成処理部102は、EOrdSet8130の位置「1」に格納されている値「5」を用いて、マルチキーフィールド8250の位置「5」にある値「(1,4)」をSVL8251の位置「1」に出力する。また、JOIN作成処理部102は、出力位置「1」をConv8430に格納する。
【0151】
以降、同様に、手順2-3~手順2-6を繰り返すことで、SVL8251(SVL(B-Comb))とConv8430(ConvB)が作成される。
【0152】
(3-6)そして、JOIN作成処理部102は、NCCを作成する。具体的には、JOIN作成処理部102は、以下によりNNC7510(NNC(A-Comb))とNNC8510(NNC(B-Comb))を作成する。
【0153】
NNC(A-Comb)[i]=ConvA[EOrdSet(A-3)[i]]
NNC(B-Comb)[i]=ConvB[EOrdSet(B-3)[i]]
これは、EOrdSet(A-3)をConvAにより変換することでNNC(A-Comb)を作成することを意味する。同様に、EOrdSet(B-3)をConvBにより変換することでNNC(B-Comb)を作成することを意味する。
【0154】
以上により、
図33に示すNNI形式テーブルが得られる。
図33に示すNNI形式テーブルは複数カラムをキーとしたJOIN用のNNI形式テーブルであり、Master側はSVL7251(SVL
(A-Comb))とConv7430(Conv
A)とNNC7510(NNC
(A-Comb))で構成されており、Slave側はSVL8251(SVL
(B-Comb))とConv8430(Conv
B)とNNC8510(NNC
(B-Comb))で構成されている。
【0155】
図33に示すNNI形式テーブルを作成することにより、単一カラムをJOINキーとした場合と同様の処理でNNI形式のJOINテーブルを作成することが可能となる。したがって、以下のStep10-3~Step10-5では、単一カラムをJOINキーとした場合と同様の処理が行われる。
【0156】
Step10-3:JOIN作成処理部102は、SVL7251(SVL
(A-Comb))及びSVL8251(SVL
(B-Comb))とNNC7510(NNC
(A-Comb))及びNNC8510(NNC
(B-Comb))とを用いて、上述したSVL共通化処理によりSVLを共通化する。これにより、
図34に示すように、newSVL9100と、NNC7511(NNC
(A-Comb))及びNNC8511(NNC
(B-Comb))とが作成される。
【0157】
Step10-4:次に、JOIN作成処理部102は、SAcmを作成する。なお、InnerJOINの場合は上記のStep4-2、OuterJOINの場合は上記のStep6-2と同様にSAcmを作成すればよい。
【0158】
Step10-5:次に、JOIN作成処理部102は、MAcmを作成する。なお、InnerJOINの場合は上記のStep4-3、OuterJOINの場合は上記のStep6-3と同様にMAcmを作成すればよい。
【0159】
以上のStep10-1~Step10-4により、複数カラムをキーとしたJOINテーブルが作成される。なお、JOINテーブルからレコードを読み出す場合も、InnerJOIN及びOuterJOINで説明した通りである。
【0160】
[JOINテーブルに対する検索]
JOINテーブルに対する検索は、Master側又はSlave側のテーブルを検索処理部103によって検索した後、JOIN作成処理部102によって再度JOINすることで実現できる。なお、再度JOINを行う際には、SVLの共通化とその関連の処理は既に済んでいるため行わなくてよい。
【0161】
なお、検索にはいくつかの種類がある。
【0162】
・Master側テーブル又はSlave側テーブルを単独で検索すればよい場合
例えば、
図11に示すテーブル4000でカラム「Point」の値が「11」以上であるレコードを検索する場合、
図11に示すテーブル5000でカラム「Area」の値が「North」であるレコードを検索する場合等である。このような場合、Master側テーブル又はSlave側テーブルを検索した上で、再度JOINを行えばよい。
【0163】
・Master側テーブルとSlave側テーブルの両方で検索し、ANDを取る場合
この場合、Master側テーブルとSlave側テーブルの両方で検索した上で、再度JOINを行えばよい。
【0164】
・Master側テーブルとSlave側テーブルの両方で検索し、ORを取る場合
この場合、Master側テーブルとSlave側テーブルの両方で検索した上で、FullOuterJOINを行えばよい。
【0165】
・NOTを行う場合
NOT(A AND B)である場合、(NOT A)OR(NOT B)として再度JOINを行えばよい。
【0166】
NOT(A OR B)である場合、(NOT A)AND(NOT B)として再度JOINを行えばよい。
【0167】
[JOINテーブルに対するソート]
JOINテーブルのソートも検索と同様に、ソート処理部104によってMaster側又はSlave側のテーブルをソートした後、JOIN作成処理部102によって再度JOINすることで実現できる。ただし、Master側及びSlave側の両方のテーブルにまたがったソートはできない。なお、再度JOINを行う際には、SVLの共通化とその関連の処理は既に済んでいるため行わなくてよい。
【0168】
[JOINテーブルに対する集計]
JOINテーブルに対する集計について説明する。一例として、
図35に示すJOINテーブル13000を集計演算の対象とする。このJOINテーブル13000は、テーブル11000(Sales Logテーブル)とテーブル12000(CarMaster)とをJOINキー「Car」でJOIN(InnerJOIN)することで作成されたものである。また、集計の次元はカラム「Seller」と「Price」であるものとし、測度は「最小」、「最大」、「合計」、「件数」のいずれかであるものとする。なお、以降では、はカラム「Seller」を「Dim0」、「Price」を「Dim1」ともいい、測度を「Msr」ともいう。
【0169】
このとき、以下のStep11-1~Step11-3が実行されることにより、Dim0及びDim1に関して所定の測度の集計が実現される。
【0170】
Step11-1:集計処理部105は、JOIN元のテーブルをJOINキー値ごとに分解する。
【0171】
具体的には、
図36に示すように、集計処理部105は、JOINキー値「CarA」、「CarC」及び「CarB」ごとにテーブル11000(Sales Logテーブル)をテーブル11100、テーブル11200及びテーブル11300に分解すると共に、テーブル12000(CarMaster)をテーブル12100、テーブル12200及びテーブル12300に分解する。
【0172】
ここで、テーブル11100は、テーブル11000(Sales Logテーブル)をJOINキーでソートした上で、JOINキー値「CarA」部分のみを取り出すことで得られる。同様に、テーブル11200はJOINキー値「CarC」部分、テーブル11300はJOINキー値「CarB」部分のみを取り出すことで得られる。
【0173】
また、テーブル12100は、テーブル12000(CarMaster)をJOINキーでソートした上で、JOINキー値「CarA」部分のみを取り出すことで得られる。同様に、テーブル12200はJOINキー値「CarC」部分、テーブル12300はJOINキー値「CarB」部分のみを取り出すことで得られる。
【0174】
なお、テーブル11100とテーブル12100をJOINしたテーブル13100は、JOINキー値「CarA」でJOINされているレコードをJOINテーブル13000から抽出したものになっている。同様に、テーブル11200とテーブル12200をJOINしたテーブル13200は、JOINキー値「CarC」でJOINされているレコードをJOINテーブル13000から抽出したものになっている。同様に、テーブル11300とテーブル12300をJOINしたテーブル13300は、JOINキー値「CarB」でJOINされているレコードをJOINテーブル13000から抽出したものになっている。
【0175】
Step11-2:次に、集計処理部105は、JOINキー値ごとに、次元の値を出現数をカウントしたテーブルを作成した上でそれらテーブルの積を計算する。
【0176】
具体的には、
図37に示すように、集計処理部105は、JOINキー値「CarA」に関してDim0の値を出現数をカウントしたテーブル11110と、Dim1の値の出現数をカウントしたテーブル12110とを作成した上で、テーブル11110とテーブル12110との積を表すテーブル14100を作成する。
【0177】
同様に、
図37に示すように、集計処理部105は、JOINキー値「CarC」に関してDim0の値を出現数をカウントしたテーブル11210と、Dim1の値の出現数をカウントしたテーブル12210とを作成した上で、テーブル11210とテーブル12210との積を表すテーブル14200を作成する。
【0178】
同様に、
図37に示すように、集計処理部105は、JOINキー値「CarB」に関してDim0の値を出現数をカウントしたテーブル11310と、Dim1の値の出現数をカウントしたテーブル12310とを作成した上で、テーブル11310とテーブル12310との積を表すテーブル14300を作成する。
【0179】
なお、テーブル同士の積の計算方法にはソート法とキューブ法がある。それぞれの計算方法の詳細については後述する。
【0180】
Step11-3:そして、集計処理部105は、上記のStep11-2における積で得られたテーブルの和を計算する。この和により得られたテーブルが集計結果を表すテーブルである。具体的には、集計処理部105は、テーブル14100とテーブル14200とテーブル14300との和を計算する。測度が「合計」である場合の集計結果テーブル14400の一例を
図38に示す。
【0181】
なお、テーブル同士の和の計算方法にはソート法とキューブ法がある。それぞれの計算方法の詳細については後述する。
【0182】
(ソート法)
ここで、ソート法によりテーブル同士の和及び積を計算する方法について説明する。一例として、
図37に示すテーブル11110とテーブル12110の積を計算する場合と、テーブル14100と14200の和を計算する場合とについて、
図39を参照しながら説明する。
【0183】
・積
まず、集計処理部105は、左側テーブルであるテーブル11110のレコードを、右側テーブルであるテーブル12110のレコード数分だけ繰り返す。すなわち、テーブル12110のレコード数は「2」であるため、テーブル11110の各レコードを2回だけ繰り返す。これにより、
図39に示すテーブル11111が得られる。
【0184】
次に、集計処理部105は、テーブル11111の次元(Dim0)の値の右側に、テーブル12110の次元(Dim1)と測度(Msr)を結合する。これにより、
図39に示すテーブル11112が得られる。
【0185】
そして、集計処理部105は、測度が「合計」又は「件数」である場合はCount値を測度に掛けた上で、カラム「Count」を削除する。これにより、テーブル11110とテーブル12110との積を表すテーブル14100(積演算結果テーブル)が得られる。
【0186】
なお、測度が「最小値」又は「最大値」である場合は、Count値は測度に掛けずに、カラム「Count」を削除する。
【0187】
・和
集計処理部105は、テーブル14100と14200の先頭に比較位置を設定した上で、比較位置にあるレコードの次元の値の比較することで、テーブル14100と14200の和を表す和演算結果テーブルを作成する。
【0188】
具体的には、テーブル14100とテーブル14200とで比較位置にあるレコード同士のDim0及びDim1の同じであれば、以下(a)~(c)のいずれかを行った上で、テーブル14100とテーブル14200の比較位置をともに1つ下げる。
【0189】
(a)測度が「合計」又は「件数」である場合
テーブル14100の比較位置にあるレコードのDim0及びDim1の値と、テーブル14100の比較位置にあるレコードの測度の値とテーブル14200の比較位置にあるレコードの測度の値の和とで構成されるレコードを和演算結果テーブルに追加する。
【0190】
(b)測度が「最小値」である場合
テーブル14100の比較位置にあるレコードのDim0及びDim1の値と、テーブル14100の比較位置にあるレコードの測度の値とテーブル14200の比較位置にあるレコードの測度の値のいずれか小さい方の値とで構成されるレコードを和演算結果テーブルに追加する。
【0191】
(c)測度が「最大値」である場合
テーブル14100の比較位置にあるレコードのDim0及びDim1の値と、テーブル14100の比較位置にあるレコードの測度の値とテーブル14200の比較位置にあるレコードの測度の値のいずれか大きい方の値とで構成されるレコードを和演算結果テーブルに追加する。
【0192】
一方で、テーブル14100とテーブル14200とで比較位置にあるレコード同士のDim0及びDim1の値が同じでなければ、Dim0及びDim1の値が小さい方のレコードを和演算結果テーブルに追加した上で、レコードを追加した方のテーブルの比較位置を1つ下げる。
【0193】
なお、一方のテーブルで比較対象のレコードがなくなった場合、他方のテーブルの残りのレコードを和演算結果テーブルに追加して終了する。
【0194】
これにより、テーブル14100と14200の和を表す和演算結果テーブルが得られる。なお、
図39に示す和演算結果テーブル14350は、測度が「合計」又は「件数」である場合の和演算結果テーブルである。
【0195】
(キューブ法)
次に、キューブ法によりテーブル同士の和及び積を計算する方法について説明する。一例として、
図37に示すテーブル11110とテーブル12110の積を計算する場合と、テーブル14100と14200の和を計算する場合とについて、
図40を参照しながら説明する。
【0196】
・積
まず、集計処理部105は、集計対象の次元の値の種類数を特定する。これは、SVLから直ちに特定することが可能である。テーブル11000及びテーブル12000ではDim0は3種類(つまり、Jim、Kate、Tom)、Dim1は2種類(つまり、Body、Opt1)である。
【0197】
次に、集計処理部105は、次元の値の種類数を軸とする多次元キューブを作成する。具体的には、
図40に示すように、3×2の多次元キューブを作成する。なお、多次元キューブの各セルには、測度が「合計」又は「件数」のときは「0」、測度が「最小値」のときは「+∞」、測度が「最大値」のときは「-∞」を埋める。これは、多次元キューブのセルに測度の値が格納されていないケースを検出するためである。また、「0」~「5」は多次元キューブの各セルのアドレスであり、Dim0の値とDim1の値との組を昇順に表している。
【0198】
次に、集計処理部105は、多次元キューブに測度の値を格納する。具体的には、多次元キューブの各セルに対して、そのアドレスが表すDim0の値とDim1の値の組に対応する測度の値(又は、その値に、Dim0の値に対応するCount値を掛けた値)を格納する。なお、測度が「合計」又は「件数」の場合は測度の値にCount値を掛けた値を格納し、測度が「最小値」又は「最大値」の場合は測度の値を格納する。
【0199】
具体的には、アドレス「0」はJim及びBodyを表すため、アドレス「0」のセルには、測度が「合計」又は「件数」の場合は「200×1」、測度が「最小値」又は「最大値」の場合は「200」が格納される。
【0200】
同様に、アドレス「1」はJim及びOpt1を表すため、アドレス「1」のセルには、測度が「合計」又は「件数」の場合は「25×1」、測度が「最小値」又は「最大値」の場合は「25」が格納される。
【0201】
同様に、アドレス「2」はKate及びBodyを表すため、アドレス「2」のセルには、測度が「合計」又は「件数」の場合は「0」、測度が「最小値」又は「最大値」の場合は「0」が格納される。
【0202】
同様に、アドレス「3」はKate及びOpt1を表すため、アドレス「3」のセルには、測度が「合計」又は「件数」の場合は「0」、測度が「最小値」又は「最大値」の場合は「0」が格納される。
【0203】
同様に、アドレス「4」はTom及びBodyを表すため、アドレス「4」のセルには、測度が「合計」又は「件数」の場合は「200×2」、測度が「最小値」又は「最大値」の場合は「200」が格納される。
【0204】
同様に、アドレス「5」はTom及びOpt1を表すため、アドレス「5」のセルには、測度が「合計」又は「件数」の場合は「25×2」、測度が「最小値」又は「最大値」の場合は「25」が格納される。
【0205】
そして、集計処理部105は、多次元キューブから、測度の値が格納されなかったセルを削除する。これにより、テーブル11110とテーブル12110との積を表すテーブル14100(積演算結果テーブル)が得られる。
【0206】
・和
集計処理部105は、テーブル14100の測度の値が格納された多次元キューブとテーブル14200の測度の値が格納された多次元キューブとを用いて、測度に応じて同一アドレスの測度の値同士を演算する。このとき、測度が「合計」又は「件数」の場合は2つの測度の値を加算し、測度が「最小値」の場合は小さい方の値を採用し、測度が「最大値」の場合は大きい方の値を採用する。
【0207】
これにより、テーブル14100とテーブル14200との和を表す和演算結果テーブル14350が得られる。なお、
図40に示す例は測度が「合計」又は「件数」の場合を示している。
【0208】
(次元の入れ替え)
なお、上記でテーブル同士の積や和を計算したが、集計対象の次元が左右のテーブルで交錯していると処理が煩雑となる。そこで、例えば、左側テーブルにDim0、Dim2、Dim4が存在し、右側テーブルにDim1、Dim3が存在するといった状況である場合、集計を行っている間の次元の順序の優先度を、Dim0、Dim1、Dim2、Dim3、Dim4からDim0、Dim2、Dim4、Dim1、Dim3に入れ替えることで、上記の煩雑さを回避することが可能となる。この場合、集計が行った際に、集計結果テーブルをDim0、Dim1、Dim2、Dim3、Dim4の優先度でソートすればよい。
【0209】
[カラム転送]
JOINテーブルに対するカラム転送とは、Slave側テーブルのカラムを、JOINキーを経由してMaster側テーブルにコピーする操作である。転送されるカラムのSVLはそのままコピーすればよく、NNCを再計算すれば完了するため、高速である。
【0210】
サブテーブル(例えば、或るテーブルに対して或る検索を行ってできたテーブル)間でもJOINは可能であるため、カラム転送も、Master側及びSlave側のサブテーブル間でも成立する。
【0211】
一例として、
図15に示すJOINテーブルに対してカラム転送を行って、Slave側の「Area」カラムをMaster側にコピーする場合について説明する。
【0212】
まず、カラム転送処理部106は、
図41に示すように、SVL5320(SVL
(B-Area))をMaster側にコピーしてSVL4520(SVL
(A-Area))を作成する。
【0213】
次に、カラム転送処理部106は、NNC4510(NNC(A-Area))を作成して、その要素を0で埋める。以下、このNNC4510(NNC(A-Area))の各要素を更新(再計算)すればカラム転送が完了する。
【0214】
カラム転送処理部106は、
図41に示すように、i=1,・・・,6に対して、以下の条件1及び条件2が成り立つか否かを判定する。
【0215】
条件1:MAcm(A-0)[i]>MAcm(A-0)[i-1]
条件2:SAcm[NNC(A-Name)[OrdSet(A-0)[i]]]>SAcm[NNC(A-Name)[OrdSet(A-0)[i]]-1]
そして、カラム転送処理部106は、上記の条件1及び条件2が成り立つ場合、以下によりNNC4510(NNC(A-Area))の各要素を更新する。
【0216】
NNC
(A-Area)[OrdSet
(A-0)[i]]:=NNC
(B-Area)[OrdSet
(B-1)[SAcm[-1+NNC
(A-Name)[OrdSet
(A-0)[i]]]]]
図41に示す例では、NNC
(A-Area)[1]の値を0から2に更新している様子を表している。
【0217】
なお、OrdSet(A-0)の代わりに、OrdSet(A-x)(ただし、xは1以上の整数)を選ぶことで、サブテーブルに対しても同様にカラム転送を行うことが可能である。
【0218】
[JOINにマッチした集合とマッチしなかった集合の抽出]
JOINテーブルではJOINにマッチしたレコードの集合と、マッチしなかったレコードの集合とを容易に抽出することができる。抽出された集合は、Master側又はSlave側のテーブルに新たなOrdSetとして登録される。このような集合は様々な用途があるが、例えば、高速な相関副問合せを実現するのに使用することが可能である。なお、以降では、簡単のため、JOINにマッチしたレコードの集合を「マッチ集合」、マッチしなかったレコードの集合を「アンマッチ集合」ともいう。
【0219】
一例として、
図42に示すJOINテーブル15000からマッチ集合及びアンマッチ集合を抽出する場合について説明する。
図42に示すJOINテーブル15000は、テーブル4000を「Point≧11」で検索して得られたサブテーブルと、テーブル5000とをOuterJOINで結合したテーブルである。
【0220】
図42に示すJOINテーブル15000のNNI形式を
図43に示す。
図43に示すように、
図42に示すJOINテーブル15000のNNI形式は、MAcm16400(MAcm
(A-0))と、OrdSet16120(OrdSet
(A-2))と、NNC16210(NNC
(A-Name))と、SVL16220(SVL
(Name))と、NNC16310(NNC
(A-Point))と、SVL16320(SVL
(A-Point))と、SAcm17400(SAcm
(B-0))と、OrdSet17110(OrdSet
(B-1))と、NNC17210(NNC
(B-Name))と、SVL17220(SVL
(Name))と、NNC17310(NNC
(B-Area))と、SVL17320(SVL
(B-Area))とで構成されている。なお、SVL16220(SVL
(Name))とSVL17220(SVL
(Name))は共通化されたSVLである。
【0221】
(Master側から見た場合)
ここで、Master側テーブルから見た場合、JOINテーブル15000の各レコードは以下のケースに分けられる。
【0222】
Case-0:Master側がJOINに関与しないケース(例えば、JOINテーブル15000の位置「0」~「2」にあるレコード)
Case-1:マッチしたケース(例えば、JOINテーブル15000の位置「3」~「4」及び「6」にあるレコード)
Case-2:マッチしなかったケース(例えば、JOINテーブル15000の位置「5」及び「7」にあるレコード)
したがって、Master側から見たマッチ集合とは上記のCase-1に該当するレコードの集合のことであり、アンマッチ集合とは上記のCase-2に該当するレコードの集合のことである。
【0223】
具体的には、集合抽出処理部107は、i=0,1・・・,4に対して以下のStep12-1~Step12-2を実行することで、マッチ集合及びアンマッチ集合を抽出することができる。
【0224】
Step12-1:まず、集合抽出処理部107は、MAcm(A-0)[i]-MAcm(A-0)[i-1]>0であるか否かを判定する。なお、MAcm(A-0)[i]-MAcm(A-0)[i-1]=0である場合、Step12-2は実行されない。
【0225】
Step12-2:MAcm(A-0)[i]-MAcm(A-0)[i-1]>0であると判定された場合、集合抽出処理部107は、以下によりOrdSet(A-2)[i]の値を判定し、その判定結果によりマッチ集合又はアンマッチ集合の値を追加する(又は追加しない)。
【0226】
・OrdSet(A-2)[i]=0の場合
この場合、Master側のレコードはNULLであるため、Case-0に該当する。したがって、マッチ集合にもアンマッチ集合にも追加しない。
【0227】
・OrdSet(A-2)[i]≠0の場合
この場合、Count(Master[i])=SAcm(A-0)[NNC(A-Name)[OrdSet(A-2)[i]]]-SAcm(A-0)[NNC(A-Name)[OrdSet(A-2)[i]]-1]を更に計算し、Count(Master[i])>0である否かを判定する。そして、Count(Master[i])>0である場合はCase-1に該当するため、OrdSet(A-2)[i]の値をマッチ集合に追加する。一方で、Count(Master[i])=0である場合はCase-2に該当するため、OrdSet(A-2)[i]の値をアンマッチ集合に追加する。
【0228】
これにより、
図44に示すように、OrdSet16120(OrdSet
(A-2))の要素から、マッチ集合18110とアンマッチ集合18120が作成される。
【0229】
(Slave側から見た場合)
次に、Slave側テーブルから見た場合について説明する。この場合、Master側から見た場合のCase-0がCase-2に該当し、Master側から見た場合のCase-2がCase-0に該当する。
【0230】
具体的には、
図45に示すように、集合抽出処理部107は、以下のStep13-1~Step13-2を実行することでマッチ集合及びアンマッチ集合を抽出することができる。
【0231】
Step13-1:まず、集合抽出処理部107は、OrdSet16110(OrdSet(A-1))とNNC16210(NNC(A-Name))とを用いて、フラグ配列19100を作成する。ここで、OrdSet16110(OrdSet(A-1))は、JOINテーブル15000作成前のMaster側テーブルのOrdSet(又は、OrdSet16120(OrdSet(A-2))から先頭の0を除いたOrdSet)である。
【0232】
集合抽出処理部107は、i=0,1,・・・,5に対して、以下によりフラグ配列19100(Flags)の各要素の値を設定する。
【0233】
Flags[NNC(A-Name)[OrdSet(A-1)[i]]]:=1
Step13-2:次に、集合抽出処理部107は、OrdSet17110(OrdSet(B-1))と、NNC17210(NNC(B-Name))と、フラグ配列19100(Flags)とを用いて、OrdSet17110(OrdSet(B-1))の各要素をマッチ集合又はアンマッチ集合に追加する。
【0234】
集合抽出処理部107は、i=0,1,・・・,5に対して、以下によりOrdSet(B-1)[i]の値をマッチ集合又はアンマッチ集合に追加する。
【0235】
Flags[NNC(B-Name)[OrdSet(B-1)[i]]]=1であるか否かを判定し、1であればOrdSet(B-1)[i]の値をマッチ集合に追加し、0であればOrdSet(B-1)[i]の値をアンマッチ集合に追加する。これにより、OrdSet17110(OrdSet(B-1))の各要素から、マッチ集合18130とアンマッチ集合18140が作成される。なお、Slave側から見た場合、Case-0に該当するレコードについては、フラグ配列の要素は参照されない。
【0236】
本発明は、具体的に開示された上記の実施形態に限定されるものではなく、請求の範囲の記載から逸脱することなく、種々の変形や変更、既知の技術との組み合わせ等が可能である。
【符号の説明】
【0237】
10 データ処理装置
11 入力装置
12 表示装置
13 外部I/F
13a 記録媒体
14 通信I/F
15 プロセッサ
16 メモリ装置
17 バス
101 SVL共通化処理部
102 JOIN作成処理部
103 検索処理部
104 ソート処理部
105 集計処理部
106 カラム転送処理部
107 集合抽出処理部
108 記憶部