JP4071816B1 - 合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム - Google Patents
合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム Download PDFInfo
- Publication number
- JP4071816B1 JP4071816B1 JP2007075670A JP2007075670A JP4071816B1 JP 4071816 B1 JP4071816 B1 JP 4071816B1 JP 2007075670 A JP2007075670 A JP 2007075670A JP 2007075670 A JP2007075670 A JP 2007075670A JP 4071816 B1 JP4071816 B1 JP 4071816B1
- Authority
- JP
- Japan
- Prior art keywords
- task
- processing
- relation
- tasks
- temp
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
【解決手段】クエリーの問い合わせが入力される(S110)と、関係演算で構成された処理ツリーに変換され(S120)、直接的に処理することのできるタスクを見つける(S130)。タスクを見つけると、共通のリレーションをアクセスするグループがグループ列に存在するかどうかを調べ(S140)、共通のリレーションをアクセスするグループがグループ列に存在しているならば、そのグループにタスクを加える(S150)。存在していない場合は、新たなグループを作成する(S160)。
グループ内の共通部分式を持つタスクは、さらにサブグループに集め(S170)、サブグループにタスクを集めると、サブグループ内のタスクをもとに合成関係演算タスクを作成する(S180)。グループ内の合成関係演算タスク等の処理を一度に行う(S190)。合成関係演算タスクの処理が終了すると、サブグループ内のタスクに対して仮想リレーションを作成して、合成関係演算タスクの処理結果として得られたリレーションを部分的に共有できるようにする(S200)。
【選択図】図2
Description
ディスクをアクセスする回数を減少させてクエリーの処理速度を向上させるために、問い合わせの多いクエリーとクエリーの処理結果、クエリーに含まれる演算(選択演算,射影演算,結合演算などの関係代数)と演算の処理結果(クエリーの中間結果)を一時的にディスクに保存(キャッシング)しておく方法がよく用いられている。ユーザからクエリーの問い合わせがあると、データベース・マネージメント・システムは、問い合わせのあったクエリーと同じクエリーの処理結果がディスクに保存されているかどうかを調べて、保存されているならば、そのクエリーの処理を行わずに、保存されているクエリーの処理結果をそのままユーザに返すことになる。また、クエリーは異なるけれども、クエリーに含まれる演算と同じ演算の処理結果がディスクに保存されているならば、データベース・マネージメント・システムは、その演算の処理を行わずに、すでに存在する演算の処理結果を利用してクエリーの処理を行うことになる。
ディスクをアクセスする回数を減少させてクエリーの処理速度を向上させるその他の方法は、クエリーを処理するためによくアクセスされるディスク上のブロックの複製をメインメモリに一時的に保存(キャッシング)しておく方法が用いられる。この方法は、ユーザからクエリーの問い合せがあると、データベース・マネージメント・システムは、クエリーを処理するためにディスクからアクセスするブロックの複製がメインメモリに保存されているかどうかを調べて、保存されているならば、メインメモリ内の複製を利用する。
この方法は、メインメモリ内で保存するブロックの容量を増やしておくことで、ディスクをアクセスする回数を減少させてクエリーの処理速度を向上させることを目的としている。
また、オペレーティング・システム自体もこのようなメモリー管理を行っているため、データベース・マネージメント・システムがメインメモリに保存するブロックの容量を増やすと、メインメモリに保存されたはずのブロックがオペレーティング・システムによって仮想メモリー(ディスク)に移動されることなどが起こり、逆にクエリーの処理速度が低下するといった問題が発生する。
クエリーの中間結果であるタスクの処理結果のリレーションをディスク上に作成しないで、ディスクをアクセスする回数を減少させてクエリーの処理速度を向上させる方法としては、クエリー処理をパイプライン化した方法が用いられる。
クエリー処理をパイプライン化した方法とは、複数のマイクロプロセッサを備えているコンピュータ・システムにおいて、クエリーに含まれるいくつものタスク処理を複数のマイクロプロセッサを用いてパイプラン化し、個々のタスク処理を並列に処理していく方法である。この方法は、クエリーに含まれる個々のタスクの処理結果はストリーム化され、個々のタスク処理が完全に終了するのを待たずして、部分的に終了したタスクの処理結果に対する次のタスク処理を行っていくものである。しかし、パイプライン化できるタスク処理は、選択演算や射影演算などのタスクに限られ、結合演算などのタスクは、結合演算の前に行われるタスク処理が完全に終了してからではないと処理を始めることができないので、パイプライン化することはできない。また、クエリー処理をパイプライン化した方法は、複数のマイクロプロセッサを搭載してあるコンピュータ・システムが必要であるので、マイクロプロセッサを1つしか備えていないコンピュータ・システムでは有効ではない。
問い合わせの多いクエリーとクエリーの処理結果、クエリーに含まれる演算(選択演算、射影演算、結合演算などの関係代数)と演算の処理結果(クエリーの中間結果) を一時的にディスクに保存(キャッシング)しておくことを記載したものとして、以下に記載する非特許文献1〜6がある。
クエリーを処理するためにアクセスされるディスク上のブロックの複製をメインメモリーに一時的に保存(キャッシング)しておくことを記載したものとして、非特許文献7〜11がある。
また、クエリー処理のパイプライン化を記載したものとしては、非特許文献12がある。
Finkelstein, S. Common Expression Analysis in Database Applications. In Proceedings of the International Conference of the Management of Data(SIGMOD'82, Orland, Florida, June 2-4), 1982 Yigal Arens and Craig A. Knoblock. Intelligent Cashing: Selecting, Representing and Reusing Data in an Information Server. ACM Press, Proceedings of the third international conference on Information and knowledge management, November 1994 Hyunchul Kang, Seungchul Han, Younghyum Kim. Schemes of Storing XML Query Cache. Proceedings of the sixteenth Australasian database conference, Volume 39 ADC 2005 Bhushan Mandhani, Dan Suciu, Query Caching and View Selection for XML Databases, Proceedings of the 31st international conference on Very large data bases,VLDB 2005 Michael J. Carey, Michael J. Franklin, Miron Livny, and Eugene J. Shekita. Data caching tradeoffs in client-server DBMS architectures. In Proceedings of the ACM SIGMOD, pages 357-366, 1991 TIMOS K. SELLIS. Multiple-Query Optimization. ACM Transactions on Database Systems, Vol. 13, No. 1, Pages 23-52, March 1988. Giovanni Mario Sacco and Mario Schkolnick. Buffer Management in Relational Database Systems. ACM Transactions on Database Systems, Volume 11, no. 4, pp. 473-498, December 1986 Chou, H. And DeWitt, D. An Evaluation of Buffer Management Strategies for Relational Database Systems. Proceedings of VLDB, 1985 O'Neil EJ, O'Neil PE, Weikum G. The LRU-K Page Replacement Algorithm For Database Disk Buffering. In ACM SIGMOD Conf., 1993, Washington, D.C., pp 297-306 Zhifeng Chen, Yan Zhang, Yuanyuan Zhou. Empirical Evaluation of Multi-level Buffer Cache Collaboration for Storage systems. ACM SIGMETRICS international conference on Measurement and modeling of computer systems SIGMETRICS 2005, Volume 33 Issue 1 Michael Stonebraker. Operating System Support for Database Management. Communications of The ACM, 24(7):412-18, July 1981 David J. DeWitt and Jim Gray. Parallel Database Systems: The Future of High Performance Database Processing. Communications of The ACM, Vol. 36, No. 6, June 1992
本発明では、これらの解決方法とは別に、独自に考案するクエリーの処理方法を用いて、ディスクをアクセスする回数を減少させ、クエリーの処理速度を向上させる方法を提案する。
前記合成関係演算作成手段は、サブグループに集めた複数の射影演算タスクが、共通のリレーションに対して射影演算の処理を行うならば、これらの射影演算タスクの属性の和集合を求めて得られた属性を用いて、複数の射影演算タスクの合成関係演算を作成するとよい。
前記仮想リレーション作成手段は、仮想リレーションのレコードに対してタスクが検索処理を行う場合、仮想リレーションが部分的に共有するリレーションの検索に使用する属性に対して、インデックスを作成するとよい。
上述した合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システムの各機能を、コンピュータ・システムに実現させるためのプログラムやプログラムを記録した記録媒体も本発明である。
その方法は、グループ内の共通部分式を持つタスクをさらにサブグループに集めて、サブグループに集めたいくつかのタスクを1つの合成関係演算タスクに置き換えて処理を行うことになる。また、サブグループ内の個々のタスクは、仮想リレーションを用いて、合成関係演算タスクの処理結果として得られたリレーションを部分的に共有することになり、従来のクエリー処理のように、選択範囲及び/又は属性の重なっている数多くの処理結果のリレーションをディスク上に別々に作成することがなくなり、ディスクをアクセスする回数を減少させ、クエリーの処理速度が向上させることができた。
実験の処理結果からもわかるように、これまで広く使用されているMySQL.Ver3や以前のマルチオペレーション・プロセッシングのみを用いたクエリー・プロセッサよりも一段と数多くのクエリーの処理を高速に行うことができるようになった。
合成関係演算タスクの処理結果を部分的に共有していることを示すために、サブグループ内の個々のタスクに対して格納位置による仮想リレーションを作成し、仮想リレーションに合成関係演算タスクの処理結果を共有するために必要な情報を記録しておく。
合成関係演算タスクが選択演算の場合には、選択条件に使用された属性で整列された処理結果であるリレーションを作成し、仮想リレーションとして、共有する合成関係演算タスクの処理結果のリレーション名、レコードの格納位置(レコードの行範囲、レコードが格納してあるブロックの番号とアドレス)などの情報を記録しておく。
合成関係演算タスクが射影演算の場合には、仮想リレーションとして、共有する合成関係演算タスクの処理結果のリレーション名、属性の格納位置(列番号)などの情報を記録しておく。
仮想リレーションにこれらの情報を記録しておくことによって、仮想リレーションを用いて処理を行うタスクは、合成関係演算タスクの処理結果の中から必要なレコードをすばやく取り出すことができるようになる。このように、合成関係演算を利用したマルチオペレーション・プロセッシングは、サブグループに集められたいくつかのタスクを1つの合成関係演算タスクに置き換えて処理を行い、サブグループ内の個々のタスクは、仮想リレーションを通して、合成関係演算タスクの処理結果のリレーションを部分的に共有することになる。このため、サブグループ内の個々のタスクの間で選択範囲及び/又は属性列の重なっているレコードを含んだ処理結果のリレーションをディスク上に別々に作成する必要がなくなり、ディスクをアクセスする回数を減らすことができるようになり、そのことによってクエリーの処理速度を向上させることが可能となる。
さらに、仮想リレーションを用いて合成関係演算タスクの処理結果に対して処理を行うタスクは、仮想リレーションをもとにしてグループ分けをするのではなく、(仮想リレーションを包含している)合成関係演算タスクの処理結果として得られるリレーションをもとにグループ分けを行って、マルチオペレーション・プロセッシングを使用してこれらのタスク処理を一度に行うものとする。マルチオペレーション・プロセッシングを使用してこれらのタスク処理を一度に行うことによって、合成関係演算タスクの処理結果得られたリレーションは、何度もアクセスされることがなくなり、クエリーの処理速度を向上させることが可能となる。
以上に述べた方法を用いてクエリーからのタスク処理を行うことによって、合成関係演算を利用したマルチオペレーション・プロセッシングは、マルチオペレーション・プロセッシングだけを用いたタスク処理よりも、効率よくタスク処理を一度に行うことができるようになり、ディスクをアクセスする回数を減少させて、クエリーの処理速度を向上させることが可能となる。
まず、本発明の合成関係演算を利用したマルチオペレーション・プロセッシングの概要を説明する。
合成関係演算を利用したマルチオペレーション・プロセッシングは、ユーザから問い合わせのあったクエリーがクエリーの最適化によって、関係代数で構成された処理ツリーに変換されると、処理ツリー上の接点であるタスクをトポロジカルソートの順番で、他のタスクから依存がなく、直接的に処理できるタスクを見つける。そして、これらのタスクを、それぞれのタスクがアクセスするデータベースのリレーションをもとにグループ分けを行い、さらにグループ内のタスクを共通部分式ごとにサブグループに集めて、それぞれのサブグループに対して、サブグループ内のタスクをもとに合成関係演算タスクを作成する。その後、マルチオペレーション・プロセッシングを使用して合成関係演算タスクを含むグループ内のタスクの処理を一度に行うものである。
図1は、本文で説明したクエリーの処理方法を用いたデータベースシステムのアーキテクチャの例である。ここで示した構成は、基本的に、上述した本発明者が出願した特願2006−356406号の図1と同様のものである。
図1において、クエリーQ1〜Q6をユーザから問い合わせのあったクエリーとして扱い、データベースのアーキテクチャを説明していくことにする。クエリーQ1〜Q6は、クエリー・オプティマイザー(問い合わせ最適化処理)(900)によって最適化され、関係代数で構成された処理ツリーP1〜P6(902)に変換される。クエリー・プロセッサ(901)は、クエリー・オプティマイザー(900)とマルチオペレーション・プロセッサ(マルチオペレーション・プロセッシングを行うプロセッサ)(905)を制御している。
クエリーの一連の処理を行うクエリー・プロセッサ(901)は、処理ツリーP1〜P6からトポロジカルソートの順番で、他のタスクから依存がなく、直接的に処理できるタスクt1 1,t1 3,t1 7,t1 9,t2 1,t2 3,t2 4,t3 1,t3 2,t4 1,t4 2,t5 1,t5 2,t6 1,t6 3(903)を見つける。次に、クエリー・プロセッサは、これらの直接的に処理できるタスクをそれぞれのタスクがアクセスするデータベースのリレーションをもとにしてグループG1〜G4に分ける。タスクt1 3,t2 1,t3 2,t4 1,t5 1,t6 3をグループG1に集め、タスクt1 1,t2 3,t3 1,t6 1をグループG2に集め、タスクt1 7,t2 4をグループG3に集め、タスクt1 9,t4 2,t5 2をグループG4に集める。
サブグループSG1G1に対して合成関係演算タスクtG1 SG1を作成し、サブグループSG2G1に対して合成関係演算タスクtG1 SG2を作成し、サブグループSG1G2に対して合成関係演算タスクtG2 SG1を作成し、サブグループSG1G3に対して合成関係演算タスクtG3 SG1を作成する。合成関係演算タスクを作成すると、クエリー・プロセッサは、グループG1〜G4をグループ列(キュー)(904)に挿入する。
他のプロセス2〜4もそれぞれ、グループ列からグループを取り出し、並列に処理を行う。
図2は、合成関係演算を利用したマルチオペレーション・プロセッシングを用いてクエリーが処理される一連の流れを説明するためのフローチャートである。
まず、SQLなどのリレーショナルデータベースの言語を使用して、ユーザからデータベースサーバーにクエリーの問い合わせが入力される(S110)。問い合わせのあったSQLの構文は、クエリー・オプティマイザー(900)によるクエリーの最適化処理によって関係演算で構成された処理ツリーに変換される(S120)。クエリー・プロセッサ(901)は、トポロジカルソートの順番で、直接的に処理することのできるタスクを見つける(S130)。直接的に処理することのできるタスクを見つけると、これらのタスクがアクセスするリレーションと共通のリレーションをアクセスするタスクが集められたグループがグループ列に存在するかどうかを調べる(S140)。共通のリレーションをアクセスするタスクが集められたグループがグループ列に存在しているならば、そのグループにタスクを加える(S150)。存在していない場合は、タスクのために新たなグループを作成し、そのグループにタスクを加えて、そのグループをグループ列に挿入する(S160)。
ここまでの処理は、前述した本発明者による特願2006−356406号に記載したものと同じである。
マルチオペレーション・プロセッサ(905)は、利用できるプロセスの数だけグループ列からグループを取り出し、マルチオペレーション・プロセッシングを用いて、グループ内の合成関係演算タスク、及びサブグループに集まらないタスクの処理を一度に行う(S190)。グループ内の合成関係演算タスクの処理が終了すると、サブグループ内のタスクに対して仮想リレーションを作成して合成関係演算タスクの処理結果内のレコードを部分的に共有できるようにする(S200)。
処理ツリー内のすべてのタスク処理が終了するとその処理ツリーに対応したクエリーの処理が終了する。
合成関係演算を利用したマルチオペレーション・プロセッシングを使用してグループに集められたタスクを一度に処理を行うに当たって、合成関係演算を利用したマルチオペレーション・プロセッシングのアルゴリズムをステップ1からステップ3に分けて、さらに説明する。
共通のリレーションRに対してグループ内のタスクの処理を行うに当たって、次のようにタスク間の共通部分式に関する定義を定めて、グループ内のタスクを共通部分式ごとにサブグループに集める(S170)。
・共通部分式に関する定義:
次に示す選択演算,射影演算,及びその他の演算に関する条件を満たすならば、タスクtiとタスクtjは共通部分式をもっている。
・選択演算:
タスクtiは、リレーションRに対して属性A1,A2,A3,…,Akに関する選択条件(AND,ORで結合したもの)を使用する選択演算タスクであり、タスクtjは、同一のリレーションRに対して同一の属性A1,A2,A3,…,Akに関する選択条件(AND,ORで結合したもの)を使用する選択演算タスクであるときに、タスクtiとタスクtjが使用する選択条件において、1つの属性Ai(1≦i≦k)に関する選択条件だけは異なった条件かまたは同じ条件であり、Ai以外の属性に関する選択条件はまったく同じ条件である。
・射影演算:
タスクtiは、リレーションRに対する射影演算タスクであり、タスクtjは、同一のリレーションRに対する射影演算タスクである。
・その他の関係演算:
tiとtjは、同一の関係演算のタスク(ti≡tj)である。
以上の定義の条件に用いた演算は、あくまでも共通部分式に関するものである。
ステップ1によってグループ内のタスクを共通部分式ごとにサブグループに集めると、サブグループ内のタスクの演算の種類に応じて、下記の方法を使用して、グループ内の各サブグループに対して、合成関係演算タスクを作成する(S180)。
サブグループ内の選択演算タスクTEMP_T1←σ<selection condition 1>R,TEMP_T2←σ<selection condition 2>R,TEMP_T3←σ<selection condition 3>R,…,TEMP_Tn←σ<selection condition n>Rに使われている選択条件<selection condition i>(i=1,2,…,n)を、ブール演算のORを使用して接続し、接続した選択条件から選択範囲の重複した部分を取り除くために、次のような最適化を行って1つの合成選択演算タスクを作成する。
TEMP_SG←σoptimize(<selection condition 1> OR <selection condition 2> OR <selection condition 3> …OR <selection condition n>)R
ここで、σ<selection condition i>R (i=1,2,…,n)は、リレーションRに対して選択条件<selection condition i>にもとづいて選択演算することを意味し、σoptimize(…)は、最適化により選択演算を行うことを意味する。また、TEMP_Ti←σ<selection condition i>Rは、リレーションRに対して、選択条件<selection condition i>にしたがって選択(σ)するタスクを表し、その処理結果をTEMP_Tiに記録するものとする。
サブグループ内の射影演算タスクTEMP_T1←π<attribute list 1>R,TEMP_T2←π<attribute list 2>R,TEMP_T3←π<attribute list 3>R ,…,TEMP_Tn←π<attribute list n>Rに使われている属性のリスト<attribute list i>(i=1,2,…,n)を集合Siに変換し、和集合(Union)を用いて各タスクからの属性を1つの集合TS=S1∪S2∪S3∪…∪Snに集める。そして属性の集合TSを属性のリスト<attribute list SG>に変換して、合成射影演算タスクTEMP_SG←π<attribute list SG>Rを作成する。ここで、π<attribute list i>R(i=1,2,…,n)は、リレーションRに対して、属性のリスト<attribute list i>にもとづき射影演算を行うことを意味する。また、TEMP_Ti←π<attribute list i>R(i=1,2,…,n)はリレーションRに対して属性<attribute list i>にもとづいて射影演算を行った結果をTEMP_Tiに記録することを表すものとする。
サブグループには、同一の関係演算のタスクが集められているので、サブグループ内のタスクの1つを合成関係演算タスクとして使うものとする。
ステップ2を用いてグループ内の各サブグループに関して作成された合成関係演算タスク及びグループ内でサブグループに集められないタスクに対してマルチオペレーション・プロセッシングを使用して処理を行う(S190)。
このマルチオペレーション・プロセッシングとして、ダイナミックマルチオペレーション・プロセッシングとスタティックマルチオペレーション・プロセッシングの2つの処理方法を提案してきた(特願2006−356406号参照)が、この実施形態では、スタティック・マルチオペレーション・プロセッシングをマルチオペレーション・プロセッシングとして用いて処理を行っていくことにする。スタティック・マルチオペレーション・プロセッシングを使って処理を行う場合は、グループ内の合成関係演算タスク及びグループ内でサブグループに集まらないタスクに対してアクセスプランを作成し、アクセスプランから各タスクの処理コストをもとめ、処理コストの小さいタスクから処理コストの大きいタスクへと順番に処理するために、アクセスするリレーション内のブロックの順位を決定し、その順位にしたがってディスク内のブロックをアクセスし、このブロックを共通ブロックとして、このブロック上で処理を行う必要のあるグループ内のタスク処理を一度に処理していくことになる。
合成関係演算を利用したマルチオペレーション・プロセッシングによって処理された合成関係演算タスクの処理結果は、サブグループ内の個々のタスクの処理結果のすべてを含んでいるために、サブグループ内のタスクは、合成関係演算タスクの処理結果を部分的に共有することになる。
合成関係演算タスクの処理結果を部分的に共有していることを示すために、サブグループ内の個々のタスクに対して仮想リレーションを作成し、仮想リレーションに合成関係演算タスクの処理結果を共有するために必要な情報を記録しておく。
合成関係演算タスクが選択演算の場合、選択条件に使われた属性で整列された処理結果のリレーションを作成し、仮想リレーションとして、共有する合成関係演算の処理結果のリレーション名、レコードの格納位置(レコードの行範囲、レコードが格納してあるブロックの番号とアドレス)などの情報を記録しておくことになる。
また、合成関係演算タスクが射影演算の場合、仮想リレーションとして、共有する処理結果のリレーション名、属性の格納位置(列番号)などの情報を記録しておくことになる。
仮想リレーションにこれらの情報を記録しておくことによって、仮想リレーションを用いて処理を行うタスクは、合成関係演算タスクの処理結果の中から必要なレコードをすばやく取り出すことができるようになる(S200)。
また、仮想リレーションを用いて処理を行うタスクは、仮想リレーションをもとにしてグループ分けするのではなく、(仮想リレーションを包含している)合成関係演算タスクの処理結果として得られたリレーションをもとにグループ分けを行い、マルチオペレーション・プロセッシングを使用してこれらのタスク処理を一度に行うものとする。マルチオペレーション・プロセッシングを使用してこれらのタスク処理を一度に行うことによって、合成関係演算タスクの処理結果得られたリレーションのブロックは、何度もアクセスされることがなくなり、クエリーの処理速度を向上させることが可能となる。
ここでは、上述で説明した合成関係演算を利用したマルチオペレーション・プロセッシングを、図3−1〜図3−3に示したデータ構造を有するデータベースに対するクエリーQ1〜Q5の例を用いて説明する。
[(a)リレーションの例]
図3−1〜図3−3には、リレーションDEPARTMENT,EMPLOYEE,WORKS_ON,PROJECTから構成されているデータベースを示している。
リレーションDEPARTMENT(図3−1(a)参照)には25件のレコードが5つのブロックに格納してあり、それぞれのブロックには5件のレコードが存在しており、各ブロックは、次のブロックに対してブロックポインタを持っている。リレーションDEPARTMENTの主属性DNUMBERには、主インデックス(100)が存在し、主インデックスは、各ブロックに対してインデックスポインタを持っている。リレーションDEPARTMENTの属性DPHONEには、2次インデックス(102)が存在し、2次インデックスはリレーションDEPARTMENT内の各レコードに対してインデックスポインタを持っている。
リレーションEMPLOYEE(図3−2参照)には、20件のレコードが5つのブロックに格納してあり、それぞれのブロックには4件レコードが存在しており、各ブロックは次のブロックに対してブロックポインタを持っている。リレーションEMPLOYEEの主属性SSNには、主インデックス(104)が存在し、主インデックスは各ブロックに対してインデックスのポインタを持っている。
リレーションWORKS_ON(図3−3(d)参照)には、25件のレコードが5つのブロックに格納してあり、それぞれのブロックには5件のレコードが存在する。各ブロックは、次のブロックに対してブロックポインタを持っている。リレーションWORKS_ONの主属性ESSN,PNOは、リレーションEMPLOYEE,PROJECTに対する外部キーである。以上をまとめると次のような表になる。
次に、図3−1〜図3−3に示したデータベースをもとにして合成関係演算を利用したマルチオペレーション・プロセッシングを説明するために、下記に示すようなクエリーQ1,Q2,Q3,Q4,Q5,Q6処理を取り上げることにする。図3−1〜図3−3のデータベースに対して、次のような6つのクエリーQ1,Q2,Q3,Q4,Q5,Q6の問い合わせがあったとする。
FROM DEPARTMENT,EMPLOYEE,PROJECT,WORKS_ON
WHERE DPHONE=23-3732 AND DNUMBER=DNUM AND
BDATE<'DEC-31-1961' AND SSN=ESSN AND
PNAME='Aquarius' AND PLOCATION='New York' AND PNUMBER=PNO;
FROM EMPLOYEE,DEPARTMENT,PROJECT
WHERE SSN=164545566 AND SSN=MGRSSN AND
PNAME='Stafford' AND PLOCATION='New York' AND DNUMBER=DNUM;
FROM DEPARTMENT,EMPLOYEE
WHERE DNUMBER=DNUM AND BDATE>'JAN-1-1971';
FROM PROJECT,DEPARTMENT,EMPLOYEE
WHERE DNUMBER=DNUM AND PNUMBER=PNO AND SSN=ESSN;
FROM DEPARTMENT,EMPLOYEE,WORKS_ON
WHERE DNUMBER=DNUM AND SSN=ESSN AND HOURS<10;
FROM DEPARTMENT,EMPLOYEE
WHERE DNUMBER=7 AND DNUMBER=DNUM AND
BDATE>'FEB-11-1959' AND BDATE<'NOV-21-1966';
クエリー・プロセッサは、問い合わせのあった各クエリーQ1,Q2,Q3,Q4,Q5,Q6に対して、クエリーの最適化を行い、各クエリーを処理していくための最良な処理方法である下記の処理プランを作成していくことになる。クエリーQ1に対して処理プランP1を作成し、クエリーQ2に対して処理プランP2を作成し、クエリーQ3に対して処理プランP3を作成し、クエリーQ4に対して処理プランP4を作成し、クエリーQ5に対して処理プランP5を作成し、クエリーQ6に対して処理プランP6を作成する。
処理ツリーPi内のタスクti j(iは処理ツリーの番号、jはそれぞれの処理ツリー内の処理番号を表わしている)は、以下に示すように、
(ti j):処理結果←関係代数
として表し、処理結果は関係代数を処理した結果を表すものとする。処理結果名がTEMP_Tj_iの場合は、処理ツリーPi内のタスクti jの処理結果(処理ツリーの中間結果)を表し、処理結果がRESULT_Qiの場合は、処理ツリーPiの処理結果であることを表している。関係代数は、データベースのリレーションに対して、直接的に処理を行う演算であり、選択演算(σ)、射影演算(π)、結合演算(|X|)などの演算である。
(t1 1): TEMP_T1_1←σDPHONE=23-3732DEPARTMENT
(t1 2): TEMP_T2_1←πDNUMBER,DNAMETEMP_T1_1
(t1 3): TEMP_T3_1←σBDATE<'DEC-31-1961'EMPLOYEE
(t1 4): TEMP_T4_1←πSSN,LNAME,DNUMTEMP_T3_1
(t1 5): TEMP_T5_1←TEMP_T2_1 |X|DNUMBER=DNUMTEMP_T4_1
(t1 6): TEMP_T6_1←πSSN,LNAME,DNUMBER,DNAMETEMP_T5_1
(t1 7): TEMP_T7_1←σPNAME='Aquarius” AND PLOCATION='New York'PROJECT
(t1 8): TEMP_T8_1←πPNUMBER,PNAMETEMP_T7_1
(t1 9): TEMP_T9_1←πESSN,PNOWORKS_ON
(t1 10):TEMP_T10_1←TEMP_T8_1 |X|PNUMBER=PNOTEMP_T9_1
(t1 11):TEMP_T11_1←πESSN,PNUMBER,PNAMETEMP_T10_1
(t1 12):TEMP_T12_1←TEMP_T6_1 |X|SSN=ESSNTEMP_T11_1
(t1 13): RESULT_Q1←πLNAME,DNUMBER,DNAME,PNUMBER,PNAMETEMP_T12_1
(t2 1):TEMP_T1_2←σSSN=164545566EMPLOYEE
(t2 2):TEMP_T2_2←πSSN,LNAME,BDATETEMP_T1_2
(t2 3):TEMP_T3_2←πDNUMBER,DNAME,MGRSSNDEPARTMENT
(t2 4):TEMP_T4_2←σPNAME='Stafford' AND PLOCATION='New York'PROJECT
(t2 5):TEMP_T5_2←πPNUMBER,PNAME,DNUMTEMP_T4_2
(t2 6):TEMP_T6_2←TEMP_T3_2 |X|DNUMBER=DNUMTEMP_T5_2
(t2 7):TEMP_T7_2←πDNUMBER,DNAME,MGRSSN,PNUMBER,PNAMETEMP_T6_2
(t2 8):TEMP_T8_2←TEMP_T2_2 |X|SSN=MGRSSNTEMP_T7_2
(t2 9):RESULT_Q2←πDNAME,DNUMBER,PNAME,PNUMBER,SSN,LNAME,BDATETEMP_T8_2
(t3 1):TEMP_T1_3←πDNUMBER,DNAMEDEPARTMENT
(t3 2):TEMP_T2_3←σBDATE>'JAN-1-1971'EMPLOYEE
(t3 3):TEMP_T3_3←πSSN,FNAME,LNAME,DNUMTEMP_T2_3
(t3 4):TEMP_T4_3←TEMP_T1_3 |X|DNUMBER=DNUMTEMP_T3_3
(t3 5):RESULT_Q3←πSSN,FNAME,LNAME,DNAME,DNUMBERTEMP_T4_3
(t4 1):TEMP_T1_4←DEPARTMENT |X|DNUMBER=DNUMEMPLOYEE
(t4 2):TEMP_T2_4←PROJECT |X|PNUMBER=PNOWORKS_ON
(t4 3):RESULT_Q4←TEMP_T1_4 |X|SSN=ESSNTEMP_T2_4
(t5 1):TEMP_T1_5←DEPARTMENT |X|DNUMBER=DNUMEMPLOYEE
(t5 2):TEMP_T2_5←σHOURS<10WORKS_ON
(t5 3):RESULT_Q5←TEMP_T1_5 |X|SSN=ESSNTEMP_T2_5
(t6 1):TEMP_T1_6←σDNUMBER=7DEPARTMENT
(t6 2):TEMP_T2_6←πDNUMBER,DNAMETEMP_T1_6
(t6 3):TEMP_T3_6←σBDATE>'FEB-11-1959' AND BDATE < NOV-21-1966'EMPLOYEE
(t6 4):TEMP_T4_6←πFNAME,LNAME,DNUMTEMP_T3_6
(t6 5):TEMP_T5_6←TEMP_T2_6 |X|DNUMBER=DNUMTEMP_T4_6
(t6 6):RESULT_Q6←πFNAME,LNAME,DNUMBER,DNAMETEMP_T5_6
[(a)タスクのグループ化]
合成関係演算を利用したマルチオペレーション・プロセッシングを適用するにあたって、図4−1〜図4−3に示した処理プランP1,P2,P3,P4,P5,P6にもとづいて作成された処理ツリーからトポロジカルソートの順番で、他のタスクから依存がなく直接的に処理できるタスクt1 1,t1 3,t1 7,t1 9,t2 1,t2 3,t2 4,t3 1,t3 2,t4 1,t4 2,t5 1,t5 2,t6 1,t6 3を見つけて、各タスクがアクセスするデータベースのリレーションをもとにグループに分けていくと、次のようにグループ分けすることになる。
EMPLOYEE: グループ G1={t1 3,t2 1,t3 2,t4 1,t5 1,t6 3}
DEPARTMENT:グループ G2={t1 1,t2 3,t3 1,t6 1}
PROJECT: グループ G3={t1 7,t2 4}
WORKS_ON: グループ G4={t1 9,t4 2,t5 2}
グループG1,G2,G3,G4にタスクが分けられると、グループ内のタスクで共通部分式を持っているタスクは、次のようにさらに共通部分式ごとにサブグループSG1G1,SG2G1,SG1G2,SG1G3に分けていくことになる。
サブグループ SG1G1={t1 3,t3 2,t6 3}
サブグループ SG2G1={t4 1,t5 1}
DEPARTMENT: グループ G2 ={SG1G2,t1 1,t6 1}
サブグループ SG1G2={t2 3,t3 1}
PROJECT: グループ G3 ={SG1G3}
サブグループ SG1G3={t1 7,t2 4}
WORKS_ON: グループ G4 ={t1 9,t4 2,t5 2}
サブグループSG2G1はリレーションEMPLOYEEに対して共通部分式の定義で述べた同一の関係演算の処理を行うタスクが集められたサブグループである。
サブグループSG1G2はリレーションDEPARTMENTに対して共通部分式の定義で述べた射影演算の処理を行うタスクのサブグループである。
サブグループSG1G3はリレーションPROJECTに対して共通部分式の定義で述べた属性PNAME,PLOCATIONを選択条件に使用する選択演算タスクが集められたサブグループであり、これらのタスクが使用する選択条件において、属性PNAMEに関する選択条件は異なっているが、それ以外の属性PLOCATIONに関する選択条件は全く同じ条件である。
グループG4内のタスクt1 9,t4 2,t5 2は共通部分式を持っていないので、グループG4にサブグループは作成されないことになる。
グループ内にサブグループが作成されると、作成されたサブグループSG1G1,SG2G1,SG1G2,SG1G3に対して次のように合成関係演算タスクtG1 SG1,tG1 SG2,tG2 SG1,tG3 SG1を作成することができる。
(tG1 SG1):TEMP_SG1_G1←σBDATE<'NOV-21-1966' OR BDATE>'JAN-1-1971'EMPLOYEE
(tG1 SG2):TEMP_SG2_G1←DEPARTMENT |X|DNUMBER=DNUMEMPLOYEE
(tG2 SG1):TEMP_SG1_G2←πDNUMBER,DNAME,MGRSSNDEPARTMENT
(tG3 SG1):TEMP_SG1_G3←σPLOCATION='New York' AND (PNAME='Aquarius” OR PNAME='Stafford')PROJECT
タスクtG1 SG1は、下記に示すようにサブグループSG1G1内の選択演算タスクt1 3,t3 2,t6 3の選択条件をブール演算のORを用いて接続して1つの選択条件<temp_cond>を作成し、接続した選択条件から選択範囲の重複した部分を取り除くために、簡潔化し最適化Optimize(<temp_cond>)した選択条件を作成し、その選択条件を用いた合成選択演算タスクである。
<temp_cond>=(BDATE<'DEC-31-1961') OR (BDATE>'JAN-1-1971') OR
(BDATE>'FEB-11-1959' AND BDATE<'NOV-21-1966')
Optimize(<temp_cond>) ⇒ BDATE<'NOV-21-1966' OR BDATE>'JAN-1-1971'
Optimize(<temp_cond>)によって表わされる選択条件は、ブール演算のORを用いて作成した選択条件<temp_cond>を最適化するために、それぞれの選択条件の選択範囲の論理和(Union)を求めて、選択範囲の重複した部分を取り除いて新たに簡潔化された選択条件として得られたものである。
図6(a)は、ブール演算のORを使用して接続しているタスクt1 3の選択条件BDATE<'DEC-31-1961'である生年月日の選択範囲、タスクt6 3の選択条件BDATE>'FEB-11-1959' AND BDATE<'NOV-21-1966'である生年月日の選択範囲、タスクt3 2の選択条件BDATE>'JAN-1-1971'の生年月日の選択範囲を、生年月日の値が小さいほうから順番に左から右に1つの水平な線上に表している。
次に、図6(b)に示すように、タスクt1 3,t3 2,t6 3の選択条件に使われている生年月日の選択範囲の論理和(Union)を求めると、BDATEの値がNOV-21-1966以前とBDATEの値JAN-1-1971以降のBDATEの選択範囲のみが必要になることがわかる。
このようにして選択条件の選択範囲の論理和で求めた生年月日の選択範囲を新たな選択条件に直すと”BDATE<'NOV-21-1966' OR BDATE>'JAN-1-1971'”と簡潔化された選択条件になり、この選択条件を前述したように合成選択演算タスクtG1 SG1の選択演算の選択条件として使用することになる。
タスクtG2 SG1は、サブグループSG1G2内の射影演算タスクt2 3,t3 1に使われている属性を、和集合(Union)を使用して作成した合成射影演算タスクである。
タスクtG3 SG1は、下記に示すようにサブグループSG1G3内の選択演算タスクt1 7,t2 4の選択条件をブール演算のORを用いて接続して1つの選択条件<temp_cond>を作成し、接続した選択条件から選択範囲の重複した部分を取り除くために最適化Optimize(<temp_cond>)を行って作成した合成選択演算タスクである。
<temp_cond>=(PNAME='Aquarius' AND PLOCATION='New York') OR
(PNAME='Stafford' AND PLOCATION='New York')
Optimize(<temp_cond>) ⇒ PLOCATION='New York' AND (PNAME='Aquarius' OR PNAME='Stafford')
EMPLOYEE: グループ G1={tG1 SG1,tG1 SG2,t2 1}
DEPARTMENT:グループ G2={tG2 SG1,t1 1,t6 1}
PROJECT: グループ G3={tG3 SG1}
WORKS_ON: グループ G4={t1 9,t4 2,t5 2}
グループ内のサブグループが合成関係演算タスクで置き換えられると、マルチオペレーション・プロセッシングを適用して、グループ内の合成関係演算タスクを含むグループ内のタスクの処理を一度に行っていくことにする。マルチオペレーション・プロセッシングとして、スタティック・マルチオペレーション・プロセッシング(特願2006−356406号参照)を使用して、グループG1,G2,G3,G4の処理を行っていく場合について記述する。
スタティックマルチオペレーション・プロセッシングを使用してグループG1内の合成選択演算タスクtG1 SG1,tG1 SG2及びサブグループに集まらないタスクt2 1の処理を一度に行うことにする。前述したように、グループG1内の各タスクは次のようなものである。
EMPLOYEE:グループ G1={tG1 SG1,tG1 SG2,t2 1}
(tG1 SG1):TEMP_SG1_G1←σBDATE<'NOV-21-1966' OR BDATE>'JAN-1-1971'EMPLOYEE
(tG1 SG2):TEMP_SG2_G1←DEPARTMENT |X|DNUMBER=DNUMEMPLOYEE
(t2 1): TEMP_T1_2←σSSN=164545566EMPLOYEE
まずグループG1内のタスクtG1 SG1,tG1 SG2,t2 1に対して次のようなアクセスプランを作成する。
plan(tG1 SG1):EMPLOYEEを線形探索して選択処理を行う。
plan(tG1 SG2):EMPLOYEEをスキャンしてDEPARTMENTの主インデックスを使用して結合処理を行う。
plan(t2 1): EMPLOYEEの主インデックスを使った選択処理を行う。
各タスクに対してアクセスプランを作成した後に、アクセスプランをもとに各タスクの処理コストを計算すると、以下のようになる。
タスクtG1 SG1の処理コスト:cost(tG1 SG1)=b=5
タスクtG1 SG2の処理コスト:cost(tG1 SG2)=bE+(|EMPLOYEE|*(xD+1))=5+(20*(1+1))=45
タスクt2 1の処理コスト:cost(t2 1)=xE+1=2
処理コストとはタスクの処理を行うためにディスクをアクセスする回数である。ここではタスクの処理を行うためにディスクをアクセスする回数を減らすのが目的であるので、メインメモリで計算する時間、処理結果をディスクに保存するコストは省略することにする。また、cost()は、処理コストを表すものとする。
タスクtG1 SG2の処理コストは、リレーションEMPLOYEEをスキャンする処理コストbEとEMPLOYEE内の各レコードに対してリレーションDEPARTMENTの主インデックスを使用して結合できるレコードを検索する処理コスト|EMPLOYEE|*(xD+1)を合計した処理コストである。
リレーションEMPLOYEEには、20件のレコードが5つのブロックに格納してある。xD+1は、B+ツリーインデックスなどマルチレベルのインデックスのレベルとブロックをアクセスする処理コストであり、図3−1のリレーションDEPARTMENTに存在する主インデックスのレベルxDは1であるので、タスクtG1 SG2の処理コストは、bE+(|EMPLOYEE|*(xD+1))=5+(20*(1+1))=45である。
タスクt2 1の処理コストは、主インデックスを使用して1つのレコードを検索する処理コストである。これは、リレーションのEMPLOYEEの主インデックスのレベルxEとブロックをアクセスする処理コストであり、図3−2のリレーションEMPLOYEEの主インデックスのレベルは1であるので、処理コストはxE+1=2である。
sort(tG1 SG1,tG1 SG2,t2 1) ⇒ (t2 1,tG1 SG1,tG1 SG2)
sort(…)は並べ替えを表している。
タスクt2 1,tG1 SG1,tG1 SG2を処理するにあたって、インデックスを用いてアクセスする必要のあるリレーションのすべてのブロックを事前に調べて、各タスクに対応するブロック集合B2 1,BG1 SG1,BG1 SG2に集めると、次のようになる。
タスクt2 1に対するブロック集合:B2 1={b2}
タスクtG1 SG1に対するブロック集合:BG1 SG1={b1,b2,b3,b4,b5}
タスクtG1 SG2に対するブロック集合:BG1 SG2={b1,b2,b3,b4,b5}
このように、各タスクt2 1,tG1 SG1,tG1 SG2に対応するブロック集合B2 1,BG1 SG1,BG1 SG2を見出すことができるのは、以下に示すような理由にもとづくからである。
以上のように、各タスクに対応するブロック集合を見出した後に、処理コストの小さいタスクから処理コストの大きいタスクへと順番に、すなわちタスクt2 1,tG1 SG1,tG1 SG2の順番に各タスクに対応するブロック集合の和集合を求めていくことにする。
まず、TB0={}(空集合)として、TB0とタスクt2 1に対応するブロック集合B2 1と和集合TB2 1を求める。次に、このTB2 1とタスクtG1 SG1に対応するブロック集合BG1 SG1の和集合TBG1 SG1を求める。さらに、このTBG1 SG1とタスクtG1 SG2に対応するブロック集合BG1 SG2との和集合TBG1 SG2を求めると次のようになる。この場合、和集合を求めるに当たっては、新たに加える集合は和集合の中で最後に加えていくものとする。
TB0={}
タスクt2 1に対応する集合B2 1との和集合:TB2 1=TB0∪B2 1={b2}
タスクtG1 SG1に対応する集合BG1 SG1との和集合:TBG1 SG1=TB2 1∪BG1 SG1={b2,b1,b3,b4,b5}
タスクtG1 SG2に対応する集合BG1 SG2との和集合:TBG1 SG2=TBG1 SG1∪BG1 SG2={b2,b1,b3,b4,b5}
以上のように、それぞれの共通ブロックでどのようなタスクが処理されるかを見出すためには、タスクt2 1,tG1 SG1,tG1 SG2に対して作成されたブロック集合B2 1,BG1 SG1,BG1 SG2の情報にもとづいて、次に記述するような手順を用いればよい。
最初に、ブロックの相対アドレスが256であるブロックb2をディスクからアクセスして、ブロックb2内のデータをメインメモリに読み込み、グループ内のタスクt2 1,tG1 SG1,tG1 SG2がブロックb2で処理を行う必要があるかどうかを調べるため、ブロックb2を集合{b2}として表し、この{b2}とブロックの集合B2 1,BG1 SG1,BG1 SG2との間でそれぞれ積集合(Intersection)を求めると次のようになる。
タスクt2 1に対して:B2 1∩{b2}={b2}
タスクtG1 SG1に対して:BG1 SG1∩{b2}={b2}
タスクtG1 SG2に対して:BG1 SG2∩{b2}={b2}
タスクt2 1に対して:B2 1−{b2}={}=B2 1(1)
タスクtG1 SG1に対して:BG1 SG1−{b2}={b1,b3,b4,b5}=BG1 SG1(1)
タスクtG1 SG2に対して:BG1 SG2−{b2}={b1,b3,b4,b5}=BG1 SG2(1)
この結果、集合B2 1(1)が空集合{}になりタスクt2 1の処理が終了したことがわかる。
タスクtG1 SG1に対して:BG1 SG1(1)∩{b1}={b1}
タスクtG1 SG2に対して:BG1 SG2(1)∩{b1}={b1}
タスクtG1 SG1,tG1 SG2に対する積集合が{b1}となり、タスクtG1 SG1,tG1 SG2がメインメモリに読み込んだブロックb1で処理を行うことが必要となり、ブロックb1は共通ブロックとなり、共通ブロックb1で各タスクの処理を行うことになる。共通ブロックであるブロックb1でのタスクの処理が終了すると、ブロックb1を再びアクセスする必要がなくなるので、集合BG1 SG1(1),BG1 SG2(1)と集合{b1}との差集合を求める。得られた差集合の値をBG1 SG1(2),BG1 SG2(2)とすると、次のようになる。
タスクtG1 SG1に対して:BG1 SG1(1)−{b1}={b3,b4,b5}=BG1 SG1(2)
タスクtG1 SG2に対して:BG1 SG2(1)−{b1}={b3,b4,b5}=BG1 SG2(2)
タスクtG1 SG1に対して:BG1 SG1(2)∩{b3}={b3}
タスクtG1 SG2に対して:BG1 SG2(2)∩{b3}={b3}
タスクtG1 SG1,tG1 SG2に対する積集合が{b3}となり、タスクtG1 SG1,tG1 SG2がメインメモリに読み込んだブロックb3で処理を行うことが必要となり、ブロックb3は共通ブロックとなり、共通ブロックb3でタスクtG1 SG1,tG1 SG2の処理を行うことになる。共通ブロックであるブロックb3でのタスクの処理が終了すると、ブロックb3を再びアクセスする必要がなくなるので、集合BG1 SG1(2),BG1 SG2(2)と集合{b3}との差集合を求めて、得られた差集合の値をBG1 SG1(3),BG1 SG2(3)とすると、次のようになる。
タスクtG1 SG1に対して:BG1 SG1(2)−{b3}={b4,b5}=BG1 SG1(3)
タスクtG1 SG2に対して:BG1 SG2(2)−{b3}={b4,b5}=BG1 SG2(3)
タスクtG1 SG1に対して:BG1 SG1(3)∩{b4}={b4}
タスクtG1 SG2に対して:BG1 SG2(3)∩{b4}={b4}
タスクtG1 SG1,tG1 SG2に対する積集合が{b4}となり、タスクtG1 SG1,tG1 SG2がメインメモリに読み込んだブロックb4で処理を行うことが必要となり、ブロックb4は共通ブロックとなり、共通ブロックb4でタスクtG1 SG1,tG1 SG2の処理を行うことになる。共通ブロックであるブロックb4でのタスクの処理が終了すると、ブロックb4を再びアクセスする必要がなくなるので、集合BG1 SG1(3),BG1 SG2(3)と集合{b4}との差集合を求める。得られた差集合の値をBG1 SG1(4),BG1 SG2(4)とすると、次のようになる。
タスクtG1 SG1に対して:BG1 SG1(3)−{b4}={b5}=BG1 SG1(4)
タスクtG1 SG2に対して:BG1 SG2(3)−{b4}={b5}=BG1 SG2(4)
タスクtG1 SG1に対して:BG1 SG1(4)∩{b5}={b5}
タスクtG1 SG2に対して:BG1 SG2(4)∩{b5}={b5}
タスクtG1 SG1,tG1 SG2に対する積集合が{b5}となり、タスクtG1 SG1,tG1 SG2がメインメモリに読み込んだブロックb5で処理を行うことが必要となり、ブロックb5は共通ブロックとなり、共通ブロックb5でタスクtG1 SG1,tG1 SG2の処理を行う。共通ブロックであるブロックb5でのタスクの処理が終了すると、ブロックb5を再びアクセスする必要がなくなるので、集合BG1 SG1(4),BG1 SG2(4)と集合{b5}との差集合を求める。得られた差集合の値をBG1 SG1(5),BG1 SG2(5)とすると、次のようになる。
タスクtG1 SG1に対して:BG1 SG1(4)−{b5}={}=BG1 SG1(5)
タスクtG1 SG2に対して:BG1 SG2(4)−{b5}={}=BG1 SG2(5)
この結果、集合BG1 SG1(5),BG1 SG2(5)が空集合{}になり、タスクtG1 SG1,tG1 SG2の処理が終了したことがわかり、これによってグループ内のすべてのタスクの処理が終了したことになる。
図7において、リレーションEMPLOYEEに対するタスクt2 1,tG1 SG1,tG1 SG2の処理を、処理コストの小さいタスクからアクセスしてく状態(スキャン1からスキャン3にわたって)と、処理結果のリレーションTEMP_T1_2,TEMP_SG1_G1,TEMP_SG2_G1に書き込んだ結果を表わしている。
一連のタスクの処理を行うプロセス(501)は、ディスク内のブロックをスキャン1でb2を、スキャン2でb1を、スキャン3でb3,b4,b5を、順にアクセスする。
プロセス(501)は、アクセスする各ブロックにおいて、そのブロックで処理を行う必要のあるグループ内のタスクの処理を一度に行い、処理結果をリレーションTEMP_T1_2,TEMP_SG1_G1,TEMP_SG2_G1に書き込み、すべてのブロックでのタスク処理が終了すると、スタティック・マルチオペレーション・プロセッシングによるグループG1のタスク処理は終了したことになる。
図7において、合成選択演算タスクtG1 SG1の処理結果TEMP_SG1_G1(503)は、サブグループ内のタスクt1 3,t3 2,t6 3の処理結果のすべてを含んでいるため、サブグループ内のタスクt1 3,t3 2,t6 3は、合成選択演算タスクtG1 SG1 の処理結果TEMP_SG1_G1(503)を部分的に共有することになる。
TEMP_T3_1={リレーション:TEMP_SG1_G1; 行:1〜9; ブロック:b1[0,256],b2[256,512],b3[512,768]};
TEMP_T2_3={リレーション:TEMP_SG1_G1; 行:13〜16; ブロック:b4[768,-]};
TEMP_T3_6={リレーション:TEMP_SG1_G1; 行:7〜12; ブロック:b2[256,512],b3[512,768]};
仮想リレーションTEMP_T2_3は、サブグループSG1G1内のタスクt3 2の処理結果であり、TEMP_SG1_G1のブロックb4に格納してあるレコードの13行から16行までを共有していることを表わしている。
仮想リレーションTEMP_T3_6は、サブグループSG1G1内のタスクt6 3の処理結果であり、TEMP_SG1_G1のブロックb2,b3に格納してあるレコードの7行から12行までを共有していることを表わしている。
合成選択演算タスクの処理結果得られたリレーションのレコードをサブグループ内個々の選択演算タスクが仮想リレーションを用いて部分的に共有するには、以下の手順を用いることになる。
(i)合成選択演算タスクの処理結果内のレコードは合成選択演算の選択条件に使用された属性の値で整列する。
(ii)整列された処理結果内のレコードをスキャンし、1つ1つのレコードがサブグループ内個々の選択演算タスクの選択条件を満たしているかどうかを調べていく。
(iii)合成選択演算タスクの処理結果において、どの行からどの行までのレコードがサブグループ内個々の選択演算タスクの選択範囲内のレコードであったかをそれぞれの処理結果である仮想リレーションに記録しておく。
サブグループ SG1G1={t1 3,t3 2,t6 3}
(t1 3):TEMP_T3_1←σBDATE<'DEC-31-1961'EMPLOYEE
(t3 2):TEMP_T2_3←σBDATE>'JAN-1-1971'EMPLOYEE
(t6 3):TEMP_T3_6←σBDATE>'FEB-11-1959' AND BDATE<NOV-21-1966'EMPLOYEE
グループG1の合成関係演算タスクtG1 SG2の処理結果TEMP_SG2_G1は、サブグループSG2G1内のタスクt4 1,t5 1によって共有されることになる。合成関係演算タスクtG1 SG2は結合演算であり、サブグループSG2G1内のタスクt4 1,t5 1は、同一のタスク(t4 1≡t5 1)なので、タスクt4 1の処理結果TEMP_T1_4とタスクt5 1の処理結果TEMP_T1_5は、合成関係演算タスクtG1 SG2の処理結果TEMP_SG2_G1をそのまま、それぞれのタスクの処理結果として使用することになる(TEMP_T1_4≡TEMP_T1_5≡TEMP_SG2_G1)。
マルチオペレーション・プロセッシングを使用してグループG1内の合成関係演算タスクtG1 SG1,tG1 SG2及びサブグループに集まらないタスクt2 1の処理が、タスクt2 1,tG1 SG1,tG1 SG2の順番で終了すると、図4−1〜図4−3の処理ツリーからトポロジカルソートの順番で新たに処理できるタスクを見出していくことになる。
最初にタスクt2 1が終了すると、処理ツリーP2からわかるように、新たにタスクt2 2の処理を始めることができるようになる。タスクt2 2は、タスクt2 1の処理結果TEMP_T1_2に対して処理を行うタスクとして、新たにグループG5(これまでのグループG4に加えて)を作成してグループG5にタスクt2 2を加えることにする。
TEMP_T1_2:グループ G5={t2 2}
(t2 2):TEMP_T2_2←πSSN,LNAME,BDATETEMP_T1_2
TEMP_SG1_G1:グループ G6={t1 4,t3 3,t6 4}
(t1 4):TEMP_T4_1←πSSN,LNAME,DNUMTEMP_T3_1
(t3 3):TEMP_T3_3←πSSN,FNAME,LNAME,DNUMTEMP_T2_3
(t6 4):TEMP_T4_6←πFNAME,LNAME,DNUMTEMP_T3_6
次に、マルチオペレーション・プロセッシングを使用してグループG2内の合成射影演算タスクtG2 SG1及びサブグループに集まらないタスクt1 1,t6 1の処理を一度に行うことにする。前述したように、グループG2内の各タスクは次のようなものである。
DEPARTMENT:グループ G2={tG2 SG1,t1 1,t6 1}
(tG2 SG1):TEMP_SG1_G2←πDNUMBER,DNAME,MGRSSNDEPARTMENT
(t1 1): TEMP_T1_1←σDPHONE=23-3732DEPARTMENT
(t6 1): TEMP_T1_6←σDNUMBER=7DEPARTMENT
まず、グループG2内の合成射影演算タスクtG2 SG1及びサブグループに集められないタスクt1 1,t6 1に対して次のようなアクセスプランを作成する。
plan(tG2 SG1):DEPARTMENTをスキャンして射影演算を行う。
plan(t1 1):DEPARTMENTの2次インデックスを使用して1つのレコードを検索する。
plan(t6 1):DEPARTMENTの主インデックスを使用して1つのレコードを検索する。
各タスクに対してアクセスプランを作成すると、アクセスプランをもとに、各タスクの処理コストを計算する。
タスクtG2 SG1の処理コスト:cost(tG2 SG1)=bD=5
タスクt1 1の処理コスト:cost(t1 1)=xD2+1=3
タスクt6 1の処理コスト:cost(t6 1)=xD1+1=2
タスクtG2 SG1の処理コストは、リレーションDEPARTMENTをスキャンして射影演算の処理を行うために、リレーション中のすべてのブロックをアクセスする処理コストなのでbD=5である。
タスクt6 1の処理コストは、リレーションDEPARTMENTの主インデックス(100)を使用して1つのレコードを検索する処理コストである。xD1+1は、リレーションDEPARTMENTの主インデックス(100)を使用して目的のデータを見つけるためにアクセスするインデックスのレベルxD1と当面のブロックをアクセスする処理コストである。図3−1のリレーションDEPARTMENTの主インデックス(100)のレベルは1であるので(xD1=1となり)、タスクt6 1の処理コストはxD1+1=2である。
sort(tG2 SG1,t1 1,t6 1)⇒(t6 1,t1 1,tG2 SG1)
タスクt6 1,t1 1,tG2 SG1に対して、インデックスを使用して、アクセスする必要のあるすべてのブロックを事前に調べて、各タスクに対応するブロック集合B6 1,B1 1,BG2 SG1に集めると、次のようになる。
タスクt6 1に対して:B6 1={b2}
タスクt1 1に対して:B1 1={b5}
タスクtG2 SG1に対して:BG2 SG1={b1,b2,b3,b4,b5}
このように、各タスクt6 1,t1 1,tG2 SG1 に対応するブロック集合B6 1,B1 1,BG2 SG1を見出すことができるのは、以下に示すような理由にもとづくからである。
タスクt6 1は、選択条件”DNUMBER=7”を満たすレコードが必要である。リレーションDEPARTMENTの主インデックスを使用すると、属性DNUMBERの値が7であるレコードはブロックの相対アドレスが256であるブロックb2に格納してあることがわかり、ブロックb2だけをアクセスすることが必要となるので、タスクt6 1の処理を行うためにアクセスする必要のあるブロックの集合は{b2}となる。
タスクtG2 SG1は、射影演算の処理を行うために、リレーションDEPARTMENT内の最初のブロックb1から最後のブロックb5までのブロックをアクセスすることが必要となるので、タスクtG2 SG1の処理を行うためにアクセスする必要のあるブロック集合は{b1,b2,b3,b4,b5}となる。
以上のように、各タスクに対応するブロック集合を見出した後に、処理コストの小さいタスクから処理コストの大きいタスクへと順番に、すなわちタスクt6 1,t1 1,tG2 SG1の順番に各タスクに対応するブロック集合の和集合を求めていくことにする。
まず、TB0={}(空集合)として、TB0とタスクt6 1に対応するブロック集合B6 1と和集合TB6 1を求める。次に、このTB6 1とタスクt1 1に対応するブロック集合B1 1の和集合TB1 1を求める。さらに、このTB1 1とタスクtG2 SG1に対応するブロック集合BG2 SG1との和集合TBG2 SG1を求めると次のようになる。この場合、和集合を求めるに当たっては、新たに加える集合は和集合の中で最後に加えていくものとする。
TB0={}
タスクt6 1に対応する集合B6 1との和集合:TB6 1=TB0∪B6 1={b2}
タスクt1 1に対応する集合B1 1との和集合:TB1 1=TB6 1∪B1 1={b2,b5}
タスクtG2 SG1に対応する集合BG2 SG1との和集合:TBG2 SG1=TB1 1∪BG2 SG1={b2,b5,b1,b3,b4}
以上のように、それぞれの共通ブロックでどのようなタスクが処理されるかを見出すためには、タスクt6 1,t1 1,tG2 SG1に対して作成されたブロック集合B6 1,B1 1,BG2 SG1の情報にもとづいて、次に記述するような手順を用いればよい。
最初に、ブロックの相対アドレスが256であるブロックb2をディスクからアクセスして、ブロックb2内のデータをメインメモリに読み込み、グループ内のタスクt6 1,t1 1,tG2 SG1がブロックb2で処理を行う必要があるかどうかを調べるため、ブロックb2を集合{b2}として表し、この集合{b2}とブロックの集合B6 1,B1 1,BG2 SG1との間でそれぞれ積集合(Intersection)を求めると次のようになる。
タスクt6 1に対して:B6 1∩{b2}={b2}
タスクt1 1に対して:B1 1∩{b2}={}
タスクtG2 SG1に対して:BG2 SG1∩{b2}={b2}
タスクt6 1に対して:B6 1−{b2}={}=B6 1(1)
タスクtG2 SG1に対して:BG2 SG1−{b2}={b1,b3,b4,b5}=BG2 SG1(1)
この結果、集合B6 1(1)が空集合{}になりタスクt6 1の処理が終了したことがわかる。
タスクt1 1に対して:B1 1∩{b5}={b5}
タスクtG2 SG1に対して:BG2 SG1(1)∩{b5}={b5}
タスクt1 1に対して:B1 1−{b5}={}=B1 1(1)
タスクtG2 SG1に対して:BG2 SG1(1)−{b5}={b1,b3,b4}=BG2 SG1(2)
この結果、集合B1 1(1)が空集合{}になりタスクt1 1の処理が終了したことがわかる。この段階で、グループに残ったタスクはtG2 SG1のみとなるので、リレーションDEPARTMENTから残ったブロックb1,b3,b4をアクセスしてタスクtG2 SG1の処理を行い、タスクtG2 SG1の処理が終了するとグループ内すべてのタスクの処理が終了することになる。
一連のタスクの処理を行うプロセス(701)は、ディスク内のブロックを、図9で示すように、ブロックb2,b5,b1,b3,b4の順番でアクセスし、各ブロックにおいて、そのブロックで処理を行う必要のあるグループ内のタスクの処理を行い、処理結果をリレーションTEMP_T1_6(704),TEMP_T1_1(703),TEMP_SG1_G2(705)に書き込み、すべてのブロックでのタスク処理が終了するとスタティックマルチオペレーション・プロセッシングによるグループG2のタスク処理は終了したことになる。
合成射影演算タスクtG2 SG1の処理結果TEMP_SG1_G2は、サブグループSG1G2内の射影演算タスクt2 3,t3 1によって部分的に共有されることになる。前述したようにサブグループSG1G2内のタスクは次のようなものである。
サブグループ SG1G2={t2 3,t3 1}
(t2 3):TEMP_T3_2←πDNUMBER,DNAME,MGRSSNDEPARTMENT
(t3 1):TEMP_T1_3←πDNUMBER,DNAMEDEPARTMENT
合成射影演算タスクtG2 SG1の処理結果TEMP_SG1_G2内の属性(列)をサブグループSG1G2内の射影演算タスクt2 3,t3 1が部分的に共有するには、合成射影演算タスクtG2 SG1の処理を行った際に、処理結果TEMP_SG1_G2を共有するサブグループSG1G2内のタスクt2 3,t3 1に対して、図9に示した仮想リレーションTEMP_T3_2,TEMP_T1_3を作成することにする。仮想リレーションには、共有する合成射影演算の処理結果(リレーション)名、その処理結果を共有する属性の格納位置(列番号)を次のように記録しておくことにする。
TEMP_T3_2={リレーション:TEMP_SG1_G2; 列:1,2,3};
TEMP_T1_3={リレーション:TEMP_SG1_G2; 列:1,2};
仮想リレーションTEMP_T1_3は、サブグループSG1G2内のタスクt3 1の処理結果であり、合成射影演算タスクtG2 SG1の処理結果TEMP_SG1_G2の列1,2を共有する。
以上のようにして、サブグループに集められたいくつもの射影演算タスクを1つの合成射影演算タスクtG2 SG1に置き換えて処理を行い、サブグループSG1G2内のタスクt2 3,t3 1は、仮想リレーションを通して処理結果TEMP_SG1_G2内の属性(列)を部分的に共有することになり、サブグループ内の個々のタスクt2 3,t3 1に対して射影する属性が重なっているレコードを含んだ処理結果のリレーションをディスク上に別々に作成する必要がなくなるので、ディスクをアクセスする回数を減少させ、クエリーの処理速度を向上させることが可能になる。
以上のように合成関係演算を利用したマルチオペレーション・プロセッシングを使用してグループG2内の合成射影演算タスクtG2 SG1及びサブグループに集まらないタスクt6 1,t1 1の処理が、タスクt6 1,t1 1,tG2 SG1の順番で終了し、合成射影演算タスクtG2 SG1の処理結果TEMP_SG1_G2に対してインデックスが作成されると、図4−1〜図4−3の処理ツリーからトポロジカルソートの順番で新たに処理できるタスクを見出していくことになる。
次に、タスクt1 1が終了すると処理ツリーP1からわかるように新たにタスクt1 2の処理を始めることができるようになる。タスクt1 2は、タスクt1 1の処理結果TEMP_T1_1に対して処理を行うタスクとして新たにグループG8を作成してグループG8にタスクt1 2を加えることになる。
以上のことをまとめるとグループG2内のタスクの処理が終了することによって新たに見出されたタスクt6 2,t1 2をアクセスする処理結果のリレーションをもとに次のようにグループG7,グループG8が作成される。
TEMP_T1_6:グループ G7={t6 2}
(t6 2):TEMP_T2_6←πDNUMBER,DNAMETEMP_T1_6
TEMP_T1_1:グループ G8={t1 2}
(t1 2):TEMP_T2_1←πDNUMBER,DNAMETEMP_T1_1
グループG7には、タスクt6 1の処理結果TEMP_T1_6に対して処理を行うタスクt6 2が集められることになる。グループG8には、タスクt1 1の処理結果TEMP_T1_1に対して処理を行うタスクt1 2が集められることになる。
グループG2の処理が終了すると、次はグループG3内の合成選択演算タスクtG3 SG1の処理を行うことになる。前述したようにグループG3内の合成選択演算タスクは次のようなものである。
PROJECT:グループ G3={tG3 SG1}
(tG3 SG1):TEMP_SG1_G3←σPLOCATION='New York' AND (PNAME='Aquarius' OR PNAME='Stafford')PROJECT
グループG3には1つのタスクしか存在しないため、合成選択演算タスクtG3 SG1の処理を直接行うことになる。合成選択演算タスクtG3 SG1の処理が終了すると、PLOCATONがNew Yorkであり、PNAMEが'Aquarius' または'Stafford'であるレコードを2件ほど含んだ処理結果TEMP_SG1_G3を作成する。処理結果TEMP_SG1_G3内のレコードは属性PNAMEの値で整列し、サブグループSG1G3内のタスクt1 7,t2 4に対しては次のような仮想リレーションを作成する。
TEMP_T7_1={リレーション:TEMP_SG1_G3; 行:1; ブロック:b1};
TEMP_T4_2={リレーション:TEMP_SG1_G3; 行:2; ブロック:b1};
仮想リレーションTEMP_T7_1は、サブグループSG1G3内のタスクt1 7の処理結果であり、TEMP_SG1_G3のブロックb1に格納されている属性PNAMEの値がAquariusである1行目のレコードを共有することになる。
グループG3内の合成選択演算タスクtG3 SG1の処理が終了すると、サブグループSG1G3内のタスクt1 7,t2 4の処理が終了することになり、図4−1〜図4−3の処理ツリーP1,P2からわかるように、新たにタスクt1 8,t2 5を処理できるようになる。
タスクt1 8,t2 5はそれぞれアクセスする仮想リレーションが異なるが、タスクt1 8は、タスクt1 7の処理結果である仮想リレーションTEMP_T7_1を通して、合成選択演算タスクtG3 SG1の処理結果TEMP_SG1_G3をアクセスし、タスクt2 5は、タスクt2 4の処理結果である仮想リレーションTEMP_T4_2を通して、合成選択演算タスクtG3 SG1の処理結果TEMP_SG1_G3をアクセスすることになるので、共通のリレーションTEMP_SG1_G3に対して処理を行うタスクとして、新たにグループG9を作成して、グループG9にタスクt1 8,t2 5を加えることになる。
TEMP_SG1_G3:グループG9={t1 8,t2 5}
(t1 8):TEMP_T8_1←πPNUMBER,PNAMETEMP_T7_1
(t2 5):TEMP_T5_2←πPNUMBER,PNAME,DNUMTEMP_T4_2
次に、マルチオペレーション・プロセッシングを適用してグループG4内のタスクt1 9,t4 2,t5 2の処理を一度に行うことになる。前述したように、グループG4内の各タスクは次のようなものである。
WORKS_ON:グループ G4={t1 9,t4 2,t5 2}
(t1 9):TEMP_T9_1←πESSN,PNOWORKS_ON
(t4 2):TEMP_T2_4←PROJECT |X|PNUMBER=PNOWORKS_ON
(t5 2):TEMP_T2_5←σHOURS<10WORKS_ON
ここではマルチオペレーション・プロセッシングによるG4内のタスクt1 9,t4 2,t5 2の処理の説明は省略することにする。マルチオペレーション・プロセッシングによってグループG4内のタスクt1 9,t4 2,t5 2の処理を行うと、図4−1〜図4−3の処理ツリーからトポロジカルソートの順番で新たに処理できるタスクを見出していくことになる。
次に、タスクt4 2の処理が終了すると、処理ツリーP4からわかるように、グループG1内のタスクt4 1の処理はすでに終了しているので、新たにタスクt4 3の処理を始めることができるようになる。タスクt4 3はタスクt4 1の処理結果TEMP_T1_4とタスクt4 2の処理結果TEMP_T2_4を用いて結合演算の処理を行うタスクである。結合演算の検索元にTEMP_T2_4を使用するので、処理結果TEMP_T2_4に対して処理を行うタスクとして新たにグループG10を作成して、グループG10にタスクt4 3を加えることにする。
以上のことをまとめると、グループG4内のタスクt1 9,t4 2,t5 2の処理が終了することによって見出されたタスクt4 3,t5 3を次のようにグループに分けすることになる。タスクt4 3の処理結果は、クエリーQ4の最終の処理結果となるので、RESULT_Q4で表わすことにする。タスクt5 3の処理結果は、クエリーQ5の最終の処理結果となるので、RESULT_Q5で表わすことにする。
TEMP_T2_4:グループ G10={t4 3}
(t4 3):RESULT_Q4←TEMP_T1_4 |X|SSN=ESSNTEMP_T2_4
TEMP_T2_5:グループ G11={t5 3}
(t5 3):RESULT_Q5←TEMP_T1_5 |X|SSN=ESSNTEMP_T2_5
グループG4の処理が終了すると、次はグループG5の処理を行うことになる。前述したように、グループG5内のタスクは次のようなものである。
TEMP_T1_2:グループ G5={t2 2}
(t2 2):TEMP_T2_2←πSSN,LNAME,BDATETEMP_T1_2
グループG5には1つのタスクt2 2しか存在しておらず、タスクt2 2はタスクt2 1の処理結果TEMP_T1_2に対して射影演算の処理を行うタスクである。このようにグループに1つのタスクしか存在してしない場合は、グループG5内のタスクt2 2を直接処理することになる。
タスクt2 2の処理が終了すると、図4−2の処理ツリーP2からわかるように、グループG9内のタスクt2 5の処理が終了しておらず、グループに集められていないタスクt2 6,t2 7の処理も終了していないので、新たに処理できるタスクは見出されないのでグループは作成されない。
マルチオペレーション・プロセッシングを使用してグループG6内のタスクt1 4,t3 3,t6 4の処理を一度に行うことにする。前述したように、グループG6内のタスクは次のようなものである。
TEMP_SG1_G1:グループ G6={t1 4,t3 3,t6 4}
(t1 4):TEMP_T4_1←πSSN,LNAME,DNUM TEMP_T3_1
(t3 3):TEMP_T3_3←πSSN,FNAME,LNAME,DNUM TEMP_T2_3
(t6 4):TEMP_T4_6←πFNAME,LNAME,DNUM TEMP_T3_6
スタティック・マルチオペレーション・プロセッシングの処理方法にもとづいて、グループG6内の各タスクt1 4,t3 3,t6 4に対してアクセスプランを作成する。タスクt1 4の処理に用いられる仮想リレーションTEMP_T3_1,タスクt3 3の処理に用いられる仮想リレーションTEMP_T2_3,タスクt6 4の処理に用いられる仮想リレーションTEMP_T3_6からそれぞれタスクがアクセスするブロックを調べることになる。前述したように、仮想リレーションTEMP_T3_1,TEMP_T2_3,TEMP_T3_6には、合成選択演算タスクtG1 SG1の処理結果TEMP_SG1_G1を共有するブロックの番号とアドレスがすでに記録してあるので、事前にどのブロックをアクセスしたらよいかがわかる。タスクt1 4,t3 3,t6 4のアクセスプランは次のようになる。
plan(t1 4):TEMP_SG1_G1のブロックb1,b2,b3をアクセスして射影演算の処理を行う。
plan(t3 3):TEMP_SG1_G1のブロックb4をアクセスして射影演算の処理を行う。
plan(t6 4):TEMP_SG1_G1のブロックb2,b3をアクセスして射影演算の処理を行う。
アクセスプランをもとに各タスクの処理コストを計算すると、次のように表すことができる。
タスクt1 4の処理コスト:cost(t1 4)=3
タスクt3 3の処理コスト:cost(t3 3)=1
タスクt6 4の処理コスト:cost(t6 4)=2
タスクt1 4の処理コストは、リレーションTEMP_SG1_G1からブロックの相対アドレスが0,256,512である3つのブロックb1,b2,b3をアクセスして射影演算の処理を行う処理コストなので3である。
タスクt3 3の処理コストは、リレーションTEMP_SG1_G1からブロックの相対アドレスが768であるブロックb4をアクセスして射影演算の処理を行う処理コストなので1である。
タスクt6 4の処理コストは、リレーションTEMP_SG1_G1からブロックの相対アドレスが256,512である2つのブロックb2,b3をアクセスして射影演算の処理を行う処理コストなので2である。以上のように処理コストを計算すると、処理コストをもとにグループ内のタスクを処理コストの小さい順番で並べ替えると次のようになる。
sort(t1 4,t3 3,t6 4) ⇒ (t3 3,t6 4,t1 4)
仮想リレーションに記録してある情報をもとに、タスクt3 3,t6 4,t1 4がリレーションTEMP_SG1_G1からアクセスする必要のあるブロックを調べて、各タスクに対応するブロック集合B3 3,B6 4,B1 4に集めると、次のようになる。
タスクt3 3に対して:B3 3={b4}
タスクt6 4に対して:B6 4={b2,b3}
タスクt1 4に対して:B1 4={b1,b2,b3}
以上のように、各タスクに対応するブロック集合を見出した後に、処理コストの小さいタスクから処理コストの大きいタスクへと順番に、すなわちタスクt3 3,t6 4,t1 4の順番に各タスクに対応するブロック集合の和集合を求めていくことにする。
まず、TB0={}(空集合)として、TB0とタスクt3 3に対応するブロック集合B3 3と和集合TB3 3を求める。次に、このTB3 3とタスクt6 4に対応するブロック集合B6 4との和集合TB6 4を求める。さらに、このTB6 4とタスクt1 4に対応するブロック集合B1 4との和集合TB1 4を求めると次のようになる。この場合、和集合を求めるに当たっては、新たに加える集合は和集合の中で最後に加えていくものとする。
TB0={}
タスクt3 3に対応する集合B 3 3 との和集合:TB3 3=TB0∪B3 3={b4}
タスクt6 4に対応する集合B 6 4 との和集合:TB6 4=TB3 3∪B6 4={b4,b2,b3}
タスクt1 4に対応する集合B 1 4 との和集合:TB1 4=TB6 4∪B1 4={b4,b2,b3,b1}
以上のように、それぞれの共通ブロックでどのようなタスクが処理されるかを見出すためには、タスクt3 3,t6 4,t1 4に対して作成されたブロック集合B3 3,B6 4,B1 4の情報にもとづいて、次に記述するような手順を用いればよい。
最初に、ブロックの相対アドレスが768であるブロックb4をディスクからアクセスして、ブロックb4内のデータをメインメモリに読み込み、グループ内のタスクt3 3,t6 4,t1 4がブロックb4で処理を行う必要があるかどうかを調べるため、ブロックb4を集合{b4}として表わし、ブロック集合B3 3,B6 4,B1 4とそれぞれ積集合(intersection)を求める。
タスクt3 3に対して:B3 3∩{b4}={b4}
タスクt6 4に対して:B6 4∩{b4}={}
タスクt1 4に対して:B1 4∩{b4}={}
タスクt3 3に対して:B3 3−{b4}={}=B3 3(1)
集合B3 3(1)が空集合{}になりタスクt3 3の処理が終了したことがわかる。
次に、ブロックの相対アドレスが256であるブロックb2をディスクからアクセスして、ブロックb2内のデータをメインメモリに読み込み、すでに処理の済んだタスクt3 3を除くグループ内のタスクt6 4,t1 4がブロックb2で処理を行う必要があるかどうかを調べるために、ブロックb2を集合{b2}として表し、集合{b2}とブロック集合B6 4,B1 4との間でそれぞれ積集合を求めると次のようになる。
タスクt6 4に対して:B6 4∩{b2}={b2}
タスクt1 4に対して:B1 4∩{b2}={b2}
タスクt6 4に対して:B6 4−{b2}={b3}=B6 4(1)
タスクt1 4に対して:B1 4−{b2}={b1,b3}=B1 4(1)
タスクt6 4に対して:B6 4(1)∩{b3}={b3}
タスクt1 4に対して:B1 4(1)∩{b3}={b3}
タスクt6 4,t1 4に対する積集合が{b3}となり、タスクt6 4,t1 4がメインメモリに読み込んだブロックb3で処理を行うことが必要となり、ブロックb3は共通ブロックとなり、共通ブロックb3でタスクt6 4,t1 4の処理を行うことになる。共通ブロックであるブロックb3でのタスクの処理が終了すると、ブロックb3を再びアクセスする必要がなくなるので、集合B6 4(1),B1 4(1)と集合{b3}との差集合を求める。得られた差集合の値をB6 4(2),B1 4(2)とすると、次のようになる。
タスクt6 4に対して:B6 4(1)−{b3}={}=B6 4(2)
タスクt1 4に対して:B1 4(1)−{b3}={b1}=B1 4(2)
マルチオペレーション・プロセッシングを使用してグループG6内のタスクが、タスクt3 3,t6 4,t1 4の順番で終了すると、図4−1〜図4−3の処理ツリーからトポロジカルソートの順番で新たに処理できるタスクを見出していくことになる。
最初に、タスクt3 3の処理が終了すると、処理ツリーP3からわかるように新たにタスクt3 4の処理を始めることができるようになる。タスクt3 4は、タスクt3 1の処理結果TEMP_T1_3とタスクt3 3の処理結果TEMP_T3_3を用いた結合演算の処理を行うタスクであり、TEMP_T1_3を検索先のリレーションとして使用し、TEMP_T3_3を検索元のリレーションとして使用することになるので、検索元のリレーションであるTEMP_T3_3に対して処理を行うタスクとして新たにグループG12を作成してグループG12にタスクt3 4を加える。
最後に、タスクt1 4の処理が終了すると、処理ツリーP1からわかるようにグループG8内のタスクt1 2の処理が終了していないので新たなグループは作成されない。
以上のことをまとめると、グループG6内のタスクt3 3,t6 4,t1 4の処理が終了することによって見出されたタスクt3 4を次のようにグループG12に加えることになる。
TEMP_T3_3:グループ G12={t3 4}
(t3 4):TEMP_T4_3←TEMP_T1_3 |X|DNUMBER=DNUMTEMP_T3_3
合成関係演算を利用したマルチオペレーション・プロセッシングを用いたクエリー・プロセッサが、マルチオペレーション・プロセッシングを用いたクエリー・プロセッサ及び従来のクエリー・プロセッサ(MySQL Ver.3)よりも数多くのクエリーを早く処理することを証明するために、独自に開発したデータベースマネージメントシステム(DBMS)のソフトウェアMOP−DBに新たに合成関係演算を利用したマルチオペレーション・プロセッシングの処理を行うことができる機能を追加した。MOP−DBは、MySQLなど市場で幅広く使われているデータベースシステムよりも数多くのクエリーを高速に処理することを目的とし、SQLのインタープリタ、クエリーの最適化、トランザクションの同時処理、データを格納するストレージシステムなどデータベースマネージメントシステム(DBMS)に必要な十分な機能を備えたソフトウェアである。合成関係演算を利用したマルチオペレーション・プロセッシングの実験を行うにあたって、合成関係演算を利用したマルチオペレーション・プロセッシングには、スタティックマルチオペレーション・プロセッシングを使用することにした。
次にMOP−DBを使用して、これらのクエリー処理方法によるクエリーの処理速度をそれぞれ調べた。さらに市場で幅広く使用されているMySQLのバージョン3と比較するために、共通のクエリー処理を行ってMOP−DBとMySQLの処理速度を調べた。
Claims (6)
- 合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システムであって、
前記クエリーを関係代数による処理ツリーに変換する処理ツリー変換手段と、
前記処理ツリーから、トポロジカル・ソートにより、関係代数を他の関係代数の結果に依存しないで実施できる順番に、タスクとして取り出すタスク取り出し手段と、
前記取り出したタスクを、前記データベースのリレーションごとにグループ分けするグループ分け手段と、
グループ分けされた前記タスクに対して、共通部分式を持つタスクをさらにサブグループに集め、合成関係演算タスクを作成する合成関係演算作成手段と、
前記グループ分けされたタスクごとに、作成された前記合成関係演算タスクとサブグループに集まらないタスクとに対してマルチオペレーション・プロセッシングを行うマルチオペレーション・プロセッシング手段と、
グループ内の前記合成関係演算タスクの処理結果として得られたリレーションに対して、前記合成関係演算に含まれる個々のタスクが、そのリレーションのレコード及び/又は属性を部分的に共有するように、格納位置による仮想リレーションを作成する仮想リレーション作成手段とを備え、
前記グループ分け手段は、前記合成関係演算タスクの処理結果として得られたリレーションごとにも、タスクをグループ分けすることを特徴とするクエリー処理システム。 - 請求項1記載のクエリー処理システムにおいて、
前記合成関係演算作成手段は、サブグループに集めた複数の選択演算タスクで使用する属性名と属性数が等しいときに、それらの属性の中の1つの属性に関する選択条件だけが異なった条件かまたは同じ条件であり、それ以外の属性に関する選択条件はまったく同じであるならば、それらの選択条件をブール演算のORを使用して接続し、接続した選択条件から選択範囲の重複した部分を取り除くために、簡潔化して最適化した選択条件を作成し、その選択条件を用いて複数の選択演算タスクの合成関係演算を作成することを特徴とするクエリー処理システム。 - 請求項1記載のクエリー処理システムにおいて、
前記合成関係演算作成手段は、サブグループに集めた複数の射影演算タスクが、共通のリレーションに対して射影演算の処理を行うならば、これらの射影演算タスクの属性の和集合を求めて得られた属性を用いて、複数の射影演算タスクの合成関係演算を作成することを特徴とするクエリー処理システム。 - 請求項1〜3のいずれかに記載のクエリー処理システムにおいて、
前記仮想リレーション作成手段は、仮想リレーションのレコードに対してタスクが検索処理を行う場合、仮想リレーションが部分的に共有するリレーションの検索に使用する属性に対して、インデックスを作成することを特徴とするクエリー処理システム。 - 請求項1〜4のいずれかに記載の合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システムの各機能を、コンピュータ・システムに実現させるためのプログラム。
- 請求項1〜4のいずれかに記載のマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システムの各機能を、コンピュータ・システムに実現させるためのプログラムを記録した記録媒体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007075670A JP4071816B1 (ja) | 2007-03-22 | 2007-03-22 | 合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007075670A JP4071816B1 (ja) | 2007-03-22 | 2007-03-22 | 合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP4071816B1 true JP4071816B1 (ja) | 2008-04-02 |
JP2008234495A JP2008234495A (ja) | 2008-10-02 |
Family
ID=39356484
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007075670A Expired - Fee Related JP4071816B1 (ja) | 2007-03-22 | 2007-03-22 | 合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP4071816B1 (ja) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7680784B2 (en) | 2007-04-27 | 2010-03-16 | Toru Furuya | Query processing system of a database using multi-operation processing utilizing a synthetic relational operation in consideration of improvement in a processing capability of a join operation |
US7899799B2 (en) | 2008-05-02 | 2011-03-01 | Toru Furuya | Transaction processing system of database using multi-operation processing providing concurrency control of transactions |
JP2011524052A (ja) * | 2008-06-10 | 2011-08-25 | マイクロソフト コーポレーション | クエリ内の仮想化オブジェクト |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPWO2010131425A1 (ja) * | 2009-05-14 | 2012-11-01 | 日本電気株式会社 | 逐次発生データ解析装置、システム、方法、及びプログラム |
JP4925143B2 (ja) * | 2009-08-12 | 2012-04-25 | 株式会社日立製作所 | ストリームデータ処理システム、ストリームデータ処理方法及びストリームデータ処理プログラム |
US8412856B2 (en) * | 2009-10-26 | 2013-04-02 | Sony Computer Entertainment America Llc. | File input/output scheduler using immediate data chunking |
US9569485B2 (en) * | 2010-11-19 | 2017-02-14 | International Business Machines Corporation | Optimizing database query |
US10747773B2 (en) | 2012-05-24 | 2020-08-18 | Hitachi, Ltd. | Database management system, computer, and database management method |
JP6034240B2 (ja) * | 2013-05-20 | 2016-11-30 | 日本電信電話株式会社 | 分析方法、分析装置および分析プログラム |
US10394808B2 (en) | 2015-02-26 | 2019-08-27 | International Business Machines Corporation | Database query execution tracing and data generation for diagnosing execution issues |
-
2007
- 2007-03-22 JP JP2007075670A patent/JP4071816B1/ja not_active Expired - Fee Related
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7680784B2 (en) | 2007-04-27 | 2010-03-16 | Toru Furuya | Query processing system of a database using multi-operation processing utilizing a synthetic relational operation in consideration of improvement in a processing capability of a join operation |
US7899799B2 (en) | 2008-05-02 | 2011-03-01 | Toru Furuya | Transaction processing system of database using multi-operation processing providing concurrency control of transactions |
JP2011524052A (ja) * | 2008-06-10 | 2011-08-25 | マイクロソフト コーポレーション | クエリ内の仮想化オブジェクト |
Also Published As
Publication number | Publication date |
---|---|
JP2008234495A (ja) | 2008-10-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4073033B1 (ja) | 結合演算の処理機能の向上を考慮した合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム | |
JP4071816B1 (ja) | 合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム | |
US11860830B2 (en) | Combined row and columnar storage for in-memory databases for OLTP and analytics workloads | |
JP4866495B2 (ja) | データベースシステムにおいて結合質問を実行する方法及び装置 | |
US7895151B2 (en) | Fast bulk loading and incremental loading of data into a database | |
US9378231B2 (en) | Accessing data in column store database based on hardware compatible data structures | |
Valduriez | Join indices | |
US5842196A (en) | Database system with improved methods for updating records | |
US7454403B2 (en) | Method and mechanism of improving performance of database query language statements using data duplication information | |
US8224829B2 (en) | Database | |
US8458129B2 (en) | Methods and systems for real-time continuous updates | |
CN108536692B (zh) | 一种执行计划的生成方法、装置及数据库服务器 | |
JP3914662B2 (ja) | データベース処理方法及び実施装置並びにその処理プログラムを記憶した媒体 | |
SG184482A1 (en) | Data storage and/or retrieval based on a database model-agnostic, schema-agnostic and workload-agnostic data storage and access models | |
CN113688127B (zh) | 数据压缩技术 | |
US20110289112A1 (en) | Database system, database management method, database structure, and storage medium | |
Kim et al. | Robust and efficient memory management in Apache AsterixDB | |
JP4109305B1 (ja) | マルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム | |
Arnold et al. | HRDBMS: Combining the best of modern and traditional relational databases | |
JP3653333B2 (ja) | データベース管理方法およびシステム | |
Rupley Jr | Introduction to query processing and optimization | |
JP7495269B2 (ja) | データ管理システムおよびデータ管理方法 | |
Tang et al. | Write-optimized indexing for log-structured key-value stores | |
Wey | Implementation of queries based on relational algebra in a database management system | |
CN117425886A (zh) | 具有仅添加数据结构的基于列表的数据搜索 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20071225 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120125 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130125 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130125 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140125 Year of fee payment: 6 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
LAPS | Cancellation because of no payment of annual fees |