(57)【特許請求の範囲】
【請求項１】
リレーショナルデータベース管理システムにより管理されたテンポラル−リレーショナルデータベースのテンポラルテーブルのデータへのアクセスを必要とする複数の構造化クエリ言語（ＳＱＬ）クエリをリレーショナルデータベース管理システムで受信したことに応答して、前記ＳＱＬクエリの各々についてのクエリ結果を生成するように前記複数のＳＱＬクエリを実行することを含み、前記複数のＳＱＬクエリを実行することが、
実行後にメモリに保存される複数のクエリプランを生成および実行することであって、前記複数のクエリプランの各々が、エッジにより連結されたノードの有向グラフを含み、前記有向グラフの各々が、前記複数のＳＱＬクエリのうちの１つについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表し、前記有向グラフの前記ノードの各々が、前記クエリプラン演算子のうちの１つを表し、前記有向グラフの各々が、そのエッジのうちの少なくとも１つにより、別の有向グラフの少なくとも１つのノードに連結されて、それらの有向グラフが少なくとも１つのノードを共有するようになっており、前記有向グラフの各々の前記ノードのうちの少なくとも１つが、前記テンポラル−リレーショナルデータベースの前記テンポラルテーブルのうちの１つを特定し、前記有向グラフの各々の前記ノードのうちの少なくとも別の１つが、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する、ことと、
前記複数のＳＱＬクエリの各々についての前記クエリ結果を、そのＳＱＬクエリを前記リレーショナルデータベース管理システムに送信した１つまたは複数のクライアントに送信することとを含む、コンピュータ実施方法。
【請求項２】
前記有向グラフの前記ノードの各々が、前記テンポラル−リレーショナルデータベースの前記テンポラルテーブルのうちの１つ、またはそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成された前記テンポラルテーブルのうちの１つを特定する、請求項１に記載の方法。
【請求項３】
前記複数のクエリプランのうちの少なくとも２つが、前記ノードおよび少なくとも１つのエッジのサブグラフを共有する、請求項１に記載の方法。
【請求項４】
前記複数のクエリプランのうちの１つが、前記複数のクエリプランのうちの別の１つが生成および実行される前に生成および実行される、請求項１に記載の方法。
【請求項５】
前記クエリプラン演算子のうちの１つを実行した結果を保存するように作成された前記テンポラルテーブルの各々が、少なくともそのテンポラルテーブルを特定する前記ノードが実行後にメモリに保存される限り、メモリに保存される、請求項１に記載の方法。
【請求項６】
前記有向グラフの各々が、ルートノードから始まり、１つまたは複数の中間ノードを含み、１つまたは複数のリーフノードで終わり、各有向グラフの前記ルートノードおよび前記１つまたは複数の中間ノードが各々、そのノードについて、その有向グラフの１つまたは複数の他のノードを子ノードとして特定し、前記ルートノードおよび前記中間ノードの各々により表された前記クエリプラン演算子の各々が、そのノードの１つまたは複数の子ノードにより特定されたテンポラルテーブルのうちの１つまたは複数に作用する、請求項１に記載の方法。
【請求項７】
前記１つまたは複数のリーフノードの各々により表されたクエリプラン演算子を実行することにより、テンポラル−リレーショナルデータベースの前記テンポラルテーブルのうちの１つからデータを検索する、請求項６に記載の方法。
【請求項８】
前記複数のクエリプランを生成および実行することが、
前記クエリプランの前記ノードの各々について、そのノードおよびそのノードの０以上の特定された子ノードをベースとするキーを維持することを含む、請求項６に記載の方法。
【請求項９】
前記複数のクエリプランを生成および実行することが、
前記クエリプランの前記ノードの各々について、もしあればそのノードおよびその子孫を含む前記クエリプランの部分を表すが、そのノードの先祖ノードにより表された前記クエリプランの部分を表さないキーを維持することを含む、請求項６に記載の方法。
【請求項１０】
前記テンポラル−リレーショナルデータベースの一部であり、かつ前記複数のＳＱＬクエリのうちの少なくとも１つがデータへのアクセスを必要とする、前記テンポラルテーブルのうちの少なくとも所与の１つのコンテンツを修正したことに応答して、
前記複数のＳＱＬクエリのうちの少なくとも１つのクエリプランの有向グラフのノードであり、かつ前記テンポラルテーブルのうちの前記所与の１つを特定するノードに直接的または間接的に依存するノードにより特定されたテンポラルテーブルを増分更新することと、
前記複数のＳＱＬクエリのうちの前記少なくとも１つを送信したクライアントに、前記複数のＳＱＬクエリのうちの前記少なくとも１つについてのクエリ結果に対する増分更新を送信することとを実行することをさらに含む、請求項１から６までのいずれか１項に記載の方法。
【請求項１１】
前記複数のＳＱＬクエリのうちの前記１つについて、前記クライアントにそのクエリ結果が最後に送られた以後の、そのＳＱＬクエリを満たす前記クエリ結果に対する変更を特定するデータを、そのＳＱＬクエリを前記リレーショナルデータベース管理システムに送信した前記クライアントのうちの１つに送信することをさらに含む、請求項１から９までのいずれか１項に記載の方法。
【請求項１２】
前記クエリプラン演算子のうちの１つまたは複数が、テンポラル−リレーショナル代数演算を実行する、請求項１から１１までのいずれか１項に記載の方法。
【請求項１３】
少なくとも、前記クライアントのうちの少なくとも１つが、そのクエリプランを生成した前記複数のＳＱＬクエリのうちの１つに対する更新を受信する予定である限り、前記複数のクエリプランのうちの各々が実行後にメモリに保存される、請求項１から１２までのいずれか１項に記載の方法。
【請求項１４】
前記リレーショナルデータベース管理システムにより管理された前記テンポラル−リレーショナルデータベースのデータにアクセスする必要のある別のＳＱＬクエリを前記リレーショナルデータベース管理システムで受信したことに応答して、別のクエリプランを生成および実行することであって、前記別のクエリプランが、エッジにより連結されたノードの有向グラフを含み、前記別のクエリプランの前記有向グラフが、前記別のクエリプランについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表し、前記別のクエリプランの前記有向グラフが、そのエッジのうちの少なくとも１つにより、前記別の有向グラフの少なくとも１つのノードに連結されて、それらの有向グラフが少なくとも１つのノードを共有するようになっており、前記別のクエリプランの前記有向グラフのノードのうちの少なくとも１つが、前記テンポラル−リレーショナルデータベースの前記テンポラルテーブルのうちの１つを特定し、前記別のクエリの前記有向グラフの前記ノードのうちの少なくとも１つが、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する、ことをさらに含む、請求項１から３までのいずれか１項に記載の方法。
【請求項１５】
前記有向グラフの各々が、ルートノードから始まり、１つまたは複数の中間ノードを含み、１つまたは複数のリーフノードで終わり、各有向グラフの前記ルートノードおよび前記１つまたは複数の中間ノードが各々、そのノードについて、その有向グラフの１つまたは複数の他のノードを子ノードとして特定し、
前記複数のクエリプランを生成することが、
前記複数のクエリプランの前記ノードの各々について、そのノードおよびそのノードの１つまたは複数の特定された子ノードをベースとするキーを維持することを含み、
前記別のクエリプランを生成および実行することが、前記別のクエリプランの前記有向グラフを、そのエッジのうちの少なくとも１つにより、１つまたは複数のキーをベースとする別の有向グラフの少なくとも１つのノードに連結することができることを判定することを含む、請求項１４に記載の方法。
【請求項１６】
前記複数のＳＱＬクエリが、前記リレーショナルデータベース管理システムにより受信された第１のＳＱＬクエリおよび第２のＳＱＬクエリを含み、前記複数のクエリプランを生成および実行することが、前記第１のＳＱＬクエリの複数のクエリプランのうちの第１のクエリプランおよび前記第２のＳＱＬクエリの複数のクエリプランのうちの第２のクエリプランを生成することを含み、前記第２のクエリプランの有向グラフが、そのエッジのうちの少なくとも１つにより、前記第１のクエリプランの有向グラフの少なくとも１つのノードに連結されて、それらの有向グラフが少なくとも１つのノードを共有するようになっている、請求項１から１５までのいずれか１項に記載の方法。
【請求項１７】
前記第１のクエリプランおよび前記第２のクエリプランの前記有向グラフによって共有された前記少なくとも１つのノードが、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたノードである、請求項１６に記載の方法。
【請求項１８】
前記第２のクエリプランを生成および実行することが、少なくとも、前記第１のクエリプランおよび前記第２のクエリプランの前記有向グラフによって共有された前記少なくとも１つのノードにより表された前記クエリプラン演算子を増分実行することを含む、請求項１６または１７に記載の方法。
【請求項１９】
前記第１のＳＱＬクエリおよび前記第２のＳＱＬクエリが、前記リレーショナルデータベース管理システムにより受信されて、第１のダッシュボードコンテンツ要素および第２のダッシュボードコンテンツ要素をそれぞれ入力する、請求項１６から１８までのいずれか１項に記載の方法。
【請求項２０】
前記第１のダッシュボードコンテンツ要素および前記第２のダッシュボードコンテンツ要素が、異なるエンドユーザクライアントにより表示される異なるダッシュボードの部分である、請求項１９に記載の方法。
【請求項２１】
前記第１のダッシュボードコンテンツ要素および前記第２のダッシュボードコンテンツ要素が、同一のエンドユーザクライアントにより表示される同一のダッシュボードの部分である、請求項１９に記載の方法。
【請求項２２】
前記第１のＳＱＬクエリがサブスクリプションＳＱＬクエリとして送信される、請求項１６から２１までのいずれか１項に記載の方法。
【請求項２３】
前記サブスクリプションＳＱＬクエリにより、前記第１のクエリプランが生成された後、前記第１のクエリプランが実行後にメモリに保存されている間に、前記第２のＳＱＬクエリが受信される、請求項２２に記載の方法。
【請求項２４】
ノードの１つを別のノードに連結する前記エッジの各々が、前記ノードがそれぞれ互いに親ノードおよび子ノードであり、前記子ノードの結果に前記親ノードがアクセスできることを表す、請求項１から２３までのいずれか１項に記載の方法。
【請求項２５】
前記生成および実行することが、
前記有向グラフのうちの１つを生成することの一部として、
先に生成された１つの有向グラフの一部であり、かつ再利用可能なノードのうちの少なくとも１つを特定することと、
前記先に生成された１つの有向グラフの一部である前記ノードのうちの前記少なくとも１つに連結されたエッジを、前記有向グラフのうちの前記１つに追加することとを実行することを含む、請求項１から２４までのいずれか１項に記載の方法。
【請求項２６】
前記追加されたエッジが連結される前記１つのノードが、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定するノードのうちの１つであり、前記生成および実行することが、
前記有向グラフのうちの１つを実行することの一部として、前記追加されたエッジが連結される前記１つのノードにより特定された前記テンポラルテーブルを必要に応じて増分更新することを含んで、再利用することを含む、請求項２５に記載の方法。
【請求項２７】
前記生成および実行することが、前記有向グラフのうちの２つによって共有された前記１つのノードにより表された少なくとも前記クエリプラン演算子を増分実行することを含む、請求項１から２６までのいずれか１項に記載の方法。
【請求項２８】
コンピュータによる実行時に、請求項１から２７までのいずれか１項に記載の方法を実行するコンピュータプログラムコードを含む、機械可読媒体。
【請求項２９】
リレーショナルデータベース管理システムにより受信された、新たに送信された構造化クエリ言語（ＳＱＬ）クエリに応答して、実行後にメモリに保存されている既存のクエリプランの少なくとも一部を組み込むことにより、前記新たに送信されたＳＱＬクエリのクエリプランを生成することであって、
前記リレーショナルデータベース管理システムが、テンポラルテーブルを含むテンポラル−リレーショナルデータベースを管理し、
前記既存のクエリプランが、エッジにより連結されたノードの有向グラフを含み、前記有向グラフが、前記テンポラル−リレーショナルデータベースのデータへのアクセスを必要とした先に送信されたＳＱＬクエリについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表し、
前記新たに送信されたＳＱＬクエリの前記クエリプランが、エッジにより連結されたノードの有向グラフを含み、前記有向グラフが、前記新たに送信されたＳＱＬクエリについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表し、
前記新たに送信されたＳＱＬクエリの前記有向グラフが、そのエッジの少なくとも１つにより、前記先に送信されたＳＱＬクエリの前記有向グラフの少なくとも１つのノードに連結されて、前記有向グラフが少なくとも１つのノードを共有するようになっており、
前記有向グラフの前記ノードの各々が前記クエリプラン演算子のうちの１つを表し、
前記有向グラフの各々の前記ノードのうちの少なくとも１つが、前記テンポラル−リレーショナルデータベースの前記テンポラルテーブルのうちの１つを特定し、
前記有向グラフによって共有された前記ノードのうちの少なくとも１つが、実行後にメモリに保存され、かつ表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する、ことと、
前記テンポラル−リレーショナルデータベースの一部であり、かつ少なくとも前記既存のＳＱＬクエリがデータへのアクセスを必要とする、前記テンポラルテーブルのうちの所与の１つのコンテンツを修正した後、前記クエリプラン演算子を実行した結果を保存し、かつ前記テンポラルテーブルのうちの前記所与の１つを特定するノードに直接的または間接的に依存する、前記既存のクエリプランのノードにより特定されたテンポラルテーブルを増分更新することと、
前記既存のクエリプランの前記有向グラフの前記ノードのうちのルートノードにより特定された前記テンポラルテーブルに対する増分更新を特定するデータを、前記先に送信されたＳＱＬクエリを送信したクライアントに送信することとを含む、コンピュータ実施方法。
【請求項３０】
前記クエリプラン演算子のうちの１つを実行した結果を保存するように作成された前記テンポラルテーブルの各々が、少なくともそのテンポラルテーブルを特定する前記ノードが実行後にメモリに保存される限り、メモリに保存される、請求項２９に記載の方法。
【請求項３１】
前記有向グラフの前記ノードの各々が、前記テンポラル−リレーショナルデータベースの前記テンポラルテーブルのうちの１つ、またはそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成された前記テンポラルテーブルのうちの１つを特定する、請求項２９または３０に記載の方法。
【請求項３２】
前記新たに送信されたＳＱＬクエリの前記クエリプランと前記既存のクエリプランとが、前記ノードおよび少なくとも１つのエッジの少なくともサブグラフを共有する、請求項２９から３１までのいずれか１項に記載の方法。
【請求項３３】
前記有向グラフの各々が、ルートノードから始まり、１つまたは複数の中間ノードを含み、１つまたは複数のリーフノードで終わり、各有向グラフの前記ルートノードおよび前記１つまたは複数の中間ノードが、そのノードについて、その有向グラフの１つまたは複数の他のノードを子ノードとして特定し、前記ルートノードおよび前記中間ノードの各々により表された前記クエリプラン演算子の各々が、そのノードの１つまたは複数の子ノードにより特定されたテンポラルテーブルのうちの１つまたは複数に作用する、請求項２９から３２までのいずれか１項に記載の方法。
【請求項３４】
前記１つまたは複数のリーフノードの各々により表されたクエリプラン演算子を実行することにより、テンポラル−リレーショナルデータベースの前記テーブルのうちの１つからデータを検索する、請求項３３に記載の方法。
【請求項３５】
前記新たに送信されたＳＱＬクエリのクエリプランを生成することが、
前記ノードの各々について、そのノードおよびそのノードの０以上の特定された子ノードをベースとするキーを維持することを含む、請求項３３に記載の方法。
【請求項３６】
前記新たに送信されたＳＱＬクエリのクエリプランを生成することが、
前記ノードの各々について、もしあればそのノードおよびその子孫を含む前記クエリプランの部分を表すが、そのノードの先祖ノードにより実行された前記クエリプランの部分を含まないキーを維持することを含む、請求項３３に記載の方法。
【請求項３７】
前記クエリプラン演算子のうちの１つまたは複数が、テンポラル−リレーショナル代数演算を実行する、請求項２９から３６までのいずれか１項に記載の方法。
【請求項３８】
前記先に送信されたＳＱＬクエリがサブスクリプションＳＱＬクエリであり、少なくともクライアントが前記サブスクリプションＳＱＬクエリに対する更新を受信するようにサブスクライブされている限り、前記既存のクエリプランが実行後にメモリに保存される、請求項２９から３７までのいずれか１項に記載の方法。
【請求項３９】
前記新たに送信されたＳＱＬクエリについての前記クエリ結果を前記リレーショナルデータベース管理システムから前記クライアントに送信することをさらに含む、請求項２９から３８までのいずれか１項に記載の方法。
【請求項４０】
前記新たに送信されたＳＱＬクエリについての前記クエリ結果を前記リレーショナルデータベース管理システムから別のクライアントに送信することをさらに含む、請求項２９から３８までのいずれか１項に記載の方法。
【請求項４１】
前記有向グラフの各々が、ルートノードから始まり、１つまたは複数の中間ノードを含み、１つまたは複数のリーフノードで終わり、各有向グラフの前記ルートノードおよび前記１つまたは複数の中間ノードが各々、そのノードについて、その有向グラフの１つまたは複数の他のノードを子ノードとして特定し、前記ノードの各々について、もしあればそのノードおよびその子孫を含む前記クエリプランの部分を表すが、そのノードの先祖ノードにより実行された前記クエリプランの部分を含まないキーが維持され、
前記新たに送信されたＳＱＬクエリのクエリプランを生成することが、前記新たに送信されたＳＱＬクエリの前記クエリプランの前記有向グラフを、そのエッジのうちの少なくとも１つにより、１つまたは複数の前記キーをベースとする前記既存のクエリプランの前記有向グラフの前記ノードのうちの少なくとも１つに連結することができることを判定することを含む、請求項２９から３２までのいずれか１項に記載の方法。
【請求項４２】
前記先に送信されたＳＱＬクエリおよび新たに送信されたＳＱＬクエリが、前記リレーショナルデータベース管理システムにより受信されて、第１のダッシュボードコンテンツ要素および第２のダッシュボードコンテンツ要素をそれぞれ入力する、請求項２９から４１までのいずれか１項に記載の方法。
【請求項４３】
前記第１のダッシュボードコンテンツ要素および前記第２のダッシュボードコンテンツ要素が、異なるエンドユーザクライアントにより表示される異なるダッシュボードの部分である、請求項４２に記載の方法。
【請求項４４】
前記第１のダッシュボードコンテンツ要素および前記第２のダッシュボードコンテンツ要素が、同一のエンドユーザクライアントにより表示される同一のダッシュボードの部分である、請求項４２に記載の方法。
【請求項４５】
前記先に送信されたＳＱＬクエリが前記クライアントによりサブスクリプションＳＱＬクエリとして送信されるため、前記既存のクエリプランが実行後にメモリに保存されている間に、前記新たに送信されたＳＱＬクエリが前記リレーショナルデータベース管理システムにより受信される、請求項２９から４４までのいずれか１項に記載の方法。
【請求項４６】
ノードの１つを別のノードに連結する前記エッジの各々が、前記ノードがそれぞれ互いに親ノードおよび子ノードであり、前記子ノードの結果に前記親ノードがアクセスできることを表す、請求項２９から４５までのいずれか１項に記載の方法。
【請求項４７】
前記生成することが、
前記既存のクエリプランの前記有向グラフの前記ノードのうちの少なくとも１つが再利用可能であることを特定することと、
前記特定されたノードに連結されたエッジを、前記新たに送信されたＳＱＬクエリの前記クエリプランの前記有向グラフに追加することとを含む、請求項２９から４６までのいずれか１項に記載の方法。
【請求項４８】
前記有向グラフによって共有された前記少なくとも１つのノードにより特定された前記テンポラルテーブルを必要に応じて増分更新することを含んで、再利用することにより、前記新たに送信されたＳＱＬクエリのクエリプランを実行することをさらに含む、請求項２９から４７までのいずれか１項に記載の方法。
【請求項４９】
前記新たに送信されたＳＱＬクエリのクエリプランを実行することの一部として、前記有向グラフによって共有された前記少なくとも１つのノードにより表された前記クエリプラン演算子を増分実行することをさらに含む、請求項２９から４７までのいずれか１項に記載の方法。
【請求項５０】
前記増分更新することが、前記テンポラルテーブルのうちの前記所与の１つを特定するノードに直接的または間接的に依存する、前記既存のクエリプランのノードの１つまたは複数により表された、前記クエリプラン演算子の１つまたは複数を増分実行することを含む、請求項２９から４９までのいずれか１項に記載の方法。
【請求項５１】
コンピュータによる実行時に、請求項２９から５０までのいずれか１項に記載の方法を実行するコンピュータプログラムコードを含む、機械可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、データベースの分野に関し、より詳細には、リレーショナルデータベース管理システムに関する。
【背景技術】
【０００２】
企業ソフトウェアシステムは、通常、多数の、例えば、数十、数百、数千の同時ユーザをサポートする非常に複雑な大規模システムである。企業ソフトウェアシステムの例としては、財務計画システム、予算計画システム、注文管理システム、在庫管理システム、販売員管理システム、ビジネスインテリジェンスツール、企業報告ツール、事業および資産管理システム、ならびにその他の企業ソフトウェアシステムが挙げられる。
【０００３】
企業ソフトウェアシステムに対する１つの手法は、カスタムハードコードソフトウェア上のカスタムユーザインターフェースの開発である（例えば、米国特許第８，１９１，０５２号）。このような手法では、カスタムユーザインターフェースは報告およびデータ調査に関して柔軟性が限られ、カスタムハードコードソフトウェアは大量のデータを処理する際にパフォーマンスが不十分である。
【０００４】
企業ソフトウェアシステムに対する代替手法は、０以上のソフトウェア層を通して多次元イン−メモリデータストアである「ＯＬＡＰ」キューブとインターフェース接続する、一般的なビジネスインテリジェンス（ＢＩ）ツールの使用である。ＢＩフロントエンドは言語ＭＤＸを「発する」、すなわち、ＭＤＸ式をＯＬＡＰキューブに送信し、ＯＬＡＰキューブがＭＤＸを解釈して、応答クエリ結果をＢＩフロント−エンドに提供する。一般的なＢＩツールを使用して、ベースとなるデータソースでクエリを実行することにより個々の報告および解析を作成して集約し、それらの報告および解析をＢＩダッシュボード環境などのユーザアクセス可能なフォーマットに示すことができる。しかしながら、一般的なＢＩツールを使用しても、大量のデータを処理するときに「略リアルタイムの」パフォーマンスが提供されることはない（「略リアルタイムの」とは、事象の発生と表示などのための処理されたデータの使用との間の、データ処理および／またはネットワーク送信により導入される時間遅延を指す）。
【０００５】
当技術分野で公知のように、リレーショナルデータベース管理システム（ＲＤＢＭＳ）は、リレーショナルモデルをベースとするデータベース管理システム（ＤＢＭＳ）である。ＲＤＢＭＳは、ユーザが１つまたは複数のデータベースと対話できるようにし、かつデータベースに含まれるすべてのデータへのアクセスを提供する（特定のデータへのアクセスを限定する制限は存在し得る）コンピュータソフトウェアの統合セットを提供する。ＲＤＢＭＳは、大量の情報の入力、保存、および検索を可能にする様々な機能を提供し、その情報をどのように整理するかについての管理法を提供する。ＲＤＢＭＳは、通常、構造化クエリ言語（ＳＱＬ）で表現されたクエリをサポートする。従来、ＲＤＢＭＳは、ＳＱＬクエリを受信すると、１つまたは複数のデータベーステーブル上でＳＱＬクエリをどのように実行してクエリを満たす結果を検索することができるかを判定するクエリプランを作成する。クエリプランは、アクセスする必要のある１つまたは複数のデータベーステーブル、データベーステーブル（および、しばしばその中のデータ）に適用する必要のある演算、および演算を行わなければならない順序を特定する。クエリプランをあるパラメータについて最適化して、通常、クエリ実行時間および／またはアクセスするデータの総量を最小限にすることができる。クエリプランを実行してクエリ結果を判定するが、本明細書において「実行する」とは、クエリプランからクエリ結果を判定する様々な形式を含む（例えば、関数、メソッド、その他の実行可能なコードにより実装されるクエリプラン演算子が、実行される、解釈されるなど）ものと定義される。言い換えると、リレーショナルデータベース管理システムのＳＱＬクエリについて生成されるクエリプラン（またはクエリ実行プラン）は、リレーショナルデータベース管理システムにより管理される１つまたは複数のデータベースのテーブル（および、しばしばその中のデータ）にアクセスし作用するための演算の順序セットである。
【０００６】
当技術分野で公知のように、テンポラルデータベースは、時間参照された、またはタイムスタンプされたデータレコードを含む。テンポラル−リレーショナルデータベースはテンポラルテーブルを含み、そのようなテンポラルテーブルはデータをデータレコードに保存するためのものである。テンポラルテーブルごとに、そのテンポラルテーブルのデータレコードは各々いくつかのフィールドから構成され、１つまたは複数のフィールドがデータを保存し、１つまたは複数のフィールドがそのデータレコードのタイムスタンプを保存する。テンポラルテーブルは、テンポラルテーブルに保存されたデータレコードが上書きされないように設計される。むしろ、テンポラルテーブル内のデータレコードのデータの変更が、１）普通なら変更の時間を反映するように上書きまたは修正されたであろうデータレコードのタイムスタンプを変更すること、および２）変更を反映する追加のデータレコードを作成することにより実行される。テンポラルテーブルはこれらのデータレコードの経時的な変化を取り込むため、２つの時間の間のテンポラルテーブルの「差分」を判定することができる。テンポラルテーブルに保存されたデータは、テンポラルテーブルのコンテンツと称することがあり、テンポラルテーブルのスキーマと区別することができる。論理ビューでは、テンポラルテーブルは行および列を有するテーブルと考えることができ、テーブルのヘッダはテーブルのスキーマを定義し、行（テンポラルテーブルのコンテンツを保存する）の各々はデータレコードであり、列と行との各交差は１つのデータレコードのフィールドであり、１つまたは複数の列は前記タイムスタンプを保存する。しかしながら、テンポラルテーブルのコンテンツを、異なる方法（例えば、前記論理ビューをまねた「行指向」構成（「行指向」テンポラルテーブルと称することもある）、「列指向」（または「カラム型」としても知られる）構成（「列指向」または「カラム型」テンポラルテーブルと称することもある）など）で保存することができる。テンポラルテーブルに作用する一般的なリレーショナルデータベースのクエリプラン演算子（例えば、ＰＲＯＪＥＣＴ、ＪＯＩＮ、ＳＥＬＥＣＴ）の実装が、当技術分野で公知である（例えば、Ｄ．  ＰｆｏｓｅｒおよびＣ．Ｓ．  Ｊｅｎｓｅｎ、「Ｉｎｃｒｅｍｅｎｔａｌ  Ｊｏｉｎ  ｏｆ  Ｔｉｍｅ−Ｏｒｉｅｎｔｅｄ  Ｄａｔａ」、Ｉｎ  Ｐｒｏｃ．  １１ｔｈ  Ｉｎｔｌ．  Ｃｏｎｆ．  Ｓｃｉｅｎｔｉｆｉｃ  ａｎｄ  Ｓｔａｔｉｓｔｉｃａｌ  Ｄａｔａｂａｓｅ  Ｍａｎａｇｅｍｅｎｔ、２３２〜２４３ページ、１９９９、Ｊｕｎ  ＹａｎｇおよびＪｅｎｎｉｆｅｒ  Ｗｉｄｏｍ、「Ｍａｉｎｔａｉｎｉｎｇ  Ｔｅｍｐｏｒａｌ  Ｖｉｅｗｓ  Ｏｖｅｒ  Ｎｏｎ−Ｔｅｍｐｏｒａｌ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｏｕｒｃｅｓ  Ｆｏｒ  Ｄａｔａ  Ｗａｒｅｈｏｕｓｉｎｇ」、Ｉｎ  ＥＤＢＴ  ’９８  Ｐｒｏｃ．  ６ｔｈ  Ｉｎｔｌ．  Ｃｏｎｆ．  ｏｎ  Ｅｘｔｅｎｄｉｎｇ  Ｄａｔａｂａｓｅ  Ｔｅｃｈｎｏｌｏｇｙ：Ａｄｖａｎｃｅｓ  ｉｎ  Ｄａｔａｂａｓｅ  Ｔｅｃｈｎｏｌｏｇｙ、３８９〜４０３ページ、１９９８）。入力テンポラルテーブルへの適用時に、そのような実装は、時々「差分」を判定し、「差分」のみに作用することができるため、テンポラルテーブルのデータレコードの全体で演算を再実行する必要がなくなる。テンポラル−リレーショナルテーブルの文脈において、リレーショナルデータベース管理システムによりＳＱＬクエリについて生成されるクエリプラン（またはクエリ実行プラン）は、リレーショナルデータベース管理システムにより管理された１つまたは複数のテンポラル−リレーショナルデータベースの１つまたは複数のテンポラルテーブル（および、しばしばその中のデータ）にアクセスし作用するために使用されるテンポラル−リレーショナル演算の順序セットである。
【発明の概要】
【課題を解決するための手段】
【０００７】
テンポラル−リレーショナルデータベースを有するリレーショナルデータベース管理システムにおけるクエリプランの生成および実行について記載される。一態様によれば、実行後にメモリに保存されている既存のクエリプランの少なくとも一部を組み込むことにより、リレーショナルデータベース管理システムによって受信された、新たに送信された構造化クエリ言語（ＳＱＬ）クエリのクエリプランが生成される。リレーショナルデータベース管理システムは、テンポラルテーブルを含むテンポラル−リレーショナルデータベースを管理する。既存のクエリプランは、エッジにより連結されたノードの有向グラフを含み、有向グラフは、テンポラル−リレーショナルデータベースのデータへのアクセスを必要とした先に送信されたＳＱＬクエリについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表す。新たに送信されたＳＱＬクエリのクエリプランは、エッジにより連結されたノードの有向グラフを含み、有向グラフは、新たに送信されたＳＱＬクエリについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表す。新たに送信されたＳＱＬクエリの有向グラフは、そのエッジの少なくとも１つにより、先に送信されたＳＱＬクエリの有向グラフの少なくとも１つのノードに連結されて、有向グラフが少なくとも１つのノードを共有するようになっている。有向グラフの各々のノードのうちの少なくとも１つは、テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの１つを特定し、有向グラフの各々のノードのうちの少なくとも１つは、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する。
【０００８】
追加の態様によれば、テンポラル−リレーショナルデータベースの一部であり、かつ少なくとも既存の（または新たに送信された）ＳＱＬクエリがデータへのアクセスを必要とする、テンポラルテーブルのうちの所与の１つを修正した後、既存のクエリプラン（または新たに送信されたＳＱＬクエリのクエリプラン）のノードであり、かつテンポラルテーブルのうちの所与の１つを特定するノードに直接的または間接的に依存するノードにより特定されたクエリプラン演算子を実行した結果を保存するテンポラルテーブルが、増分更新される。その後、既存のクエリプラン（または新たに送信されたＳＱＬクエリのクエリプラン）の有向グラフのルートノードにより特定されたテンポラルテーブルに対する増分更新を特定するデータが、先に送信された（または新たに送信された）ＳＱＬクエリを送信したクライアントに送信される。
【０００９】
別の態様によれば、リレーショナルデータベース管理システムにより管理されたテンポラル−リレーショナルデータベースのテンポラルテーブルのデータへのアクセスを必要とする複数の構造化クエリ言語（ＳＱＬ）をリレーショナルデータベース管理システムで受信したことに応答して、ＳＱＬクエリの各々についてのクエリ結果を生成するように複数のＳＱＬクエリを実行する。複数のＳＱＬクエリの実行は、実行後にメモリに保存される複数のクエリプランを生成および実行することを含み、複数のクエリプランの各々は、エッジにより連結されたノードの有向グラフを含む。有向グラフの各々は、複数のＳＱＬクエリのうちの１つについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表し、有向グラフのノードの各々は、クエリプラン演算子のうちの１つを表す。有向グラフの各々は、そのエッジのうちの少なくとも１つにより、別の有向グラフの少なくとも１つのノードに連結されて、それらの有向グラフが少なくとも１つのノードを共有するようになっており、有向グラフの各々のノードのうちの少なくとも１つは、テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの１つを特定する。有向グラフによって共有されるノードのうちの少なくとも１つは、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する。複数のＳＱＬクエリの実行はまた、複数のＳＱＬクエリの各々についてのクエリ結果を、そのＳＱＬクエリをリレーショナルデータベース管理システムに送信した１つまたは複数のクライアントに送信することを含む。
【００１０】
本発明の実施形態を例示するために使用される以下の説明および添付図面を参照することにより、本発明について最もよく理解できよう。
【図面の簡単な説明】
【００１１】
【図１】一実施形態によるテンポラル−リレーショナルデータベースを有するリレーショナルデータベース管理システム（ＲＤＢＭＳ）におけるクエリプランの生成および実行のフロー図である。
【図２】一実施形態によるリレーショナルデータベース管理システムを示すブロック図である。
【図３Ａ】一実施形態による、時間Ｔ＝０における「ＣＵＳＴＯＭＥＲＳ」と名付けた例示的なテンポラルテーブルを示す図である。
【図３Ｂ】一実施形態による、時間Ｔ＝０における「ＯＲＤＥＲＳ」と名付けた例示的なテンポラルテーブルを示す図である。
【図３Ｃ】一実施形態による例示的なＳＱＬクエリを示す図である。
【図４】一実施形態による、例示的なＳＱＬクエリ３１０の異なる部分と、例示的なテキスト表現４４０を介した例示的な論理クエリプラン４６４との関係を示す図である。
【図５Ａ】一実施形態による、例示的なテキスト表現４４０の異なる部分と例示的な物理クエリプランとの関係を示す図である。
【図５Ｂ】一実施形態による例示的な物理クエリプラン５６４の実行を示す図である。
【図６】一実施形態による例示的な重複物理クエリプランを示す図である。
【図７Ａ】一実施形態による、テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの少なくとも１つを修正したことに応答してテンポラルテーブルを増分更新することを示すフロー図である。
【図７Ｂ】一実施形態による、例示的な物理クエリプラン５６４および例示的な物理クエリプラン６２８に対する増分実行および増分更新を示す図である。
【図８】一実施形態による、重複クエリプランと増分実行との組合せを示すフロー図である。
【図９】一実施形態によるキャッシュ２３４を示すブロック図である。
【図１０】ある実施形態による、ベーステンポラルテーブルのデータを入力可能な方法を示すブロック図である。
【図１１】一実施形態によるＲＤＢＭＳ２１２上のユーザインターフェース層を示す図である。
【図１２】一実施形態によるＤＴＴＮクラスのブロック図である。
【図１３】一実施形態によるＢＴＴＮクラスのブロック図である。
【図１４】一実施形態によるＴＴクラスのブロック図である。
【図１５】一実施形態による、図２の非クエリエグゼキュータ２２８のフロー図である。
【図１６】一実施形態による、図２のクエリプランコネクタ２３２のフロー図である。
【図１７】一実施形態によるクエリエグゼキュータ２４０のフロー図である。
【図１８】一実施形態によるＥｖａｌｕａｔｅメソッド１２１２のフロー図である。
【図１９】一実施形態によるメソッド１３２２のフロー図である。
【図２０】一実施形態によるＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０のフロー図である。
【図２１】一実施形態によるサブスクリプションＳＱＬクエリのフロー図である。
【図２２】一実施形態による、非サブスクリプションＳＱＬクエリおよびサブスクリプションＳＱＬクエリの両方をサポートする追加のブロックを有するリレーショナルデータベース管理システム２１２を示すブロック図である。
【図２３】一実施形態によるＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２のフロー図である。
【図２４Ａ】プルモデルを実装する実施形態によるＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４のフロー図である。
【図２４Ｂ】プッシュモデルを実装する実施形態によるＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４のフロー図である。
【図２５】一実施形態によるＳｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８のフロー図である。
【図２６】一実施形態による電子デバイス２６０４を示す図である。
【発明を実施するための形態】
【００１２】
以下の説明は、テンポラル−リレーショナルデータベースを有するリレーショナルデータベース管理システムにおけるクエリプランの生成および実行のための方法および装置について説明する。以下の説明において、本発明のより完全な理解をもたらすために、リソース分割／共有／複製の実装、システムコンポーネントのタイプおよび相互関係、ならびに論理分割／統合の選択などの多数の特定の詳細について述べる。しかしながら、当業者は、本発明をそのような特定の詳細なしで実施してもよいことを理解するだろう。他の事例において、本発明を不明瞭にしないために、制御構造、論理実装、オペコード、オペランドを特定する手段、および完全なソフトウェア命令シーケンスは、詳細に図示されていない。当業者は、含まれる説明により、必要以上の実験を行うことなく本発明を実施することができるだろう。
【００１３】
本明細書における「一実施形態」、「実施形態」、「例示的実施形態」などへの言及は、記載される実施形態が特定の特徴、構造、または特性を含むことができるが、すべての実施形態がその特定の特徴、構造、または特性を必ずしも含まなくてよいことを示す。さらに、そのような表現は必ずしも同一の実施形態を指すものではない。さらに、特定の特徴、構造、または特性が実施形態に関連して記載されるとき、そのような特徴、構造、または特性を他の実施形態に関連させることは、明記されていてもいなくても、当業者の知識の範囲内であると思われる。
【００１４】
本明細書において、括弧書きの文言および破線の枠を有するブロック（例えば、大きい破線、小さい破線、鎖線、および点線）を使用して、一部の実施形態にさらなる特徴を追加するオプションの動作および／または構造を示すことができる。しかしながら、そのような表記は、これらが単にオプションまたはオプションの動作であること、および／または実線の枠を有するブロックが、ある実施形態においてオプションでないことを意味するものと解釈すべきではない。
【００１５】
以下の説明および特許請求の範囲において、「結合される」という用語およびその派生語を使用することができる。「結合される」は、２つ以上の要素が互いに協働するまたは相互作用することを示すために使用され、これらの要素は、互いに直接物理的または電気的に接触していても接触していなくてもよい。
【００１６】
フロー図の動作は、他の図の例示的な実施形態を参照して説明される。しかしながら、フロー図の動作を、これらの他の図を参照して説明するもの以外の実施形態により実行してもよく、これらの他の図を参照して説明する実施形態は、フロー図を参照して説明するものと異なる動作を実行してもよい。
【００１７】
本明細書において、「クライアント」という用語が、いくつかの文脈で「データベースクライアント」（ＲＤＢＭＳクライアントとしても知られる）、「ＢＩクライアント」、および「エンドユーザクライアント」を指すためにも使用される。データベースクライアントはＲＤＢＭＳのクライアントであり、ＢＩクライアントはＢＩサービスのクライアントである。エンドユーザクライアントはデータベースクライアントであってよく、エンドユーザクライアントはＢＩクライアントであってよく（ＢＩサービスがデータベースクライアントである状態で）、かつ／またはエンドユーザクライアントはデータベースクライアントおよびＢＩクライアント（ＢＩサービスがデータベースクライアントである状態で）の両方であってよい。
【００１８】
概略
図１は、一実施形態による、テンポラル−リレーショナルデータベースを有するリレーショナルデータベース管理システム（ＲＤＢＭＳ）におけるクエリプランの生成および実行のフロー図である。ブロック１００で、リレーショナルデータベース管理システムは、リレーショナルデータベース管理システムにより管理されたテンポラルデータベースのテンポラルテーブルのデータへのアクセスを必要とする複数の構造化クエリ言語（ＳＱＬ）クエリを受信する。前述したように、テンポラルテーブルは、論理的には行と列とを有するテーブルであると考えられるが、テンポラルテーブルのコンテンツをメモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に異なる方法（例えば、前記論理ビューをまねた「行指向」構成（「行指向」テンポラルテーブルと称することもある）、「列指向」（「カラム型」としても知られる）構成（「列指向」テンポラルテーブルと称することがある）など）で保存することができる。一実施形態において、テンポラルテーブルに保存された各データレコードは、対のタイムスタンプ、すなわち、レコードが有効な最も早い時間に対応する第１のタイムスタンプ（例えば、「ｖａｌｉｄ＿ｆｒｏｍ」列に対応するｖａｌｉｄ＿ｆｒｏｍフィールドに保存される）、およびレコードが有効な（かつ時間が未知の場合に無限大（ＩＮＦ）に設定される）最も遅い時間に対応する第２のタイムスタンプ（例えば、「ｖａｌｉｄ＿ｔｏ」列に対応するｖａｌｉｄ＿ｔｏフィールドに保存される）と関連付けられる。本明細書において、前記論理ビューに関して、かつ（当技術分野で時々使用されるように）ｖａｌｉｄ＿ｔｏ列およびｖａｌｉｄ＿ｆｒｏｍ列という用語を使用して実施形態について説明するが、代替実施形態は、テンポラルテーブルを異なって実装してもよい（例えば、テンポラルテーブルのコンテンツを異なる方法で（例えば、行指向構成を使用して、列指向構成を使用して、１つまたは複数のテンポラルテーブルの行指向構成および列指向構成の両方を使用して、１つまたは複数のテンポラルテーブルの行指向構成を使用し１つまたは複数の他のテンポラルテーブルの列指向構成を使用してなど）保存する、データレコードのタイムスタンプ情報を別の方法で（例えば、より多いまたは少ないフィールドを使用して）保存する、様々な用語によりタイムスタンプ情報を参照するなど）。ブロック１００の複数のＳＱＬクエリを同時に受信する必要はないことに留意すべきである。ブロック１００から、制御はブロック１１０へ進む。
【００１９】
ブロック１１０で、ＳＱＬクエリの各々についてのクエリ結果を生成するように複数のＳＱＬクエリのうちのＳＱＬクエリを実行する。一実施形態において、この実行はブロック１２０、次いでブロック１３０を含む。ブロック１２０は、実行後にメモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に保存される複数のクエリプランの生成および実行を含み、複数のクエリプランの各々は、エッジにより連結されたノードの有向グラフを含む。有向グラフの各々は、複数のＳＱＬクエリのうちの１つについてのクエリ結果（「結果セット」とも称する）を実行時に生成するクエリプラン演算子の順序セットを表し、有向グラフのノードの各々はクエリプラン演算子のうちの１つを表す。有向グラフのノードにより表されたクエリプラン演算子の各々は、クエリプランの一部として実行される演算のタイプを表す。したがって、本明細書で使用されるとき、「クエリプラン演算子」は、クエリプランの一部として実行される演算のタイプ（例えば、リレーショナル演算のタイプ（例えば、ＰＲＯＪＥＣＴ、ＳＥＬＥＣＴ、ＪＯＩＮ、ＴＡＢＬＥなど）または他の演算のタイプ（例えば、ＲＥＮＡＭＥなど））を表す。そのようなクエリプラン演算子がテンポラルテーブル上のリレーショナル演算を表すとき、この演算をテンポラル−リレーショナル演算と称する。有向グラフは、エッジがそのエッジに関連付けられた方向を有するグラフである。有向グラフの各々におけるノードは親子関係を有し、すなわち、１つのノードを別のノードに連結するエッジは、これらのノードがそれぞれ互いに親ノードおよび子ノードであり、子ノードの結果に親ノードがアクセスできることを表す。複数のＳＱＬクエリをブロック１１０で同時に実行する必要はないことに留意すべきである。
【００２０】
図示した例では、ＳＱＬクエリは、有向グラフの各々がそのノードの少なくとも１つを別の有向グラフと共有するようになっている（有向グラフの各々がそのエッジのうちの少なくとも１つにより別の有向グラフの少なくとも１つのノードに連結されて、それらの有向グラフが少なくとも１つのノードを共有するようになっている）。言い換えると、有向グラフの各々は、別の有向グラフのノードに連結されたエッジを含み、少なくともそのノードがそれらの有向グラフによって共有されるようになっている。したがって、クエリプランは、少なくとも１つのノードを共有するという点で結合される（「重複する」とも称する）。クエリプランは、２つ以上のノード（例えば、２つ以上のノードおよび１つまたは複数のエッジのサブグラフ）を共有することもできる。１つまたは複数の共有されたノードが存在するように、少なくとも１つのクエリプラン演算が２つ以上のクエリプランにおいて同一でなければならない。一実施形態は、別のクエリプランが生成および実行される前に生成および実行されるクエリプランのうちの１つをサポートする。例えば、一実施形態において、１つの有向グラフを生成および実行することは、生成中の１つの有向グラフのエッジを先に生成された１つの有向グラフのノードに連結して、少なくとも先に生成された１つの有向グラフのノードを再利用することにより（より詳細には、組み込むことにより）、生成中の１つの有向グラフが、少なくとも先に生成された１つの有向グラフとノードを共有することを含む。したがって、第１のクエリプランが既に生成され、実行後にメモリに保存されている場合には、第２のクエリプランの生成は、第１のクエリプランに既に存在し、かつ同一であるため共有可能な１つまたは複数のノード（および場合により、ノードおよびエッジの１つまたは複数のサブグラフ）の生成を必要としない。第２のクエリプランの生成は、同一である１つまたは複数のノード（および場合により、１つまたは複数のサブグラフ）を第１のクエリプランから再利用する（より詳細には、「組み込む」）。
【００２１】
図１において、ＳＱＬクエリは、有向グラフの各々が、そのエッジのうちの少なくとも１つにより、別の有向グラフの少なくとも１つのノードに連結されるようになっている（例えば、そのようなクエリプランを必要とするＳＱＬクエリが送信されており、クエリプランは同時にメモリに存在する）。言い換えると、図１は、本明細書で後述するように、ＳＱＬクエリ、および結果として得られる、ある特性およびタイミング（ＳＱＬクエリは同時にまたは異なる時間に送信することができるが、クエリプランは同時にメモリに存在する）を共有するクエリプランに依存する能力を示す。実施形態はこの能力を有するが、実施形態は、異なる時点で以下もサポートする。１）メモリにクエリプランを有していない、２）実行後に１つのクエリプランをメモリに有する、３）実行後に複数のクエリプランをメモリに有するが、各々がメモリ内の別のクエリプランと結合していない（いずれのノードも共有していない）という点で独立している、４）実行後に複数のクエリプランをメモリに有し、１つまたは複数が独立し、グループが結合されている、５）実行後にクエリプランの複数のグループをメモリに有し、各グループのクエリプランが結合されるが、所与のグループのクエリプランは別のグループのクエリプランに結合されていない（異なるグループが独立している）など。
【００２２】
加えてまたはあるいは、一実施形態は、有向グラフの各々がルートノードを含み、かつ有向グラフの少なくとも一部がルートノードを共有しない（言い換えると、結果として得られるクエリプランは、これらの特定の有向グラフの各々のルートノードが別の有向グラフと共有されないようになっている）ことをサポートする。加えてまたはあるいは、一実施形態は、少なくとも２つの有向グラフが、ルートノード、少なくとも１つまたは複数のリーフノード、および１つまたは複数の中間ノードを各々含み、中間ノードは１つまたは複数の親ノードおよび１つまたは複数の子ノードの両方を有するノードであり（ルートノードは少なくとも１つの中間ノードに連結され、各中間ノードは少なくとも別の中間ノードまたは１つのリーフノードに連結され）、これら２つの有向グラフが、少なくとも１つの中間ノードおよびその子孫ノードを共有することをサポートする。言い換えると、一実施形態は、少なくとも２つのクエリプランがノードおよびエッジのサブグラフを共有することをサポートする。加えてまたはあるいは、一実施形態は、少なくとも２つの有向グラフが各々ルートノードおよび１つまたは複数のリーフノードを含み、これら２つの有向グラフのうちの第１のグラフが第２のグラフのサブグラフである（言い換えると、第１のグラフのルートノードおよび中間ノードが第２のグラフの中間ノードであり、第１のグラフのリーフノードが第２のグラフのリーフノードでもある）ことをサポートする。
【００２３】
有向グラフの各々のノードのうちの少なくとも１つは、テンポラルデータベースのテンポラルテーブルのうちの１つを特定し、有向グラフの各々のノードのうちの少なくとも別の１つは、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する。加えてまたはあるいは、一実施形態において、有向グラフによって共有されたノードのうちの少なくとも１つは、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する。加えてまたはあるいは、有向グラフのノードの各々は、テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの１つ、またはそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルのうちの１つを特定する。加えてまたはあるいは、クエリプラン演算子のうちの１つを実行した結果を保存するテンポラルテーブルの各々は、少なくともそのテンポラルテーブルを特定するノードが実行後にメモリに保存される限り、実行後にメモリに保存される。加えてまたはあるいは、一実施形態において、クエリプランは実行後にメモリに保存されるため、有向グラフのノードおよびサブグラフは潜在的な再利用のために使用可能になる。加えてまたはあるいは、一実施形態において、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルの各々は、潜在的な再利用のために実行後にメモリに保存されている。加えてまたはあるいは、一実施形態において、第２のクエリプランが、１つまたは複数の同一のクエリプラン演算（すなわち、同一のパラメータを有する同一の入力テンポラルテーブルに作用する同一のクエリプラン演算子）を、既に実行された第１のクエリプランとして含む場合、第２のクエリプランは、第１のクエリプランと共通のテンポラルテーブルを、必要に応じて増分更新して再利用することができる。テンポラルテーブルを増分更新することは、既存のデータレコードのタイムスタンプの変更および／または（既存のレコードを単に編集または削除するのとは対照的な）新しいデータレコードの作成によって変更を反映する上記の方法を指す。ノードにより特定されたテンポラルテーブルを増分更新することは、そのノードにより表されたクエリプラン演算子が実行されている（増分実行であっても完全実行であっても）ことに応答してそのテンポラルテーブルを増分更新することを指す。ノードにより特定されたテンポラルテーブルを増分更新することは、そのノードにより表されたクエリプラン演算子の実行が不要であるとき（例えば、その実行を避けることができることを示す最適化があるとき）には不要であってよい。したがって、ノードにより特定されたテンポラルテーブルを必要に応じて増分更新することは、そのノードにより表されたクエリプラン演算子を実行する（増分実行であっても完全再実行であっても）こと、および、実行を避けることができることを示す最適化がないとき（したがって、そのような最適化を実装しない実施形態を含むとき、またはそのような最適化を実装するが、最適化により実行および増分更新を避けることができない実施形態において）テンポラルテーブルを増分更新することを指す。加えてまたはあるいは、一部の実施形態において、変更が行われなかった場合、ノードを既存のクエリプランと共有する、新たに送信されたクエリプランは、そのノードにより表されたクエリプラン演算子を再実行することなく、共有されたノードにより特定されたテンポラルテーブルを再利用することができる。しかしながら、クエリプラン演算子の入力テンポラルテーブルの変更は、クエリプラン演算子の実行（増分または完全）を必要とすることがある。
【００２４】
クエリプランによりノードを共有すること、ならびに実行後にクエリプランおよびテンポラルテーブルをメモリに保存すること（特に、有向グラフの各々のノードのうちの少なくとも１つが、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する場合）により、一部の実施形態は、大量のデータを扱うときを含む、略リアルタイムのストリーミングの実行をサポートすることができる。これは、一部には以下の理由による。１）実行後にクエリプランをメモリに保存し、これらのクエリプランにノードを共有させ（可能であれば）、したがってそれらの共有されたノードが特定するテンポラルテーブルを共有させ、必要なメモリ、計算リソース、および計算時間を減少させる、２）テンポラルテーブルを使用すること、および実行後にテンポラルテーブルをメモリに保存することにより、ある実施形態は、１つまたは複数のクエリプラン演算子を実装して、「増分実行」（「差分」のみで実行、「増分クエリ処理」および「増分再計算」とも称する）を行い、それらのクエリプラン演算子を表すノードにより特定されたテンポラルテーブルを必要に応じて増分更新する（増分実行により、クエリプラン演算子へのテンポラルテーブル入力の各々の全体におけるクエリプラン演算子の再実行／再計算（本明細書において「完全再実行」と称する）と比較して、必要な計算リソースおよび計算時間が減少する）。したがって、１つまたは複数のテンポラルテーブルのセットを入力として有するクエリプラン演算子の実行が、それらのテンポラルテーブルの少なくとも１つから、増分挿入および削除されたデータレコードのみ（すべてのデータレコードとは対照的に、差分）にアクセスすることを含む場合には、実行は「増分実行」となる。それに対して、１つまたは複数のテンポラルテーブルのセットを入力として有するクエリプラン演算子の実行が、セットのテンポラルテーブルのすべてから有効なデータレコードのすべてにアクセスすることを必要とする場合には、実行は「完全実行」となる。所与のクエリプラン演算子を実装して、増分実行、完全実行、または両方（両方の場合には、可能であれば増分実行を行う）を行うことができる。加えてまたはあるいは、一実施形態において、ブロック１２０における生成および実行は、少なくとも、有向グラフのうちの２つによって共有された１つのノードにより表されたクエリプラン演算子を増分実行することを含む。例えば、第１のクエリプランが既に生成および実行されており、そのノードおよびノードが特定するテンポラルテーブルが実行後にメモリに保存されている場合には、第２のクエリプランの生成は、ノードを共有することができるため、既に第１のクエリプランに存在する、第２のクエリプランに必要な１つまたは複数のノード（および場合により、ノードおよびエッジの１つまたは複数のサブグラフ）を作成することを必要とせず、第２のクエリプランの実行は、更新が必要なテンポラルテーブルにおいて、それらの共有されたノードにより表されたクエリプラン演算子を増分実行することを含むことができる。
【００２５】
ブロック１３０は、複数のＳＱＬクエリの各々についてのクエリ結果を、そのＳＱＬクエリをリレーショナルデータベース管理システムに送信したクライアントに送信することを含む。本明細書において、「クライアント」という用語はＲＤＢＭＳのクライアントを指し、したがって、そのようなクライアントを「データベースクライアント」または「ＲＤＢＭＳクライアント」と称することもできる。
【００２６】
加えてまたはあるいは、一実施形態において、生成および実行は、有向グラフのうちの１つを生成することの一部として、１）先に生成された１つの有向グラフの一部であり、かつ再利用（より詳細には、組込み）可能な少なくとも１つのノードを特定すること、および２）先に生成された１つの有向グラフの一部であるノードのうちの１つに連結されたエッジを、有向グラフのうちの１つに追加することを含むことができる。加えて、一実施形態において、追加されたエッジが連結される１つのノードは、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定するノードのうちの１つであってよく、生成および実行は、有向グラフのうちの１つを実行することの一部として、追加されたエッジが連結された１つのノードにより特定されたテンポラルテーブルを必要に応じて増分更新することを含んで、再利用することを含むことができる。これは、そのテンポラルテーブルを再作成するよりも効率的であり、さらに、更新が必要な場合、そのノードにより表されたクエリプラン演算子を増分実行することができるときに（そのノードの子ノードにより特定されたテンポラルテーブル全体において、そのノードにより表されたクエリプラン演算子を再実行するのとは対照的に（すなわち、完全再実行とは対照的に））、効率がさらに向上する。あるいは、一実施形態において、生成および実行は、１）現在生成中の他の有向グラフの一部として再利用可能な、既に生成された有向グラフの一部を特定すること、および２）それらの特定された部分を再作成するのではなく、それらの特定された部分を他の有向グラフの生成において再利用することを含むことができる。加えて、一実施形態において、再利用された部分は、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように各々作成されたテンポラルテーブルを特定する１つまたは複数のノードを含むことができ、生成および実行は、再利用された部分の１つまたは複数のノードにより特定されたテンポラルテーブルを必要に応じて増分更新することを含んで、再利用することを含むことができる。これは、再利用された部分の１つまたは複数のノードにより特定された１つまたは複数のテンポラルテーブルを再作成するよりも効率的であり、さらに、更新が必要な場合、再利用された部分の１つまたは複数のノードにより表された１つまたは複数のクエリプラン演算子を増分実行することができるときに（そのノードの各子ノードにより特定されたテンポラルテーブルの有効行において、そのようなノードのクエリプラン演算子を再実行する（完全再実行）のとは対照的に）、効率がさらに向上する。
【００２７】
異なる実施形態は、異なる技術を使用して、クエリプランのいずれかの部分（ノードおよびノードに連結されたエッジのうちの１つまたは複数）または全体および対応するテンポラルテーブル（ＴＴ）が、実行後にどのくらい長くメモリに保存されるかを判定することができる。クエリプランの各々について、１）クエリプランが依然として必要とされる間（例えば、クライアントのいずれかが、クエリプランを生成したＳＱＬクエリに対する更新を受信する予定である間）の潜在的な再利用のために、および／または２）１つまたは複数の他のクエリプランの生成および実行において再利用の機会を提供するために、有向グラフ（またはその一部）のノードおよびエッジならびに対応するＴＴが実行後にメモリに保存される。クエリプランまたはその一部を実行後にメモリに保存してこの機会を提供する時間の長さは、別のクエリプランの生成および実行がクエリプラン（および対応するＴＴ）の一部または全体を再利用することができることに備えて必要なメモリを使用する価値があると思われる時間（例えば、一定の時間、プログラム可能な時間、（ｉ）そのクエリプランの一部またはすべての再利用の可能性、（ｉｉ）ノードおよびエッジが実行後にメモリに保存されること（例えば、ノードと他のノードとの連結、ノードのタイプ、過去のノードの使用などをベースとして、メモリ消費と再利用の機会とのバランスを取るために）、（ｉｉｉ）他のＳＱＬクエリの到着率、および／または（ｉｖ）使用可能なリソース（例えば、メモリ内のクエリプランおよび対応するＴＴがメモリの閾値量を超えたとき））をベースとして計算された時間）をベースとすることができる。加えてまたはあるいは、一実施形態において、「アクティブ」または「非アクティブ」の特定は、クエリプランの各々について維持され（例えば、特定はクエリプランの各々の有向グラフのルートノードに関連付けられる）、「アクティブ」クエリプランの一部ではないノード（およびノードが特定するＴＴ）は、メモリへの保存から除去される候補である。異なる実施形態は、いつ「非アクティブ」表示を異なって行うか（例えば、そのＳＱＬクエリに対応する接続がクローズされた、そのＳＱＬクエリを送信したクライアントが、クエリに興味がなくなっていることを示した、一定時間またはプログラム可能な時間が経過した）を判定することができる。また、異なる実施形態は、異なる時間に（例えば、直ちに、また、一定時間またはプログラム可能な時間の後、メモリ内のクエリプランおよびＴＴがメモリの閾値量を超えたとき、通常のガベージコレクション動作の一部として）実際の除去を行うことができる。代替実施形態は、「アクティブ」および「非アクティブ」表示をせず、クライアント接続がクローズされているかどうかを確認して、いずれかの対応するクエリプランが除去の候補であるかどうかを判定することができる。
【００２８】
加えてまたはあるいは、一実施形態において、有向グラフのうちの少なくとも２つは、ルートノードから始まり、１つまたは複数の中間ノードを含み、１つまたは複数のリーフノードで終わることができ、各有向グラフのルートノードおよび１つまたは複数の中間ノードは各々、そのノードについて、その有向グラフの１つまたは複数の他のノードを子ノードとして特定する。さらに、ルートノードおよび中間ノードの各々により表されたクエリプラン演算子の各々は、そのノードの１つまたは複数の子ノードにより特定されたテンポラルテーブルのうちの１つまたは複数（またはそのビューもしくはコピー）に作用する。加えてまたはあるいは、一実施形態において、１つまたは複数のリーフノードの各々により表されたクエリプラン演算子の実行により、テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの１つからデータを検索する（例えば、テンポラルテーブルのうちの１つへの参照（またはそのビューもしくはコピー）を返す）。加えて、一実施形態において、ノード（例えば、ルートおよび中間ノード）により表された１つまたは複数のクエリプラン演算子は、テンポラル−リレーショナル代数演算（テンポラル−リレーショナル代数演算は、テンポラルテーブルで実行されるリレーショナル代数演算である）を実行することができる。
【００２９】
加えてまたはあるいは、一実施形態において、ＲＤＢＭＳは、複数の、実際には多数の「重複」クエリプランを一度にサポートするように設計される。複数の重複クエリプランが存在するのには様々な理由がある。例えば、ある使用事例は、クエリプランが比較的大きい「クエリ深さ」を有するＳＱＬクエリを必要とし、所与のクエリプランのクエリ深さは、ルートノードとリーフノードとの間の経路上の連続するノード間のエッジの最大数により測定される。一実施形態において、大きいクエリ深さを有するクエリプランは１１以上のノードを有する経路を含むものであるが、代替実施形態は、５０〜１００のノードの閾値を使用することができる。比較的大きいクエリ深さを有するクエリプランを生成することにより、比較的多数のノード、したがってより大きい重複の機会が生じる。さらに、大きいクエリ深さを有するクエリプランを必要とするＳＱＬクエリは、最初からやり直すための重要な処理を必要とすることがあるので、データベースがクエリプラン演算子を増分実行することができることは、効率をさらに向上させる（例えば、クエリ結果の生成に必要な時間を減少させると共に処理リソースの所要電力を減少させる、処理リソースを他のタスクに使用できるようにする、データベースがより多くのクエリを同時にサポートできるようにする、メモリの読取り／書込み動作の数を減少させるなど）という利点を有する。特定の例により、一実施形態において、リレーショナルデータベース管理システムを複雑な解析処理に使用することができ、使用事例は、クエリプランが比較的大きいクエリ深さを有するＳＱＬクエリを必要とする。
【００３０】
実施形態は、本明細書に記載されるように、増分更新、レイジー更新、スキップ更新、およびこれらの組合せをサポートすることができる。増分更新をサポートする一実施形態において、テンポラル−リレーショナルデータベースの一部であり、かつＳＱＬクエリがデータへのアクセスを必要とする、テンポラルテーブルのうちの少なくとも所与の１つのコンテンツを修正したことに応答して、以下が実行される。１）少なくともその修正されたテンポラル−リレーショナルデータベーステーブルを特定するノードの先祖により特定されたテンポラルテーブルを増分更新する（可能であれば増分実行により）（ＳＱＬクエリのクエリプランの有向グラフのノードであり、かつテンポラルテーブルのうちの所与の１つを特定するノードに直接的または間接的に依存するノードにより特定されたテンポラルテーブルを増分更新する）、２）ＳＱＬクエリを送信したクライアントに、ＳＱＬクエリについてのクエリ結果に対する増分更新（「増分クエリ結果」とも称する）を送信する。レイジー更新をサポートする実施形態においては、クエリプラン演算子を実行した結果を保存するように作成されたＴＴが、（ＳＱＬクエリのうちの少なくとも１つがデータへのアクセスを必要とする）テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの１つのコンテンツが修正されたことに応答して、直ちに更新されない。むしろ、１つまたは複数の事象が発生する（例えば、クエリ結果（例えば、初期または増分）をクライアントに送る必要がある、一定時間が経過する、プログラム可能な時間が経過する、ノードおよびエッジをベースとして（例えば、ノードと他のノードとの連結、ノードのタイプ、過去のノードの使用などをベースとして）計算された時間が経過する、他のＳＱＬクエリの到着率が閾値を超える、および／または使用可能な計算リソースが閾値を下回る）まで更新を遅延させて、他の修正を受信した場合にバッチ処理を可能にする。ノードにより特定されたテンポラルテーブルの増分更新は、そのノードにより表されたクエリプラン演算子の実行が不要であるとき（例えば、実行を避けることができることを示すスキップ更新などの最適化が存在するとき）には不要であってよい。様々なタイプのスキップ更新があり、実施形態は、そのいずれもサポートしなくてもよく、１つまたは２つ以上をサポートしてもよい。したがって、加えてまたはあるいは、一部の実施形態は、１）その後に修正されたテンポラルテーブルを特定するノードに直接的または間接的に依存しない、かつ／または２）最近十分に実行された（本明細書において、最近十分に「リフレッシュされた」と称する）（例えば、これは、クエリプランの実行を並行してサポートし、かつ／またはクエリ実行を「過去の日付で」サポートする実施形態において行うことができる）ノードにより表されたクエリプラン演算子の実行を避けることのできるスキップ更新の最適化をサポートする。例えば、スキップ更新の最適化をサポートする一部の実施形態において、テンポラル−リレーショナルデータベースの一部であり、かつＳＱＬクエリのうちの少なくとも１つがデータへのアクセスを必要とする、テンポラルテーブルのうちの少なくとも所与の１つのコンテンツを修正したことに応答して、実行中のクエリプランの一部であり、かつ修正されたテンポラルテーブルのうちの所与の１つを特定するノードに直接的または間接的に依存しないノードにより表されたクエリプラン演算の実行がスキップされる（増分実行であっても完全再実行であっても）。別の例として、スキップ更新の最適化をサポートする一部の実施形態において、クエリプランの実行時に、実行中のクエリプランの一部であり、かつ最近十分に実行された（本明細書では、最近十分にリフレッシュされたとも称する）ノードにより表されたクエリプラン演算子の実行が避けられる。したがって、ノードにより特定されたテンポラルテーブルを必要に応じて増分更新することは、そのノードにより表されたクエリプラン演算子を実行すること（増分実行であっても完全再実行であっても）、および、実行を避けることができることを示す最適化が存在しないとき（したがって、そのような最適化を実装しない実施形態を含むとき、またはそのような最適化を実装するが、最適化により実行および増分更新を避けることができない状況の実施形態において）テンポラルテーブルを増分更新することを指す。
【００３１】
加えてまたはあるいは、一実施形態において、ブロック１１０のＳＱＬクエリは、リレーショナルデータベース管理システムにより受信された第１のＳＱＬクエリおよび第２のＳＱＬクエリを含むことができる。さらに、ブロック１２０の生成および実行は、第１のＳＱＬクエリの第１のクエリプランおよび第２のＳＱＬクエリの第２のクエリプランを生成することを含み、第２のクエリプランの有向グラフは、そのエッジのうちの少なくとも１つにより、第１のクエリプランの有向グラフの少なくとも１つのノードに連結されて、それらの有向グラフが少なくとも１つのノードを共有するようになっている。加えてまたはあるいは、一実施形態において、第１のクエリプランおよび第２のクエリプランの有向グラフによって共有された少なくとも１つのノードは、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたノードである。加えてまたはあるいは、一実施形態において、第２のクエリプランの生成および実行は、少なくとも、第１のクエリプランおよび第２のクエリプランの有向グラフによって共有された少なくとも１つのノードにより表されたクエリプラン演算子を増分実行することを含む。加えてまたはあるいは、第１のＳＱＬクエリおよび第２のＳＱＬクエリは、リレーショナルデータベース管理システムにより受信されて、第１のダッシュボードコンテンツ要素および第２のダッシュボードコンテンツ要素をそれぞれ入力する。加えて、一実施形態において、第１のダッシュボードコンテンツ要素および第２のダッシュボードコンテンツ要素は、異なるエンドユーザクライアントにより表示される異なるダッシュボードの部分であってよい。あるいは、一実施形態において、第１のダッシュボードコンテンツ要素および第２のダッシュボードコンテンツ要素は、表示される同一のダッシュボードの部分であってよい。
【００３２】
一部の実施形態は、加えてまたはあるいは、クライアントがクエリ結果に対する更新を受信することのできるＳＱＬクエリであるサブスクリプションＳＱＬクエリをサポートする。一実施形態において、クライアントがサブスクリプションＳＱＬクエリを送信すると、ＲＤＢＭＳは最初に、サブスクリプションＳＱＬクエリが最初に実行されたときのデータを表す初期クエリ結果をクライアントに送信する。その後、ＲＤＢＭＳは、サブスクリプションＳＱＬクエリがデータへのアクセスを必要とするテンポラル−リレーショナルデータベースのいずれかのテンポラルテーブルのコンテンツの修正により生じるそれらのクエリ結果に対する更新を、クライアントに送信する。一実施形態において、サブスクリプションＳＱＬクエリ（およびクエリプランのノードにより特定されたテンポラルテーブル）のクエリプランは、少なくともそのサブスクリプションＳＱＬクエリを送信したクライアントがそのサブスクリプションＳＱＬクエリについてのクローズサブスクリプションメッセージを送信するまで、実行後にメモリに保存される。このようにして、ＲＤＢＭＳがさらなるＳＱＬクエリを受信すると、サブスクリプションＳＱＬクエリの使用により、複数の重複クエリプランが存在する機会が増加する（すなわち、既存のクエリプランが実行後にメモリに長く保存されるほど、後で生成されたクエリプランが既存のクエリプランと重複する機会が増加する）。場合により、サブスクリプションＳＱＬクエリのクエリプランの再利用は、クエリプランの１つまたは複数のノードにより表されたクエリプラン演算子のうちの１つまたは複数を増分実行して、それらの１つまたは複数のノードが特定する既存のテンポラルテーブルを増分更新すること（完全再実行とは対照的に）を含むことができる。ＳＱＬクエリおよびサブスクリプションＳＱＬクエリの両方をサポートする異なる実施形態は、異なる技術（例えば、サブスクリプションＳＱＬクエリの前に、「ｓｕｂｓｃｒｉｂｅ  ｔｏ」などのフレーズ／プレフィックスを付けることができる）を使用して２つを区別することができる。加えて、サブスクリプションＳＱＬクエリのみをサポートする一実施形態において、ＲＤＢＭＳは、送信された各ＳＱＬクエリをサブスクリプションＳＱＬクエリとして扱い、そのようなフレーズ／プレフィックスを必要としない。一実施形態において、ブロック１１０のＳＱＬクエリは、サブスクリプションＳＱＬクエリである第１のＳＱＬクエリを含むことができ、ブロック１２０は、第１のＳＱＬクエリの第１のクエリプランを生成することを含む。さらに、ブロック１１０のＳＱＬクエリは、第１のＳＱＬクエリがサブスクリプションＳＱＬクエリであるため、第１のＳＱＬクエリプランが生成された後、第１のクエリプランが実行後にメモリに保存されている間に受信される第２のＳＱＬクエリを含むことができる。「潜在的な再利用のため」という表現は、既存のクエリプランのノード（およびノードが特定するテンポラルテーブル）が実行後にメモリに保存されるため、実施形態が以下の１つまたは複数をサポートすることができることを意味する。１）それらの既存のクエリプラン（またはそれらの既存のクエリプランのうちの１���または複数）の１つまたは複数の部分（ノードおよび／またはサブグラフ）を現在生成中のクエリプランに組み込むこと、２）ノードのうちの少なくとも１つがそのように組み込まれたときに、そのノードにより特定されたテンポラルテーブルを可能なときにそのまま使用すること（そのテンポラルテーブルを特定するノードにより表されたクエリプラン演算の再実行を必要とするのとは対照的に）、３）ノードのうちの少なくとも１つがそのように組み込まれたときに、そのノードにより表されたクエリプラン演算子を増分実行して、そのノードにより特定された既存のテンポラルテーブルを増分更新すること（完全再実行とは対照的に）、４）ノードのうちの少なくとも１つがそのように組み込まれたときに、そのノードにより表されたクエリプラン演算子を完全再実行して、そのノードにより特定された既存のテンポラルテーブルを増分更新すること、５）サブスクリプションＳＱＬクエリの既存のクエリプランのリーフノードにより表されたテンポラルテーブルのコンテンツが更新されたときに、その既存のクエリプランを再利用すること、および／または、６）サブスクリプションＳＱＬクエリの既存のクエリプランのリーフノードにより表されたテンポラルテーブルのコンテンツが更新されたときに、その既存のクエリプランのノードにより表されたクエリプラン演算子のうちの少なくとも１つを増分実行して、そのクエリプラン演算子の結果を保存している既存のテンポラルテーブルを増分更新すること（完全再実行とは対照的に）。
【００３３】
図２は、一実施形態によるリレーショナルデータベース管理システムを示すブロック図である。図２は、クライアント側２００とサーバ側２１０とに分けられている。クライアント側２００は、１つまたは複数のクライアント（図示せず）を含み、各クライアントは、データベースドライバ２０４のうちの１つ（リモートプロシージャコール（ＲＰＣ）モジュールとしても知られる）および当技術分野で公知の他のコンポーネント（図示せず）を含む。
【００３４】
サーバ側２１０は、リレーショナルデータベース管理システム（ＲＤＢＭＳ）２１２を含む。ＲＤＢＭＳ２１２は、テンポラル−リレーショナルデータベース２６２を含み、クライアントはそこにデータを保存し、そこからデータを検索する。ＲＤＢＭＳ２１２は、ＲＤＢＭＳに共通して見られるコンポーネントにより名付けられたコンポーネント（例えば、Ｊｏｓｅｐｈ  Ｍ．  Ｈｅｌｌｅｒｓｔｅｉｎ、Ｍｉｃｈａｅｌ  Ｓｔｏｎｅｂｒａｋｅｒ、およびＪａｍｅｓ  Ｈａｍｉｌｔｏｎ、「Ａｒｃｈｉｔｅｃｔｕｒｅ  ｏｆ  ａ  Ｄａｔａｂａｓｅ」、Ｆｏｕｎｄａｔｉｏｎｓ  ａｎｄ  Ｔｒｅｎｄｓ  ｉｎ  Ｄａｔａｂａｓｅｓ、Ｖｏｌ．１、Ｎｏ．２（２００７）、１４１〜２５９ページ、Ｊｏｓｅｐｈ  Ｍ．  ＨｅｌｌｅｒｓｔｅｉｎおよびＭｉｃｈａｅｌ  Ｓｔｏｎｅｂｒａｋｅｒ、「Ａｎａｔｏｍｙ  ｏｆ  ａ  Ｄａｔａｂａｓｅ」、Ｒｅａｄｉｎｇｓ  ｉｎ  Ｄａｔａｂａｓｅ  Ｓｙｓｔｅｍｓ、第４版、Ｔｈｅ  ＭＩＴ  Ｐｒｅｓｓ（２００５）、４２〜９５ページ）、例えば、プロセスクライアント通信マネージャ（ＰＣＣＭ）２１４、パーサ２１８、クエリリライタ２２４、クエリオプティマイザ２３０、およびクエリエグゼキュータ２４０（エグゼキュータまたはクエリプランエグゼキュータとしても知られる）を含む。「クエリプロセッサ」という用語は、パーサ２１８、クエリリライタ２２４、クエリオプティマイザ２３０、およびクエリエグゼキュータ２４０の組合せを指すために使用されることがある。図１に関連して、一実施形態において、ＰＣＣＭ２１４はブロック１００、１３０を実行し、クエリプロセッサはブロック１１０の残りを実行する（クエリオプティマイザ２３０とクエリエグゼキュータ２４０との組合せがブロック１２０を実行する）。
【００３５】
プロセスクライアント通信マネージャ２１４（一部の実施形態において、別個のマネージャとして実装され、単にプロセスマネージャと称することもある）は、１）クライアントに対する接続状態を確立および保存し、ＳＱＬステートメント２１６の形式のクライアント要求に応答し、クエリ結果２１７を返すこと、および／または２）ＲＤＢＭＳ２１２の様々なタスク（アドミッション制御の実行を含む）をカプセル化およびスケジューリングすることを含む、様々なタスクを実行することができる。クライアントのデータベースドライバ２０４とプロセスクライアント通信マネージャ２１４との間で接続が確立される。データベースドライバ２０４は、ＳＱＬステートメント２１６をＰＣＣＭ２１４に送信する。
【００３６】
ＰＣＣＭ２１４は、ＳＱＬステートメント２１６をパーサ２１８に提供する。一実施形態において、パーサ２１８のタスクは、ＳＱＬステートメント２１６を内部表現２２０（例えば、抽象構文木（ＡＳＴ））に変換することを含む。決定ブロック２２２は、ＳＱＬクエリであるＳＱＬステートメント２１６をＳＱＬクエリではないＳＱＬステートメント２１６から区別することを示す。この決定をＲＤＢＭＳ２１２内の１つまたは複数の異なる位置（例えば、図示した位置、および／またはクエリオプティマイザ２３０とクエリエグゼキュータ２４０との間、および／またはクエリエグゼキュータ２４０の一部として）で行うことができるため、決定ブロック２２２は破線で示される。図示した位置で、ＳＱＬクエリであるＳＱＬステートメント２１６から生成された内部表現２２０はクエリリライタ２２４に提供され、ＳＱＬクエリでないＳＱＬステートメント２１６から生成された内部表現２２０は非クエリエグゼキュータ２２８に提供される。
【００３７】
クエリリライタ２２４は、ＳＱＬクエリの内部表現２２０を単純化および正規化して、書換え済み内部表現２２６（例えば、クエリ文字列の構造およびコンテンツを表す書換え済みＡＳＴ）を生成し、これがクエリオプティマイザ２３０に提供される。クエリリライタ２２４は別個のコンポーネントとして示されているが、一部の実施形態において、一部の商用ＲＤＢＭＳのように、クエリリライタ２２４はパーサ２１８またはクエリオプティマイザ２３０の一部である。
【００３８】
クエリオプティマイザ２３０は、書換え済み内部表現２２６からクエリプランを生成する（クエリプラン最適化の実行を含むことができる）。一部の実施形態において、書換え済み内部表現２２６の各々について、クエリオプティマイザ２３０は、物理クエリプラン２４２において「物理クエリプラン」（「完全特定クエリプラン」としても知られる）を作成する前に、「論理クエリプラン」（本明細書でさらに後述する）を最初に作成する。異なる実施形態は、論理クエリプランを当技術分野で周知のものを含む異なる方法で生成することができる（例えば、Ｖａｎ  ｄｅｎ  Ｂｕｓｓｃｈｅ、Ｊ．、Ｖａｎｓｕｍｍｅｒｅｎ、Ｓ．、Ｔｒａｎｓｌａｔｉｎｇ  ＳＱＬ  ｉｎｔｏ  ｔｈｅ  Ｒｅｌａｔｉｏｎａｌ  Ａｌｇｅｂｒａ、ｈｔｔｐｓ：／／ｃｓ．ｕｌｂ．ａｃ．ｂｅ／ｐｕｂｌｉｃ／＿ｍｅｄｉａ／ｔｅａｃｈｉｎｇ／ｉｎｆｏｈ４１７／ｓｑｌ２ａｌｇ＿ｅｎｇ．ｐｄｆで利用可能、２０１６年１０月に検索、Ｋｉｆｅｒ、Ｍ．他、Ｄａｔａｂａｓｅ  Ｓｙｓｔｅｍｓ：Ａｐｐｌｉｃａｔｉｏｎ  Ｏｒｉｅｎｔｅｄ  Ａｐｐｒｏａｃｈ、Ｃｏｍｐｌｅｔｅ  Ｖｅｒｓｉｏｎ  第２版、ＩＳＢＮ−１３：９７８−０３２１２６８４５７、２００５年３月２６日）。例えば、一実施形態において、ＡＳＴをたどり、クエリプラン演算子（例えば、「ｓｅｌｅｃｔ」ステートメントのＰＲＯＪＥＣＴ、「ｗｈｅｒｅ」句のＪＯＩＮまたはＳＥＬＥＣＴなど）に対応するＡＳＴからノードを作成することにより、論理クエリプランが書換え済み内部表現から作成される。
【００３９】
クエリエグゼキュータ２４０は、ＳＱＬクエリに対応する物理クエリプラン２４２を実行する。これは、テンポラル−リレーショナルデータベース２６２の特定のテンポラルテーブルの特定のデータにアクセスすること、それらの物理クエリプランにより特定されたクエリプラン演算を実行すること、結果をプロセスクライアント通信マネージャ２１４に提供し、次いでプロセスクライアント通信マネージャ２１４が、それらの結果（クエリ結果２１７として示す）を、それぞれのＳＱＬクエリを送信した各クライアントに提供することを含む。
【００４０】
物理クエリプラン２４２の各々は、エッジにより連結されたノードの有向グラフを含み、有向グラフの各々は、実行時にＳＱＬクエリについてのクエリ結果を提供するクエリプラン演算子の順序セットを表す。クエリオプティマイザ２３０はクエリプランコネクタ２３２を含む。一実施形態において、論理クエリプランの各々について、クエリプランコネクタ２３２は、実行後に現在メモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に保存されている物理クエリプラン２４２に既に存在する１つまたは複数のノードおよび／またはサブグラフ（ならびに一部の実施形態において、有向グラフ全体）を再利用する、または必要な物理クエリプランに組み込むことにより、必要な物理クエリプランを生成することができるかどうかを判定する。クエリプランコネクタ２３２が、所与の論理クエリプランについて再利用または組込みが可能であると判定した場合には、物理クエリプランの欠けている部分（１つまたは複数のノード、エッジ、および／またはサブグラフ）（あれば）のみが物理クエリプラン２４２に追加され、１つまたは複数のエッジにより、再利用可能であると判定された１つまたは複数のノードおよび／またはサブグラフ（ならびに、一部の実施形態において、有向グラフ全体）に連結される。クエリプランコネクタ２３２の演算を、クエリプラン最適化と共に実行しても、クエリプラン最適化後に（最適化されたクエリプラン上で）実行しても、両方であってもよい。
【００４１】
一実施形態において、クエリプランコネクタ２３２は、物理クエリプラン２４２の対応するノードに対するノードキーのマッピングを保存するためのキャッシュ２３４（ノードキー対ノードキャッシュとも称する）を含む。一実施形態において、物理クエリプラン２４２のノードの各々は、キャッシュ２３４のエントリを有し、ノードの各々のエントリは、ノードキーと、そのノードを物理クエリプラン２４２に位置決めするために使用する参照とを保存する。データ構造（例えば、ノード）の位置決めに使用する「参照」は、様々な方法（例えば、ポインタ、インデックス、ハンドル、キー、識別子など）で実装することができる。ノードキーは、クエリプランコネクタ２３２が、論理クエリプランの各ノードについて、前記判定（実行後に現在メモリに保存されている物理クエリプラン２４２に既に存在する１つまたは複数のノード、サブグラフ、および／または有向グラフ全体を再利用するまたは組み込むことにより、必要な物理クエリプランを生成することができるかどうか）を行うことができるようになっている。加えてまたはあるいは、一実施形態において、論理クエリプランは、キャッシュ２３４に保存されているものに関係なく作成され、その後、その論理クエリプレイを使用して、必要に応じてノードキーを生成し、既にキャッシュ２３４に存在するノードキーと比較する。キャッシュヒットは、そのエントリで参照されたノードを再利用する／組み込むことができることを意味する。グラフのエッジがグラフのノード内に保存される実施形態について説明したが、代替実施形態は、代わりにエッジをキャッシュ２３４に保存してもよい。
【００４２】
一実施形態において、クエリオプティマイザ２３０はまた、クエリプランを機械コードまたは解釈可能なクエリプラン（クロスプラットフォームの移植性を可能にするためのもので、軽量（例えば、注釈付きリレーショナル代数表現）または低級言語（例えば、Ｊａｖａバイトコード）であり得る）にコンパイルするクエリコンパイラ２３６を含む。
【００４３】
物理クエリプラン２４２の有向グラフのノードの各々は、物理クエリプラン２４２のクエリプラン演算子のうちの１つを表す。物理クエリプラン２４２のノードを「ノード」または「物理クエリプランノード」（ＰＱＰＮ）と称することができる。
【００４４】
さらに、有向グラフの各々のノードのうちの少なくとも１つは、実行後にメモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定し、有向グラフの各々のノードのうちの少なくとも１つは、テンポラル−リレーショナルデータベース２６２のテンポラルテーブルのうちの１つを特定する。加えてまたはあるいは、一実施形態において、有向グラフによって共有されたノードのうちの少なくとも１つは、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する。加えてまたはあるいは、一実施形態において、物理クエリプランは実行後にメモリに保存されるため、有向グラフのノードおよびサブグラフは潜在的な再利用のために使用可能になる。加えてまたはあるいは、一実施形態において、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルの各々は、潜在的な再利用のために実行後にメモリに保存されている。加えてまたはあるいは、一実施形態において、第２のクエリプランが、１つまたは複数の同一のクエリプラン演算（同一のパラメータを有する同一の入力テンポラルテーブルに作用する同一のクエリプラン演算子）を、既に実行された第１のクエリプランとして含む場合、第２のクエリプランは、第１のクエリプランと共通のテンポラルテーブルを、必要に応じて増分更新して再利用することができる。加えてまたはあるいは、一実施形態において、有向グラフのうちの１つの生成は、１）先に生成された１つの有向グラフの一部であり、かつ再利用可能な少なくとも１つのノードを特定すること、および２）先に生成された１つの有向グラフの一部である１つのノードに連結されたエッジを、有向グラフのうちの１つに追加することを含む。加えて、一実施形態において、追加されたエッジが連結される１つのノードは、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定するノードのうちの１つであってよく、有向グラフのうちの１つを実行することは、追加されたエッジが連結された１つのノードにより特定されたテンポラルテーブルを必要に応じて増分更新することを含んで、再利用することを含むことができる。これは、そのテンポラルテーブルを再作成するよりも効率的であり、さらに、更新が必要な場合、そのノードにより表されたクエリプラン演算子を増分実行することができるときに（そのノードの各子ノードにより特定されたテンポラルテーブルの有効行において、そのノードにより表されたクエリプラン演算子を再実行する（完全再実行）のとは対照的に）、効率がさらに向上する。あるいは、一実施形態において、生成は、１）現在生成中の他の有向グラフの一部として再利用可能な既に生成された有向グラフの一部を特定すること、および２）それらの特定された部分を再作成するのではなく、それらの特定された部分を他の有向グラフの生成において再利用することを含むことができる。加えて、一実施形態において、再利用された部分は、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する１つまたは複数のノードを含むことができ、実行は、再利用された部分の１つまたは複数のノードにより特定されたテンポラルテーブルを必要に応じて増分更新することを含んで、再利用することを含むことができる。これは、再利用された部分の１つまたは複数のノードにより特定された１つまたは複数のテンポラルテーブルを再作成するよりも効率的であり、さらに、更新が必要な場合、再利用された部分の１つまたは複数のノードにより表された１つまたは複数のクエリプラン演算子を増分実行することができるときに（そのノードの各子ノードにより特定されたテンポラルテーブルの有効行において、そのようなノードのクエリプラン演算子を再実行する（完全再実行）のとは対照的に）、効率がさらに向上する。
【００４５】
加えてまたはあるいは、一実施形態において、有向グラフのノードの各々は、テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの１つ、またはそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルのうちの１つを特定する。加えてまたはあるいは、一実施形態において、有向グラフの各々は、ルートノードから始まり、１つまたは複数の中間ノードを含むことができ、１つまたは複数のリーフノードで終わり、各有向グラフのルートノードおよび１つまたは複数の中間ノードは各々、そのノードについて、その有向グラフの１つまたは複数の他のノードを子ノードとして特定する。加えてまたはあるいは、ルートノードおよび中間ノードの各々により表されたクエリプラン演算子の各々は、そのノードの１つまたは複数の子ノードにより特定されたテンポラルテーブルのうちの１つまたは複数（またはそのビューもしくはコピー）に作用する。加えてまたはあるいは、一実施形態において、１つまたは複数のリーフノードの各々により表されたクエリプラン演算子の実行により、テンポラル−リレーショナルデータベース２６２のテンポラルテーブルのうちの１つからデータを検索する。加えてまたはあるいは、一実施形態において、物理クエリプラン２４２のノードの各々についてキャッシュ２３４に維持されたノードキーは、そのノードおよびそのノードの０以上の特定された子ノードをベースとする。別の実施形態において、物理クエリプラン２４２のルートノードおよび中間ノードの各々についてキャッシュ２３４に維持されたノードキーは、そのノードおよびそのノードの特定された子ノードをベースとする。さらに別の実施形態において、物理クエリプラン２４２のノードの各々についてキャッシュ２３４に維持されたノードキーは、そのノードおよびその子孫（子ノード、孫ノードなど）（あれば）を含むクエリプランの部分を表すが、そのノードの先祖ノード（親ノード、祖父母ノードなど）により表されたクエリプランの部分を表さない。一実施形態において、物理クエリプラン２４２のルートノードおよび中間ノードの各々についてキャッシュ２３４に維持されたノードキーは、そのノードおよびそのノードの特定された子ノード（ある場合）のキーをベースとする。
【００４６】
図２の実施形態において、テンポラルテーブル（ＴＴ）の各々は、オブジェクトによりカプセル化され、これらのオブジェクトは、テンポラル−リレーショナルデータベース２６２内のベーステンポラルテーブル（ＢＴＴ）２６０と、ノードの各々により表されたクエリプラン演算子を実行した結果を保存する派生テンポラルテーブル（ＤＴＴ）２６４とに分割される。前述したように、異なる実施形態は、ＴＴのコンテンツをメモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に異なる方法で保存することができる（例えば、カラム型（列指向としても知られる）構成を使用して、列指向構成を使用して、１つまたは複数のテンポラルテーブルの行指向構成および列指向構成の両方を使用して、１つまたは複数のテンポラルテーブルの行指向構成および１つまたは複数の他のテンポラルテーブルの列指向構成を使用してなどにより、コンテンツを保存することができる）。一実施形態において、ＢＴＴ２６０およびＤＴＴ２６４は、比較的速い読み書き時間でメモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に保存され（例えば、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、スタティックランダムアクセスメモリ（ＳＲＡＭ）、および／または相変化メモリ）、代替実施形態において、ＢＴＴ２６０および／またはＤＴＴ２６４の一部を、比較的遅い読み書き時間でメモリに保存することができる（例えば、フラッシュ、ＳＳＤ、磁気ディスク）。
【００４７】
一部の実施形態において、物理クエリプラン２４２の物理クエリプランノード（ＰＱＰＮ）を「テンポラルテーブルノード」（ＴＴＮ）と称し、このテンポラルテーブルノードは、派生テンポラルテーブルノード（ＤＴＴＮ）２４４とベーステンポラルテーブルノード（ＢＴＴＮ）２４６とに分割される。ＢＴＴＮ２４６は、物理クエリプラン２４２の有向グラフのリーフノードを指し（したがって、データベースクライアントがシステムに対して発行するＳＱＬクエリにおいて参照可能であるという点で、「データベースクライアントに見える」テンポラルテーブルを指し）、ＤＴＴＮ２４４は、物理クエリプラン２４２の有向グラフのルートノードおよび中間ノードを指す（したがって、「データベースクライアントに見えない」テンポラルテーブルを指す）。一部の実施形態において、ＢＴＴＮおよびＤＴＴＮという用語は、リーフノードであるＰＱＰＮをルートノードまたは中間ノードであるＰＱＰＮから単に区別する（例えば、同一のオブジェクト指向クラスを使用してＢＴＴＮおよびＤＴＴＮを実装する）が、他の実施形態において、ＢＴＴＮおよびＤＴＴＮという用語はまた、（例えば、ＢＴＴＮおよびＤＴＴＮについて異なるオブジェクト指向クラスを使用して）実装の方法を区別する。一実施形態において、ＰＱＰＮの各々は、対応する１つのＢＴＴ２６０または対応する１つのＤＴＴ２６４を位置決めするために使用される参照を含む（例えば、ＰＱＰＮ２５２Ａ〜２５２Ｎの各々はＢＴＴＮであり、対応する１つのＢＴＴ２５４Ａ〜２５４Ｍを位置決めするために使用される参照を含み、ＰＱＰＮ２５０Ａ〜２５０Ｒの各々はＤＴＴＮであり、対応する１つのＤＴＴ２５８Ａ〜２５８Ｒを位置決めするために使用される参照を含む）が、代替実施形態は、これらの対応を別の方法で保存することができる（例えば、１つまたは複数の他のデータ構造を使用してこれらの対応を保存する）。図２に省略記号で示すように、中間ノードおよびルートノードとして機能する多くのＤＴＴＮ２４４（高レベルＤＴＴＮとも称する）が存在することがあると予想される。したがって、ＤＴＴＮ２４４であるＰＱＰＮの各々は、子ノードである１つまたは複数の他のＰＱＰＮのそれぞれに連結する１つまたは複数のエッジを有し、一実施形態において、ＤＴＴＮ２４４であるＰＱＰＮの各々は、１つまたは複数の他のＰＱＰＮを位置決めするために使用される参照を含む（そのような各参照は、ＰＱＰＮから子ノードである１つまたは複数の他のＰＱＰＮのそれぞれへのエッジを形成する）が、代替実施形態は、これらのエッジを別の方法で保存することができる（例えば、１つまたは複数の他のデータ構造を使用してこれらのエッジを保存する）。通常、一部のＰＱＰＮ２５０Ａ〜２５０Ｒは、対応する１つのＰＱＰＮ２５２Ａ〜２５２Ｎ（ＢＴＴＮ）に連結するエッジを有し、一部のＰＱＰＮ２５０Ａ〜２５０Ｒは、１つまたは複数の他のＰＱＰＮ２５０Ａ〜２５０Ｒ（他のＤＴＴＮ）に連結するエッジを有する。ある実施形態はまた、１つまたは複数の他のＤＴＴＮおよび子ノードである１つまたは複数のＢＴＴＮを有するＤＴＴＮをサポートする。
【００４８】
非クエリエグゼキュータ２２８は、ＩＮＳＥＲＴ演算（すなわち、１つまたは複数のデータレコードをテンポラル−リレーショナルデータベースのテンポラルテーブルに挿入する）、ＵＰＤＡＴＥ演算（すなわち、新しいデータレコードを挿入し、修正されたデータレコードのタイムスタンプを変更する（例えば、ｖａｌｉｄ＿ｔｏ列の値を更新時間に設定する）ことにより、テンポラル−リレーショナルデータベースの１つまたは複数のテンポラルテーブルの１つまたは複数のデータレコードのコンテンツを変更する）、ＤＥＬＥＴＥ演算（すなわち、「削除された」データレコードのタイムスタンプを変更する（例えば、ｖａｌｉｄ＿ｔｏ列の値を更新時間に設定する）ことにより、テンポラル−リレーショナルデータベースの１つまたは複数のテンポラルテーブルの１つまたは複数データレコードを削除する）を実行することができ、データレコードの追加、データレコードの削除、および／または既存のデータレコードのコンテンツの変更によりテンポラルテーブルのコンテンツを修正する他の演算を実行してもよく、かつ少なくともＣＲＥＡＴＥ  ＴＡＢＬＥを実行し、テンポラルテーブルのコンテンツではなく、テンポラルテーブル自体（例えば、スキーマ）を変更する他のデータ定義言語（ＤＤＬ）の演算を実行してもよい。ＢＴＴＮ２４６を含む実施形態において、非クエリエグゼキュータ２２８はＢＴＴＮ２５２Ａ〜２５２Ｎとインターフェース接続し、ＢＴＴＮ２５２Ａ〜２５２Ｎは対応する１つのＢＴＴ２５４Ａ〜２５４Ｍにおいてこれらの演算を実行する。
【００４９】
ＢＴＴ２５４からＰＱＰＮ２５２への曲線矢印により示すように、ＰＱＰＮ２５２Ａ〜２５２Ｎの各々は対応するＢＴＴ２５４Ａ〜２５４Ｍにアクセスできる。ＰＱＰＮ２５２Ａ〜２５２Ｎから異なるＰＱＰＮ２５０Ａ〜２５０Ｒへの曲線矢印により示すように、一部のＰＱＰＮ２５０Ａ〜２５０Ｒは、ＰＱＰＮ２５２Ａ〜２５２Ｎが参照するＢＴＴ２５４Ａ〜２５４Ｍにアクセスできる（例えば、ＰＱＰＮ２５０Ａは、ＰＱＰＮ２５２Ａが参照するＢＴＴ２５４Ａにアクセスできる）。高レベルのＰＱＰＮ２５０Ａ〜２５０Ｒは、その子ＰＱＰＮ２５０が参照するＤＴＴ２６４にアクセスできる。したがって、１つのノードを別のノードに連結するエッジは、これらのノードがそれぞれ互いに親ノードおよび子ノードであり、子ノードの結果に親ノードがアクセスできることを表す。一実施形態において、このアクセスは、子ノードがその子ノードのＤＴＴ／ＢＴＴの読取専用ビューまたは読取専用コピーへの参照を親ノードに渡し、その後、親ノードが参照を使用してＴＴから必要なレコード（テンポラルテーブルのデータレコードのすべてではなく一部のみの場合も、テーブル全体の場合もある）にアクセスする形式であるが、代替実施形態は異なって実装することができる（例えば、ＴＴ全体を渡すことができる）。
【００５０】
一実施形態において、ＲＤＢＭＳ演算は、クエリプラン（論理もしくは物理）またはＴＴがメモリに保存されていない（すなわち、物理クエリプラン２４２、ＢＴＴ２６０、およびＤＴＴ２６４が空であるまたはインスタンス化されていない）状態、およびキャッシュ２３４が空であるまたはインスタンス化されていない状態で始まる。ＳＱＬステートメント２１６の１つまたは複数のＣＲＥＡＴＥ  ＴＡＢＬＥステートメントに応答して、１つまたは複数のリーフノード（例えば、ＢＴＴＮ２４６）および対応するＴＴ（例えば、ＢＴＴ２６０）が作成される。第１のＳＱＬクエリを受信したことに応答して、第１の物理クエリプランが生成および実行され、第１のＳＱＬクエリを送信したクライアントにクエリ結果が返される。第１の物理クエリプランの生成は、必要な有向グラフの生成を含み、これは、１つまたは複数の必要な中間ノードおよびルートノード（例えば、ＤＴＴＮ２４４）を作成すること、および必要なエッジを追加することを含む（前述したように、一実施形態において、親ノードとして機能するＰＱＰＮの各々に、その親ノードの子ノードへの参照を保存することによって、これらのエッジを保存することができるが、代替実施形態は、これらのエッジを別の方法で保存することができる（例えば、１つまたは複数の他のデータ構造を使用してこれらのエッジを保存する））。この有向グラフは、実行後に、潜在的な再利用のために少なくともしばらくの間メモリに保存される。さらに、有向グラフのノードの各々について、キャッシュ２３４にノードキーおよびノード参照ペアが入力される（ノードキーはノード参照に関連付けられる）。第１の物理クエリプランの実行は、有向グラフのノード（ＤＴＴＮ２４４）の各々により特定されたクエリプラン演算を実行することを含み、これは、いずれかの子ノードのＴＴにアクセスすること、クエリプラン演算を実行すること、各ノードの対応するＴＴ（例えば、１つのＤＴＴ２６４）を入力することを含む。有向グラフのルートノードが参照するＴＴ（例えば、１つのＤＴＴ２６４）を使用して、クエリ結果を提供する。
【００５１】
この例を続けると、第２のＳＱＬクエリを受信したことに応答して、第２の物理クエリプランが生成および実行され、第２のＳＱＬクエリを送信したクライアントにクエリ結果が返される。しかしながら、第２の物理クエリプランの生成は、第１の物理クエリプランに既に存在し、かつ同一であるため共有可能な１つまたは複数のノード（および場合により、ノードおよびエッジの１つまたは複数のサブグラフ）を作成する必要がない。第２のクエリプランの生成は、第１の物理クエリプランから同一である１つまたは複数のノード（および場合により、１つまたは複数のサブグラフ）を再利用する（「組み込む」とも称する）。図２を参照すると、クエリプランコネクタ２３２は、実行後に現在メモリに保存されている物理クエリプラン２４２に既に存在する１つまたは複数のノードおよび／またはサブグラフ（ならびに、一部の実施形態において、有向グラフ全体）を再利用する／組み込むことにより、必要な第２の物理クエリプランを生成することができるかどうかを判定する。クエリプランコネクタ２３２が再利用／組込みが可能であると判定した場合には、第２の物理クエリプランの欠けている部分（ノードおよびエッジ、サブグラフなど）のみが物理クエリプラン２４２に追加され、１つまたは複数のエッジにより、再利用可能であると判定された１つまたは複数のノードおよび／またはサブグラフ（ならびに、一部の実施形態において、有向グラフ全体）に連結される。前述したように、一実施形態において、クエリプランコネクタ２３２は、第２のＳＱＬクエリの論理クエリプランおよび（第１の物理クエリプランの生成に応答して先に入力された）キャッシュ２３４のノードキーを使用する。そのような再利用／組込みが実行されると、第１のＳＱＬクエリおよび第２のＳＱＬクエリは、有向グラフの各々がそのエッジのうちの少なくとも１つにより他の有向グラフの少なくとも１つのノードに連結されて、それらの有向グラフが少なくとも１つのノードを共有するようになっている。したがって、クエリプランは、少なくとも１つのノードを共有し、より多く（例えば、２つ以上のノードおよび１つまたは複数のエッジのサブグラフ）を共有することができるという点で連結される（「重複する」とも称する）。一方、クエリプランコネクタ２３２が再利用／組込みが不可能であると判定した場合には、第２の物理クエリプランの有向グラフのノードおよびエッジが物理クエリプラン２４２に追加される。
【００５２】
前述したように、物理クエリプランによりノード（中間ノードおよび場合によりルートノードを含む）を共有すること、ならびに物理クエリプランおよびテンポラルテーブル（特に、クエリプラン演算子を実行する有向グラフの各々のノードにより入力されたＴＴ（例えば、ＤＴＴＮ２４４が参照するＤＴＴ２６４））をメモリに保存することにより、一部の実施形態は、大量のデータを扱うときを含む、略リアルタイムのストリーミングの実行をサポートすることができる。再び、これは、一部には以下の理由による。１）実行後に物理クエリプランをメモリに保存し、これらのクエリプランにノードを共有させ（可能であれば）、したがってそれらの共有されたノードが特定するテンポラルテーブルを共有させ、必要なメモリ、計算リソース、および計算時間を減少させる、２）テンポラルテーブルを使用すること、およびテンポラルテーブルをメモリに保存することにより、ある実施形態は、１つまたは複数のクエリプラン演算子を実装して、「増分実行」（「差分」のみで実行、「増分クエリ処理」および「増分再計算」とも称する）を行い、それらのクエリプラン演算子を表すノードにより特定されたテンポラルテーブルを必要に応じて増分更新する（増分実行により、クエリプラン演算子へのテンポラルテーブル入力の各々の全体におけるクエリプラン演算子の再実行／再計算（本明細書において「完全再実行」と称する）と比較して、必要な計算リソースおよび計算時間が減少する）。したがって、加えてまたはあるいは、一実施形態において、第２のクエリプランの生成および実行は、少なくとも、第１のクエリプランの有向グラフに存在し、かつ第２のクエリプランの有向グラフによって共有された１つのノードにより表されたクエリプラン演算子を増分実行することを含むことができる。
【００５３】
図２のＰＣＣＭ２１４、パーサ２１８、クエリリライタ２２４、クエリオプティマイザ２３０、クエリエグゼキュータ２４０、および非クエリエグゼキュータ２２８の間の矢印線は、データフローおよび／または接続などの何らかのタイプの結合を表す。例えば、一部の実施形態において、ＰＣＣＭ２１４は、パーサ２１８、クエリリライタ２２４、クエリオプティマイザ２３０、クエリエグゼキュータ２４０、および非クエリエグゼキュータ２２８の各々を、ＳＱＬステートメント２１６の実行を調整するように呼び出し、したがって、矢印線は、例えば、パーサ２１８がクエリリライタ２２４を呼び出すのとは対照的に順序を表す。
【００５４】
前述したように、異なる実施形態は、異なる技術を使用して、クエリプランのノードの各々およびＴＴの各々が実行後にどのくらい長くメモリに保存されるかを判定することができる。一実施形態において、「アクティブ」または「非アクティブ」の特定は、クエリプランの各々について維持され（例えば、特定はクエリプランの各々の有向グラフのルートノードに関連付けることができる）、「アクティブ」クエリプランの一部ではないノード（およびノードが参照するＴＴ）は、メモリへの保存から除去される候補である。特定の例により、Ｊａｖａ  Ｄｅｖｅｌｏｐｍｅｎｔ  Ｋｉｔ（ＪＤＫ）は、「弱参照」ジェネリックタイプを提供する。このタイプのインスタンスにより、ベースとなるオブジェクトのメモリを、Ｊａｖａ仮想マシンのガベージコレクタにより、デフォルトのＪａｖａ参照（「強参照」と称する）を使用する場合よりも、積極的に解放することができる。Ｊａｖａで実装された一実施形態において、キャッシュ２３４におけるルートノードおよびリーフノードへの参照は強参照タイプであり、キャッシュ２３４における中間ノードへの参照は弱参照タイプであり、キャッシュ２３４において所与のルートノードが解放されると、Ｊａｖａ仮想マシンのガベージコレクタは、そのルートノードから延びる有向グラフにより消費されたメモリを解放することができる。したがって、キャッシュ２３４におけるルートノードへの強参照は、それらのルートノードから始まるクエリプランが「アクティブ」であり、そのようなルートノードが解放されると、そのルートノードで始まるクエリプランが「非アクティブ」に切り替わることを示す。
【００５５】
実施例
図３Ａは、一実施形態による、時間Ｔ＝０における「ＣＵＳＴＯＭＥＲＳ」と名付けた例示的なテンポラルテーブルを示す図である。図３Ｂは、一実施形態による、時間Ｔ＝０における「ＯＲＤＥＲＳ」と名付けた例示的なテンポラルテーブルを示す図である。図３Ａ、図３Ｂのテンポラルテーブルは、各フィールドが、対応するデータレコードが有効な最も早い時間に対応するｖａｌｉｄ＿ｆｒｏｍ列（ｖａｌｉｄ＿ｆｒｏｍタイムスタンプと称することもできる）と、各フィールドが、データレコードが有効な（かつ時間が未知の場合に無限大（ＩＮＦ）に設定される）最も遅い時間に対応するｖａｌｉｄ＿ｔｏ列（ｖａｌｉｄ＿ｔｏタイムスタンプと称することもできる）とを含む。前述したように、本明細書において、前記論理ビューに関して、かつ（当技術分野で時々使用されるように）ｖａｌｉｄ＿ｔｏ列およびｖａｌｉｄ＿ｆｒｏｍ列という用語を使用して実施形態について説明するが、代替実施形態は、テンポラルテーブルを異なって実装してもよい（例えば、テンポラルテーブルのコンテンツを異なる方法で保存する（例えば、行指向構成を使用して、列指向構成を使用して、１つまたは複数のテンポラルテーブルの行指向構成および列指向構成の両方を使用して、１つまたは複数のテンポラルテーブルの行指向構成および１つまたは複数の他のテンポラルテーブルの列指向構成を使用してなどにより、コンテンツを保存することができる）、データレコードのタイムスタンプ情報を別の方法で（例えば、より多いまたは少ないフィールドを使用して）保存する、異なる用語によりタイムスタンプ情報を参照するなど）。
【００５６】
図３Ａでは、他の列は、「ＣｕｓｔｏｍｅｒＩＤ」、「Ｎａｍｅ」、および「ＰｏｓｔａｌＣｏｄｅ」と名付けられている。図３Ｂでは、他の列は、「ＯｒｄｅｒＩＤ」「ＣｕｓｔｏｍｅｒＩＤ」「Ｐｒｉｃｅ」、および「Ｑｕａｎｔｉｔｙ」と名付けられている。「ＣｕｓｔｏｍｅｒＩＤ」が両方のテンポラルテーブルに見られるため、当技術分野で公知のように、ＣｕｓｔｏｍｅｒＩＤは２つのテンポラルテーブルを関連付けるキーとして働くことができる。時間Ｔ＝０において、各テンポラルテーブルのコンテンツは２つのデータレコードを含む。
【００５７】
図３Ｃは、一実施形態による例示的なＳＱＬクエリを示す。詳細には、例示的なＳＱＬクエリ３１０は、「ｓｅｌｅｃｔ＊ｆｒｏｍ  ＣＵＳＴＯＭＥＲＳ，  ＯＲＤＥＲＳ  ｗｈｅｒｅ  ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ＝ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ  ａｎｄ  ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１  ａｎｄ  ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４」である。
【００５８】
図４は、一実施形態による、例示的なＳＱＬクエリ３１０の異なる部分と、例示的なテキスト表現４４０を介した例示的な論理クエリプラン４６４との関係を示す図である。図４は、例示的なＳＱＬクエリ３１０を以下の通り別々の要素として示す。「ｓｅｌｅｃｔ」４０２、「＊」４０４、「ｆｒｏｍ」４０６、「ＣＵＳＴＯＭＥＲＳ」４０８、「ＯＲＤＥＲＳ」４１０、「ｗｈｅｒｅ」４１２、「ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ」４１４、「＝」４１６、「ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ」４１８、「ａｎｄ」４２０、「ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ」４２２、「＝」４２４、「１０００１」４２６、「ａｎｄ」４２８、「ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ」４３０、「＞」４３２、および「４」４３４。
【００５９】
前述したように、一部の実施形態は論理クエリプランを生成する。一実施形態において、ＳＱＬクエリ（例えば、例示的なＳＱＬクエリ３１０）の論理クエリプラン（例えば、例示的な論理クエリプラン４６４）は、当技術分野で公知のように、ノード（本明細書において「論理クエリプランノード」（ＬＱＰＮ）と称する）およびそれらのノードを連結するエッジからなる有向グラフである。有向グラフは、ルート論理クエリプランノード（例えば、ルートＬＱＰＮ４７０Ａ）から始まり、０以上の中間ＬＱＰＮ（例えば、中間ＬＱＰＮ４７０Ｂ〜４７０Ｄ）を含み、１つまたは複数のリーフＬＱＰＮ（例えば、リーフＬＱＰＮ４７０Ｅ〜４７０Ｆ）で終わる。
【００６０】
例示的なテキスト表現４４０（人間が読める形式の例示的なクエリプランを形成するために文字列として書き出された例示的なＳＱＬクエリプラン３１０のノードである）は、説明のためのものであり、ある実施形態によっては生成する必要がない。さらに、代替実施形態は、例示的なＳＱＬクエリ３１０について、例示的なテキスト表現４４０により表されたものとは異なるクエリプランを生成することができる。
【００６１】
例示的なテキスト表現４４０は、複数のタイプの「クエリプラン演算子」（例えば、ＰＲＯＪＥＣＴ、ＳＥＬＥＣＴ、ＪＯＩＮ、およびＴＡＢＬＥ）ならびにそれらの「パラメータ」を含む。各ＬＱＰＮ４７０Ａ〜４７０Ｆの「クエリプラン演算子タイプ」（または「演算子タイプ」）は、ＬＱＰＮが特定可能な複数のタイプのクエリプラン演算子のうちの特定の１つを特定する。一部の実施形態は、１つまたは複数のクエリプラン演算子について複数の異なる実装を有し、一部のそのような実施形態は、「演算子タイプ」が特定の１つのクエリプラン演算子およびそのクエリプラン演算子の特定の１つの実装を特定するように構成することができ、他のそのような実施形態は、「演算子タイプ」が特定の実装を参照することなく特定の１つのクエリプラン演算子を特定するように構成することができる。ＰＲＯＪＥＣＴおよびＴＡＢＬＥの両方のクエリプラン演算子は、それらが作用するテンポラルテーブル（入力テンポラルテーブル）のデータレコードを効果的に返す。
【００６２】
例示的なＳＱＬクエリ３１０の「ｆｒｏｍ」４０６句のテンポラルテーブル「ＣＵＳＴＯＭＥＲＳ」４０８および「ＯＲＤＥＲＳ」４１０は、例示的なテキスト表現４４０の「ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ）」４５６および「ＴＡＢＬＥ（ＯＲＤＥＲＳ）」４４８をそれぞれ表すＬＱＰＮ４７０ＦおよびＬＱＰＮ４７０Ｅにそれぞれマッピングされる。
【００６３】
比較述語は、テンポラルテーブル（例えば、「ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ」４３０）の列への参照、比較演算子（例えば、＝、＞、＜）、およびテーブルの列への別の参照、直定数（例えば、「４」４３４）、または式（例えば、「１０００１＋１」）の組合せである。一実施形態において、比較述語が「＜列参照＞＜比較演算＞＜直定数＞」の形式である場合には、比較述語はＳＥＬＥＣＴにマッピングされる。これは、ＬＱＰＮ４７０ＣおよびＬＱＰＮ４７０Ｄにそれぞれマッピングされている比較述語「ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４」４８０および比較述語「ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１」４８２を含み、ＬＱＰＮ４７０Ｃは、その子ＬＱＰＮ４７０Ｅ（「ＴＡＢＬＥ（ＯＲＤＥＲＳ）」４４８を実行する）の結果の「ＳＥＬＥＣＴ（」４４６および比較述語「，ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４）」４５０（演算４９０）を表し、ＬＱＰＮ４７０Ｄは、その子ＬＱＰＮ４７０Ｆ（「ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲ）」４５６を実行する）の結果の「ＳＥＬＥＣＴ（」４５４および比較述語「，ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１」４５８（演算４９２）を表す。
【００６４】
一実施形態において、比較述語が「＜列参照＞＝＜列参照＞」の形式である場合には、比較述語はＪＯＩＮにマッピングされる。これは、ＬＱＰＮ４７０Ｂにマッピングされている比較述語「ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ＝ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ」４８４を含み、ＬＱＰＮ４７０Ｂは、その子ＬＱＰＮ４７０Ｃ、４７０Ｄ（それぞれ「ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＯＲＤＥＲＳ），ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４）およびＳＥＬＥＣＴ（ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ），ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１）」を実行する）の結果の「ＪＯＩＮ（」４４４および比較述語４６０（４８６を付した「ｗｈｅｒｅ」４１２句を完成させる演算４９６）を表す。図示した例は、ＪＯＩＮが比較述語「ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ＝ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ」４６０および２つのＳＥＬＥＣＴ演算（４９０、４９２）の結果に作用するように最適化されているが、代替実施形態は、異なって最適化されていても、まったく最適化されていなくてもよい。
【００６５】
ＳＥＬＥＣＴステートメント（「ｓｅｌｅｃｔ」４０２および「＊」４０４を含む）がＬＱＰＮ４７０Ａにマッピングされ、ＬＱＰＮ４７０Ａは、その子ＬＱＰＮＢ（「ＪＯＩＮ（ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＯＲＤＥＲＳ），ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４），ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ），ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１），ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ＝ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ」を実行する）、および列の一覧「ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ，ＣＵＳＴＯＭＥＲＳ．Ｎａｍｅ，ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ，ＯＲＤＥＲＳ．ＯｒｄｅｒＩＤ，ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ，ＯＲＤＥＲＳ．Ｐｒｉｃｅ，ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ）」４６２（演算４９８）の結果において、「ＰＲＯＪＥＣＴ）」４４２を表す。
【００６６】
本明細書において、「パラメータ」という用語は、「演算子タイプ」（例えば、「ＯＲＤＥＲＳ」または「ＣＵＳＴＯＭＥＲＳ」のようなテーブル参照、「ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４」、「ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１」、または「ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ＝ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ」のような比較述語、「ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ，ＣＵＳＴＯＭＥＲＳ．Ｎａｍｅ，ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ、ＯＲＤＥＲＳ．ＯｒｄｅｒＩＤ，ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ，ＯＲＤＥＲＳ．Ｐｒｉｃｅ，ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ」のような列の一覧など）に対応する演算を実行するのに必要な追加の情報を指すために使用される。
【００６７】
一実施形態において、ＬＱＰＮ４７０Ａ〜４７０Ｆの各々にデータ構造が実装され、このデータ構造は、１）いずれかの子ノード（例えば、ＬＱＰＮ４７０Ｂの子ノードはＬＱＰＮ４７０ＣおよびＬＱＰＮ４７０Ｄである）への参照を保存する「子参照フィールド」、ならびに２）演算の演算子タイプおよびその１つまたは複数のパラメータを保存する１つまたは複数の「記述子フィールド」のセットを含む。一実施形態において、１）演算子タイプの表示を保存する「演算子タイプフィールド」、および２）パラメータを保存する「他のパラメータフィールド」の２つの記述子フィールドがある。別の実施形態において、ＬＱＰＮ４７０Ａ〜４７０Ｆの各々は、演算子タイプおよびその１つまたは複数のパラメータを含むノードキー全体を保存する記述子フィールドを実装する。一部の実施形態は、論理クエリプランを「軽量グラフ」（すなわち、クエリプランを表すための最小の情報を含むグラフ）として実装する。軽量グラフは、物理クエリプランの生成を容易にするために生成される。代替実施形態は、論理クエリプランのより多い、少ない、および／または異なる情報を含んでもよく、かつ／または論理クエリプランを生成しなくてもよい。
【００６８】
図５Ａは、一実施形態による、例示的なテキスト表現４４０の異なる部分と例示的な物理クエリプランとの関係を示す図である。図５Ａは、図２の物理クエリプラン２４２およびベーステンポラルテーブル２６０、ならびに例示的なテキスト表現４４０および図４の演算４９０、４９２、４９６、４９８を特定するラベルを再現する。図４に関し、例示的なテキスト表現４４０（人間が読める形式の例示的なクエリプランを形成するために文字列として書き出された例示的なクエリプランのノードである）は、説明のためのものであり、ある実施形態によっては生成する必要がない。さらに、代替実施形態は、例示的なＳＱＬクエリ３１０について、例示的なテキスト表現４４０により表されたものとは異なるクエリプランを生成することができる。例示的なテキスト表現４４０および異なる演算４９０、４９２、４９８は、実行時にＰＱＰＮ５７０Ａ〜５７０Ｆの各々が実行するクエリプラン演算（演算子タイプおよびパラメータを含む）を特定するように示される。各ＰＱＰＮ５７０Ａ〜５７０Ｆの「演算子タイプ」は、そのＰＱＰＮが実行する複数のタイプのクエリプラン演算子のうちの特定の１つを特定する。再び、一部の実施形態は、１つまたは複数のクエリプラン演算子について異なる実装を有し、一部のそのような実施形態は、「演算子タイプ」が特定の１つのクエリプラン演算子およびそのクエリプラン演算子の特定の１つの実装を特定するように構成することができ、他のそのような実施形態は、「演算子タイプ」が特定の実装を参照することなく特定の１つのクエリプラン演算子を特定するように構成することができる。
【００６９】
前述したように、一実施形態において、演算は、クエリプラン（論理もしくは物理）またはＴＴがメモリに保存されていない（物理クエリプラン２４２、ＢＴＴ２６０、およびＤＴＴ２６４が空である）状態、およびキャッシュ２３４が空である状態で始まる。例として、ＳＱＬステートメント（２つのＣＲＥＡＴＥ  ＴＡＢＬＥ  ＳＱＬステートメントおよび２つのＩＮＳＥＲＴ  ＳＱＬステートメントを含む）に応答して、ＢＴＴ作成および入力５０２が行われることにより、１）リーフＰＱＰＮ５７０Ｅおよび対応するＢＴＴ５５４Ａが作成され、２）リーフＰＱＰＮ５７０Ｆおよび対応するＢＴＴ５５４Ｂが作成される。図２の実施形態において、キャッシュ２３４のＰＱＰＮ５７０ＥおよびＰＱＰＮ５７０Ｆの各々についてエントリが作成される。
【００７０】
例示的なＳＱＬクエリ３１０を受信したことに応答して、５０４で例示的な物理クエリプラン５６４が生成される。例示的な物理クエリプラン５６４を生成することは、１つまたは複数の必要な中間ノードおよびルートノード（ＰＱＰＮ５７０Ａ〜５７０Ｄ）を作成すること、ならびに必要なエッジを追加してそれらのノードを適切に連結し、有向グラフを形成すること（エッジをリーフＰＱＰＮ５７０Ｅ〜５７０Ｆに追加することを含む）を含む。この例では、ＰＱＰＮ５７０ＥおよびＰＱＰＮ５７０Ｆが既に物理クエリプラン２４２に存在し、これらを物理クエリプラン５６４に組み込むことができると判定され、また、ＰＱＰＮ５７０Ａ〜５７０Ｄを物理クエリプラン２４２に追加し、１つまたは複数のエッジによりＰＱＰＮ５７０ＥおよびＰＱＰＮ５７０Ｆに連結して、有向グラフを形成しなければならないと判定される。図２の実施形態において、これらの判定は、キャッシュ２３４にキャッシュヒットがあるかどうかを判定することにより行われる。
【００７１】
論理クエリプラン（例えば、例示的な論理クエリプラン４６４）を最初に実装する実施形態において、論理クエリプランは有向グラフを表すことができ、この有向グラフは、物理クエリプラン（例えば、物理クエリプラン５６４は、同一の演算（演算子タイプおよびパラメータ）を担い、かつ同一数のエッジにより連結される同一数のノードを有して、例示的な論理クエリプラン４６４と同一の形状を形成し、したがって、ＰＱＰＮ５７０Ａ〜５７０Ｆの同一文字のノードはＬＱＰＮ４７０Ａ〜４７０Ｆの同一文字のノードに対応する）として生成され、実行後に現在メモリに保存されている物理クエリプラン２４２に既に存在する１つまたは複数のノードおよび／またはサブグラフ（ならびに、一部の実施形態において、有向グラフ全体）を再利用するまたは組み込むことにより、必要な物理クエリプランを生成することができるかどうかを判定するために使用される。例において、ＬＱＰＮ４７０ＥおよびＬＱＰＮ４７０Ｆを、物理クエリプラン２４２に既に存在するＰＱＰＮ５７０ＥおよびＰＱＰＮ５７０Ｆによりそれぞれ実行することができ、したがって物理クエリプラン５６４に組み込むことができると判定され、また、ＰＱＰＮ５７０Ａ〜５７０Ｄを物理クエリプラン２４２に追加し、再利用可能であると判定されたＰＱＰＮ５７０ＥおよびＰＱＰＮ５７０Ｆにエッジにより連結しなければならないと判定される。論理クエリプランを最初に生成しキャッシュ２３４を使用する実施形態において、これらの判定は、論理クエリプランの有向グラフをベースにして、ノードキーが、１つまたは複数のノードおよび／またはサブグラフ（ならびに、一部の実施形態において、有向グラフ全体）についてキャッシュ２３４に既に存在するかどうかを判定することにより行われ、物理クエリプラン２４２にまだ存在しないＰＱＰＮおよびエッジのみが作成される。
【００７２】
本明細書で使用されるとき、「クエリプラン」という用語は、「論理クエリプラン」または「物理クエリプラン」を指すことができ、「ノード」または「クエリプランノード」（ＱＰＮ）という用語は、「ＬＱＰＮ」または「ＰＱＰＮ」を指すことができる。
【００７３】
図５Ｂは、一実施形態による例示的な物理クエリプラン５６４の実行を示す図である。図５Ｂは、図２の物理クエリプラン２４２、ベーステンポラルテーブル２６０、および派生テンポラルテーブル２６４、ならびに図５Ａの例示的な物理クエリプラン５６４（ＰＱＰＮ５７０Ａ〜５７０Ｆからなる有向グラフを含む）およびＢＴＴ５５４Ａ、５５４Ｂを再現する。前述したように、各固有のクエリのクエリプランは、ルートノード（例えば、ＰＱＰＮ５７０Ａ）で始まり、０以上のレベルの中間ノード（例えば、ＰＱＰＮ５７０Ｂ〜５７０Ｄ）を含み、１つまたは複数のリーフノード（例えば、ＰＱＰＮ５７０Ｅ、５７０Ｆ）で終わる有向グラフからなる。実行中、ルートノードからリーフノードへ再帰呼出しが行われ、この実行の結果として生成されたデータがリーフノードから中間ノードを通ってルートノードへ流れ（曲線矢印により示す）、したがって、実行により、データがリーフからルートへ流れる。一実施形態において、ルートノード（ＰＱＰＮ５７０Ａ）に対して呼出しを行ってそのクエリプラン演算を実行することにより、ルートノードの子ノード（例えば、ＰＱＰＮ５７０Ｂ）を呼び出すなど、リーフノードまで再帰的に呼び出す（例えば、ＰＱＰＮ５７０ＢはＰＱＰＮ５７０Ｃ、５７０Ｄを呼び出し、ＰＱＰＮ５７０ＣはＰＱＰＮ５７０Ｅを呼び出し、ＰＱＰＮ５７０ＤはＰＱＰＮ５７０Ｆを呼び出す）。所与のノードの実行が完了すると、結果がその親ノード（あれば）に提供される。所与の親ノードのすべての子ノードが実行を完了し、その結果をその所与の親ノードに提供したときには、その親ノードが実行してその結果をその親ノード（あれば）に提供する。
【００７４】
ルートおよび中間ＰＱＰＮ５７０Ａ〜５７０Ｄの各々は、潜在的な再利用のために保存された派生テンポラルテーブル２６４においてＤＴＴ５５８Ａ〜５５８Ｄを特定する。ルートおよび中間ＰＱＰＮ５７０Ａ〜５７０Ｄの各々が実行されると、ＰＱＰＮが特定するＤＴＴ５５８Ａ〜５５８Ｄの対応する１つを更新する。クエリ結果は、ルートＰＱＰＮ５７０Ａにより特定されたＤＴＴ５８８Ａから生成される。
【００７５】
一実施形態において、ＢＴＴ２６０およびＤＴＴ２６４はＴＴクラスのオブジェクトであり、ＴＴクラスのオブジェクトは、１）テンポラルテーブルのデータレコードのデータ、および２）そのＴＴからデータレコードにアクセスする１つまたは複数のメソッドを含む。一実施形態において、各ＰＱＰＮは、１）テンポラルテーブル（例えば、ＢＴＴまたはＤＴＴを特定する参照を有する）を特定する、２）クエリプラン演算子およびその１つまたは複数のパラメータ（例えば、ＴＡＢＬＥ（ＯＲＤＥＲＳ）、ＴＡＢＬＥはクエリプラン演算子であり、ＯＲＤＥＲＳはそのパラメータである）により特定されたクエリプラン演算を実行し、特定されたテンポラルテーブルのデータレコードを返す（例えば、特定されたテンポラルテーブルのデータレコードにアクセスするために親ノードが使用することのできる、特定されたＢＴＴまたはＤＴＴに参照を返す）Ｅｖａｌｕａｔｅメソッドを含む。コピーの作成には費用がかかる（特に大きいテーブルの場合）ことがあるため、ＰＱＰＮにより特定されたＤＴＴ／ＢＴＴの読取専用ビューまたは読取専用コピーへの参照を、そのＰＱＰＮのＥｖａｌｕａｔｅメソッドにより返して、そのメソッドを呼び出した呼出し元（例えば、親ノード）が、その後、返されたＴＴから必要なレコードにアクセスできるようにする（場合により増分のみ、他の場合にはテーブル全体）。
【００７６】
物理クエリプラン２４２のノードが「テンポラルテーブルノード」（ＴＴＮ）として実装され、図２を参照して説明した派生テンポラルテーブルノード（ＤＴＴＮ）２４４およびベーステンポラルテーブルノード（ＢＴＴＮ）２４６として分類可能な実施形態において、ＰＱＰＮ５７０Ａ〜５７０ＤはＤＴＴＮ２４４として実装され、ＰＱＰＮ５７０Ｅ、５７０ＦはＢＴＴＮ２４６として実装される。言い換えると、ＤＴＴＮ２４４は、物理クエリプラン２４２の有向グラフのルートノードおよび中間ノードを含み、ＢＴＴＮ２４６は物理クエリプラン２４２の有向グラフのリーフノードを含む。一実施形態において、ＤＴＴＮ２４４およびＢＴＴＮ２４６は、それぞれＤＴＴＮクラスおよびＢＴＴＮクラスのオブジェクトであり、両クラスは、１）ＴＴ参照フィールド、および２）Ｅｖａｌｕａｔｅメソッド（それぞれＤＴＴＮ．ＥｖａｌｕａｔｅおよびＢＴＴＮ．Ｅｖａｌｕａｔｅと称する）を含む。親ノードは、子ノードのＥｖａｌｕａｔｅメソッドを呼び出し、子ノードのＥｖａｌｕａｔｅメソッドは、その子ノードにより特定されたＤＴＴ２６４またはＢＴＴ２６０の一方の読取専用ビューまたは読取専用コピーへの参照を返し、その後、親ノードはそのＤＴＴまたはＢＴＴのメソッドを呼び出して、ＤＴＴまたはＢＴＴによりカプセル化されたテンポラルテーブルのデータレコード（一部のクエリプラン演算についてはすべてのデータレコード、その他については最新の更新以後の差分であってよい）にアクセスすることができる。ＤＴＴＮクラスのインスタンスのＤＴＴＮ．Ｅｖａｌｕａｔｅメソッドの実行は、そのノードのクエリプラン演算を実行し、そのＤＴＴＮのＴＴ参照フィールドにより特定されたＤＴＴのうちの１つに結果を保存し、そのＤＴＴの読取専用ビューまたは読取専用コピーへの参照を返す。ＢＴＴＮクラスのインスタンスのＢＴＴＮ．Ｅｖａｌｕａｔｅメソッドの実行は、そのＢＴＴＮが参照したＢＴＴ２６０のうちの１つの読取専用ビューまたは読取専用コピーへの参照を返す。したがって、ＰＱＰＮ５７０Ａを実装するＤＴＴＮのＤＴＴＮ．Ｅｖａｌｕａｔｅメソッドの実行は、１）ＤＴＴ５５８Ｂの読取専用ビューまたは読取専用コピーを返す子ＤＴＴＮ（ＰＱＰＮ５７０Ｂ）のＤＴＴＮ．Ｅｖａｌｕａｔｅメソッドへの呼出し、およびその後の、演算への入力としてのＤＴＴ５５８Ｂのデータレコードにアクセスするメソッドへの呼出し、２）適切なクエリプラン演算の実行、３）ＴＴ参照フィールドにより特定されたＤＴＴ５５８Ａへの、そのクエリプラン演算の結果の保存、ならびに４）ＤＴＴ５５８Ａの読取専用ビューまたは読取専用コピーへの参照の返しを含む。ＰＱＰＮ５７０Ｂを実装するＤＴＴＮのＤＴＴＮ．Ｅｖａｌｕａｔｅメソッドの実行は、１）ＤＴＴ５５８Ｃ〜５５８Ｄの読取専用ビューまたは読取専用コピーを返す子ＤＴＴＮ（ＰＱＰＮ５７０Ｃ〜５７０Ｄ）のＤＴＴＮ．Ｅｖａｌｕａｔｅメソッドへの呼出し、およびその後の、演算への入力としてのＤＴＴ５５８Ｃ〜５５８Ｄのデータレコードにアクセスするメソッドへの呼出し、２）適切なクエリプラン演算の実行、３）ＴＴ参照フィールドにより特定されたＤＴＴ５５８Ｂへの、そのクエリプラン演算の結果の保存、ならびに４）ＤＴＴ５５８Ｂの読取専用ビューまたは読取専用コピーへの参照の返しを含む。最低レベルのＤＴＴＮ（例えば、ＰＱＰＮ５７０Ｃ、５７０Ｄ）の各々のＤＴＴＮ．Ｅｖａｌｕａｔｅメソッドの実行は、１）ＢＴＴＮ（例えば、ＢＴＴ５５４Ａ）が参照したＢＴＴの読取専用ビューまたは読取専用コピーを返すＤＴＴＮ（例えば、ＰＱＰＮ５７０Ｅ）が参照したＢＴＴＮのＢＴＴＮ．Ｅｖａｌｕａｔｅメソッドへの呼出し、およびその後の、そのＢＴＴ（例えば、ＢＴＴ５５４Ａ）のデータレコードにアクセスするメソッドへの呼出し、２）適切なクエリプラン演算の実行、３）ＴＴ参照フィールド（例えば、ＤＴＴ５５８Ｃ）により特定されたＤＴＴ２６４のうちの１つへの、そのクエリプラン演算の結果の保存、４）そのＤＴＴ（例えば、ＤＴＴ５５８Ｃ）の読取専用ビューまたは読取専用コピーへの参照の返しを含む。有向グラフの構造がどのノードを並行して実行することができるか（例えば、親ノードの子ノード）を示していることが、当業者に明らかであろう。例示の目的で、物理クエリプラン２４２のノードをＴＴＮ（より詳細には、ＤＴＴＮ２４４およびＢＴＴＮ２４６）として実装する一実施形態について説明したが、代替実施形態は、物理クエリプラン２４２のノードを異なって実装してもよい。
【００７７】
図６は、一実施形態による例示的な重複物理クエリプランを示す。図６は、例示的なＳＱＬクエリ３１０、例示的なテキスト表現４４０、物理クエリプラン２４２における物理クエリプラン５６４（ＰＱＰＮ５７０Ａ〜５７０Ｆを含む）、およびベーステンポラルテーブル２６０におけるＢＴＴ５５４Ａ〜５５４Ｂを示す。図６はまた、一実施形態による、追加の例示的なＳＱＬクエリ、それらのＳＱＬクエリのクエリプランの例示的なテキスト表現、およびそれらのＳＱＬクエリの例示的な物理クエリプランを示す。追加の例示的なＳＱＬクエリ６０２、６０４、６０６、６０８の各々について、図６は、例示的なＳＱＬクエリ３１０と同一のＳＱＬクエリの部分、および異なる部分の省略記号を示す（例えば、追加の例示的なＳＱＬクエリ６０２は、「ｓｅｌｅｃｔ＊ｆｒｏｍ…，ＯＲＤＥＲＳ，…ｗｈｅｒｅ…」として示される）。加えて、図６は、追加の例示的なＳＱＬクエリ６０２、６０４、６０６、６０８のそれぞれの例示的なテキスト表現６１２、６１４、６１６、６１８を示す。例示的なテキスト表現６１２、６１４、６１６、６１８の各々について、図６は、例示的なテキスト表現４４０と同一のテキスト表現の部分、および異なる部分の省略記号を示す（例えば、例示的なテキスト表現６１２は、「ＰＲＯＪＥＣＴ（…ＴＡＢＬＥ（ＯＲＤＥＲＳ）…）」として示される）。
【００７８】
加えて、図６は、例示的なテキスト表現６１２、６１４、６１６、６１８の各々について、それぞれの物理クエリプラン６２２、６２４、６２６、６２８の各々の一部を示す。図示したそれぞれの物理クエリプラン６２２、６２４、６２６、６２８の各々の一部は、１）物理クエリプラン５６４と共有される第１のサブパート（ノードまたはサブグラフ）、および２）共有されないが、１つのエッジにより第１のサブパートに連結された少なくとも１つのノードを含む第２のサブパートを含む。したがって、図６は、物理クエリプラン５６４、６２２、６２４、６２６、６２８の有向グラフが、少なくとも１つのノード、ならびに場合により、２つ以上のノードおよび１つまたは複数のエッジのサブグラフを共有するという点で連結される（「重複する」とも称する）ことを示す。例えば、物理クエリプラン６２２は、ＰＱＰＮ５７０Ｅを子ノードとして有する（ＰＱＰＮ６７０ＡをＰＱＰＮ５７０Ｅに連結するするエッジが存在する）ＰＱＰＮ６７０Ａ（共有されない）を含み、したがって、ＰＱＰＮ５７０Ｅは、物理クエリプラン６２２と物理クエリプラン５６４との間で共有されるノード（リーフノード）である。物理クエリプラン６２８は、ＰＱＰＮ５７０Ｂ（中間ノード）を子ノードとして有するＰＱＰＮ６７０Ｆ（共有されないルートノード）を含み、したがって、ＰＱＰＮ５７０Ｂ〜５７０Ｆのサブグラフ（すなわち、ＰＱＰＮ５７０Ｂおよびその子孫ノード、すなわちＰＱＰＮ５７０Ｂ、ＰＱＰＮ５７０Ｃ、５７０Ｄ、およびＰＱＰＮ５７０Ｅ、５７０Ｆのサブグラフ）は、物理クエリプラン６２８と物理クエリプラン５６４との間で共有されるサブグラフである。物理クエリプラン６２４は、ＰＱＰＮ６７０Ｃ（共有されない）およびＰＱＰＮ５７０Ｃ（中間ノード）を子ノードとして有するＰＱＰＮ６７０Ｂ（共有されない）を含み、したがって、ＰＱＰＮ５７０Ｃ〜５７０Ｅのサブグラフは、物理クエリプラン６２４と物理クエリプラン５６４との間で共有されるサブグラフである。物理クエリプラン６２６は、ＰＱＰＮ６７０Ｅ（共有されない）およびＰＱＰＮ５７０Ｂ（中間ノード）を子ノードとして有するＰＱＰＮ６７０Ｄ（共有されない）を含み、したがって、ＰＱＰＮ５７０Ｂ〜５７０Ｆのサブグラフは、物理クエリプラン６２６と物理クエリプラン５６４との間で共有されるサブグラフである。
【００７９】
図示した例において、クエリプラン演算が２つ以上のクエリプランで同一であるときにノードが共有される。言い換えると、クエリプラン演算が２つ（以上）のクエリプランで同一である場合には、そのクエリプラン演算を表すノード（およびいずれかの子孫ノード、すなわち、親から子へ繰り返し進むことにより到達可能ないずれかのノード）を共有することができる。
【００８０】
前述したように、第１のクエリプランが既に生成され、実行後にメモリに保存されている場合（例えば、物理クエリプラン５６４）には、第２のクエリプラン（例えば、物理クエリプラン６２２、６２４、６２６、６２８のいずれか）の生成は、第１のクエリプラン（例えば、物理クエリプラン５６４）に既に存在し、かつそれらの必要なノードと同一であるため共有可能な、第２のクエリプランに必要な１つまたは複数のノード（および場合により、ノードおよびエッジの１つまたは複数サブグラフ）の生成を必要とせず、第２のクエリプラン（例えば、物理クエリプラン６２２、６２４、６２６、６２８のいずれか）の生成は、第２のクエリプランに必要なものと同一の１つまたは複数のノード（および場合により、１つまたは複数のサブグラフ）を第１のクエリプラン（例えば、物理クエリプラン５６４）から再利用する（「組み込む」とも称する）。さらに、第１のクエリプランが既に生成され、実行後にメモリに保存されている場合（例えば、物理クエリプラン５６４）には、第１の物理クエリプランに対応する第２の論理クエリプランの生成は、第１の物理クエリプラン（ノードおよびエッジを含む有向グラフ全体）を再利用できるため、いずれのノードの作成も必要としない。
【００８１】
したがって、図示した例において、共有されたノードは、ＳＱＬクエリの句または句の一部が同一である例示的なＳＱＬクエリの一部を実装し、したがって、ＳＱＬクエリは一部を共有して（「重複する」とも称する）、それらのＳＱＬクエリを実装するように生成されたクエリプランがノードを共有する（「重複する」とも称する）ことができるようにする。図６は重複する例示的なＳＱＬクエリを示すが、一部の実施形態において、２つのＳＱＬクエリの物理クエリプランは、それらのＳＱＬクエリが重複することなく重複してもよいことを理解すべきである。加えて、クエリプランを生成する際に適用されるクエリプラン最適化により、２つ以上のＳＱＬクエリの物理クエリプランに、より多いまたは少ない重複が生じることがあり、または重複がないことがある。
【００８２】
増分更新および増分実行
図７Ａは、一実施形態による、テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの少なくとも１つを修正したことに応答してテンポラルテーブルを増分更新することを示すフロー図である。前述したように、テンポラルテーブルに作用する一般的なリレーショナルデータベースの演算子（例えば、ＰＲＯＪＥＣＴ、ＪＯＩＮ、ＳＥＬＥＣＴ、ＴＡＢＬＥ）の実装が、当技術分野で公知である（例えば、Ｄ．  ＰｆｏｓｅｒおよびＣ．Ｓ．  Ｊｅｎｓｅｎ、「Ｉｎｃｒｅｍｅｎｔａｌ  Ｊｏｉｎ  ｏｆ  Ｔｉｍｅ−Ｏｒｉｅｎｔｅｄ  Ｄａｔａ」、Ｉｎ  Ｐｒｏｃ．  １１ｔｈ  Ｉｎｔｌ．  Ｃｏｎｆ．  Ｓｃｉｅｎｔｉｆｉｃ  ａｎｄ  Ｓｔａｔｉｓｔｉｃａｌ  Ｄａｔａｂａｓｅ  Ｍａｎａｇｅｍｅｎｔ、２３２〜２４３ページ、１９９９、Ｊｕｎ  ＹａｎｇおよびＪｅｎｎｉｆｅｒ  Ｗｉｄｏｍ、「Ｍａｉｎｔａｉｎｉｎｇ  Ｔｅｍｐｏｒａｌ  Ｖｉｅｗｓ  Ｏｖｅｒ  Ｎｏｎ−Ｔｅｍｐｏｒａｌ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｏｕｒｃｅｓ  Ｆｏｒ  Ｄａｔａ  Ｗａｒｅｈｏｕｓｉｎｇ」、Ｉｎ  ＥＤＢＴ  ’９８  Ｐｒｏｃ．  ６ｔｈ  Ｉｎｔｌ．  Ｃｏｎｆ．  ｏｎ  Ｅｘｔｅｎｄｉｎｇ  Ｄａｔａｂａｓｅ  Ｔｅｃｈｎｏｌｏｇｙ：Ａｄｖａｎｃｅｓ  ｉｎ  Ｄａｔａｂａｓｅ  Ｔｅｃｈｎｏｌｏｇｙ、３８９〜４０３ページ、１９９８）。一実施形態において、クエリプラン演算子のうちの１つ、いくつか、ほとんど、またはすべてが実装されて、完全再実行／再計算ではなく、増分実行をサポートしてテンポラルテーブルを増分更新する。図７Ａのフロー図は、図１のフロー図の後に行うことができる。
【００８３】
図７Ａのブロック７０２で、テンポラル−リレーショナルデータベースの一部であり、かつＳＱＬクエリのうちの少なくとも１つがデータへのアクセスを必要とするテンポラルテーブルの少なくとも所与の１つのコンテンツが修正される。例えば、これは、ＲＤＢＭＳがＩＮＳＥＲＴ、ＵＰＤＡＴＥ、もしくはＤＥＬＥＴＥ  ＳＱＬステートメント、またはデータレコードの追加、データレコードの削除、および／または既存のデータレコードのコンテンツの変更によりテンポラルテーブルのコンテンツを修正する他の同様のＳＱＬステートメントを受信したことに応答して行うことができる。前述したように、そのような演算は、ＳＱＬステートメント２１６に含まれ、非クエリエグゼキュータ２２８によりＢＴＴ２５４のうちの１つを修正するように実行することができる。ブロック７０２から、制御はブロック７０４へ進む。
【００８４】
ブロック７０４で、修正されたテンポラル−リレーショナルデータベーステーブル（ＳＱＬクエリのうちの少なくとも１つのクエリプランの有向グラフのノードであり、かつテンポラルテーブルのうちの所与の１つを特定するノードに直接的または間接的に依存するノードにより特定されたテンポラルテーブル）を特定するノードの先祖によって特定されたテンポラルテーブルが、更新される。このような更新は、可能であれば（例えば、実施形態が、クエリプラン演算を増分実行可能なＥｖａｌｕａｔｅメソッドを実装する場合）、増分実行により行われる。ブロック７０２に対してブロック７０４を実行するタイミングは、異なる実施形態において異なって判定することができる（例えば、前述したように、直ちに、レイジー更新をサポートする実施形態においては、１つまたは複数の事象が発生する（例えば、クエリ結果をクライアントに送る必要がある、一定時間が経過する、プログラム可能な時間が経過する、ノードおよびエッジをベースとして（例えば、ノードと他のノードとの連結、ノードのタイプ、過去のノードの使用などをベースとして）計算された時間が経過する、他のＳＱＬクエリの到着率が閾値を超える、および／または使用可能な計算リソースが閾値を下回る）まで遅延される）。ブロック７０４から、制御はブロック７０６へ進む。
【００８５】
スキップ更新をサポートする一部の実施形態において、ブロック７０２で修正されたテンポラルテーブルを特定するノードに直接的または間接的に依存するノードにより実行されるクエリプラン演算のみが実行される（他のノードはスキップされ（例えば、一実施形態において、他のノードはＥｖａｌｕａｔｅメソッドを呼び出すが、クエリプラン演算を実行せず、その子ノード（あれば）のＥｖａｌｕａｔｅを呼び出さない）、したがって、修正により影響されなかったテンポラルテーブルの更新を実行しないというさらなるパフォーマンスの利点が得られる）。代替実施形態において、複数のＳＱＬクエリのうちの少なくとも１つのクエリプランの有向グラフのノードのすべてにより実行されたクエリプラン演算が、（可能であれば増分実行により）実行される（かつ実装される）。
【００８６】
ブロック７０６に示すように、複数のＳＱＬクエリのうちの少なくとも１つについてのクエリ結果に対する増分更新が、複数のＳＱＬクエリのうちの少なくとも１つを送信したクライアントに送信される。したがって、一実施形態は、クエリ結果に対する増分更新を送信する（すなわち、「差分」のみを送信することにより、クエリ結果全体の送信を避ける）。
【００８７】
例えば、クライアントがＳＱＬクエリを送信したことに応答して、ＲＤＢＭＳが物理クエリプランを生成し、クエリ結果をクライアントに送信したと仮定すると、有向グラフのリーフノードにより特定されたベーステンポラルテーブルのコンテンツが修正される（ブロック７０２）。クエリプランおよびテンポラルテーブルが、潜在的な再利用のために、依然として実行後にメモリに保存されている場合、ＲＤＢＭＳは増分更新し（ブロック７０４）、先に送信したクエリ結果に対する増分更新をクライアントに送信することができる（すなわち、クライアントに既に送信されたクエリ結果の一部を送信するのではなく、クライアントに最後にクエリ結果が送信された以後の、ＳＱＬクエリを満たすクエリ結果に対する変更を特定するデータをクライアントに送信する）（ブロック７０６）。当然、クエリプランおよびテンポラルテーブルが、潜在的な再利用のために依然として実行後にメモリに保存されている間に第２のクライアントが同一のＳＱＬクエリを送信した場合、ＲＤＢＭＳは増分更新し（ブロック７０４）、完全クエリ結果を第２のクライアントに送信することができる。
【００８８】
図７Ｂは、一実施形態による、例示的な物理クエリプラン５６４および例示的な物理クエリプラン６２８に対する増分実行および増分更新を示す図である。図７Ｂは、１）図２の物理クエリプラン２４２、ベーステンポラルテーブル２６０、および派生テンポラルテーブル２６４、２）例示的な物理クエリプラン５６４（ＰＱＰＮ５７０Ａ〜５７０Ｆからなる有向グラフを含む）、および図５Ａ、図５Ｂ、図６のＢＴＴ５５４Ａ、５５４Ｂ、３）図５ＢのようにそれぞれのＰＱＰＮ５７０Ａ〜５７０Ｄにより特定されたＤＴＴ５５８Ａ〜５５８Ｄ、ならびに４）物理クエリプラン６２８（ＰＱＰＮ６７０ＦおよびＰＱＰＮ５７０Ｂ〜５７０Ｆからなる有向グラフを含む）を再現する。図７Ｂはまた、ＰＱＰＮ６７０Ｆにより特定されたＤＴＴ７５８Ａを示す。物理クエリプラン５６４、６２８が先に実行され、クエリ結果が第１のクライアントおよび第２のクライアントにそれぞれ提供されたと仮定する。７１０で、ＢＴＴ５５４Ａのコンテンツが修正される（例えば、ブロック７０２）。７２０で、ブロック７１０に応答してクエリプランのノードが増分実行される（例えば、可能なタイミングについてのブロック７０４の説明を参照）。物理クエリプラン５６４のみを更新する予定であると仮定すると、第１の実施形態は、曲線矢印７２２、７２４、７２８により示すように、ＰＱＰＮ５７０Ｅ、５７０Ｃ、５７０Ｂ、５７０Ａのみを増分実行する（かつＤＴＴ５５８Ａ〜５５８Ｃのみが更新され、増分更新７４０により反映されるように単に増分更新される）。第２の実施形態は、第１の実施形態と同一に行うが、ＰＱＰＮ６７０Ｆも増分実行する。これは、破線の曲線矢印７３０により示すように、ＰＱＰＮ６７０ＦがＢＴＴ５５４Ａに間接的に依存するからである（ＤＴＴ７５８Ａも更新され、増分更新７４４より反映されるように単に増分更新される）。第３の実施形態は、第１の実施形態と同一に行うが、破線の曲線矢印７３６、７３２により示すように、ＰＱＰＮ５７０Ｄ、５７０Ｆも増分実行する。これは、ＰＱＰＮ５７０Ｄ、５７０Ｆが例示的な物理クエリプラン５６４の一部であるからである（しかしながら、ＤＴＴ５５８Ｄは、直接的または間接的に影響する変更がなかったため更新されない）。第４の実施形態は、第１の演算、第２の演算、および第３の演算を行う。これらの実施形態のすべてにおいて、ＤＴＴは単に増分更新され、したがって、テンポラルテーブルを増分更新することに関して前述した利点を有する。
【００８９】
上記の段落において、第１の実施形態および第２の実施形態は、ＰＱＰＮ５７０Ｄ、５７０Ｆにより実行されるクエリプラン演算の実行（増分実行であっても完全再実行であっても）を避ける（本明細書において、スキップ更新と称する）。これは、異なる実施形態において異なって実現することができる。スキップ更新をサポートする一実施形態において、各クエリプランは双方向グラフとして生成され、これは各親ノードがその子ノード（あれば）を特定し、そのような各子ノードがその親ノードを特定することを意味する。双方向グラフおよびクエリプランの重複／連結（ノード共有）を使用することにより、別の観点では、その各リーフノード（例えば、ＰＱＰＮ５７０Ｅ、５７０Ｆ）も、「ダーティ通知有向グラフ」、「ベーステーブル有向グラフ」、または「ＢＴＴＮ有向グラフ」と称する別の有向グラフのルートノードとなる。各「ダーティ通知有向グラフ」はそのルートノード（例えば、ＰＱＰＮ５７０Ｅ）で始まり、１つまたは複数のレベルの中間ノード（例えば、ＰＱＰＮ５７０Ｃ、５７０Ｂ）を含み、その「ダーティ通知有向グラフ」の１つまたは複数のリーフノード（例えば、ＰＱＰＮ５７０ＡおよびＰＱＰＮ６７０Ｆ）（これらは、クエリプラン、例えば、物理クエリプラン５６４、６２８の各ルートノードである）で終わる。「ダーティ通知有向グラフ」を使用して、ダーティ通知有向グラフのルートノード（例えば、ＰＱＰＮ５７０Ｅ）からそのダーティ通知有向グラフのリーフノード（例えば、物理クエリプラン５６４、６２８のルートノードであるＰＱＰＮ５７０Ａ、ＰＱＰＮ６７０Ｆ）まで再帰呼出しを行うことにより、ＢＴＴの変更によって影響された各ノードを追跡することができ、これにより、そのダーティ通知有向グラフのルートノード（例えば、ＰＱＰＮ５７０Ｅ）から、中間ノード（例えば、ＰＱＰＮ５７０Ｃ、５７０Ｂ）を通って、ＢＴＴを消費するクエリプランのルートノード（例えば、物理クエリプラン５６４、６２８のルートノードであるＰＱＰＮ５７０Ａ、ＰＱＰＮ６７０Ｆ）まで、ダーティ表示が流れることができる。遅延した更新を追跡する機構を提供するという点で、これらのダーティ表示をレイジー更新と共に使用することができ、どのノードについてクエリプラン演算を実行すべきか（増分実行であっても完全再実行であっても）を追跡する機構を提供するという点で、これらのダーティ表示をスキップ更新に使用することができる。言い換えると、ダーティであると示されているそれらのノードすべてが、ＢＴＴの修正により（直接的または間接的に）影響されたＤＴＴの次の更新で実行されるバッチに含まれることになっており、ダーティであると示されているそれらのノードのみについてのクエリプラン演算が、ＢＴＴの修正により（直接的または間接的に）影響されたＤＴＴの次の更新で実行されることになっている（増分実行であっても完全再実行であっても）（ダーティであると示されていないノードの実行はスキップされる）。
【００９０】
重複クエリプランおよび増分実行
図８は、一実施形態による、重複クエリプランと増分実行との組合せを示すフロー図である。ブロック８０２は、リレーショナルデータベース管理システムにおいて、新たに送信された構造化クエリ言語（ＳＱＬ）クエリを受信することを示し、制御はブロック８０４へ進む。
【００９１】
ブロック８０４は、実行後にメモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に保存されている既存のクエリプランの少なくとも一部を再利用することにより、新たに送信されたＳＱＬクエリのクエリプランを生成することを示す。前述したように、リレーショナルデータベース管理システムは、テンポラルテーブルを含むテンポラル−リレーショナルデータベースを管理する。既存のクエリプランは、エッジにより連結されたノードの有向グラフを含み、この有向グラフは、テンポラル−リレーショナルデータベースのデータへのアクセスを必要とした先に送信されたＳＱＬクエリについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表す。新たに送信されたＳＱＬクエリのクエリプランは、エッジにより連結されたノードの有向グラフを含み、この有向グラフは、新たに送信されたＳＱＬクエリについてのクエリ結果を実行時に生成するクエリプラン演算子の順序セットを表す。新たに送信されたＳＱＬクエリの有向グラフは、そのエッジの少なくとも１つにより、先に送信されたＳＱＬクエリの有向グラフの少なくとも１つのノードに連結されて、有向グラフが少なくとも１つのノードを共有するようになっており、有向グラフのノードの各々はクエリプラン演算子のうちの１つを表す。さらに、有向グラフの各々のノードのうちの少なくとも１つは、テンポラル−リレーショナルデータベースのテンポラルテーブルのうちの１つを特定し、有向グラフによって共有されたノードのうちの少なくとも１つは、実行後にメモリに保存され、かつそのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルを特定する。ブロック８０４から、制御はブロック８０６へ進む。
【００９２】
破線のブロック８０６は、テンポラル−リレーショナルデータベースの一部であり、かつ少なくとも既存のＳＱＬクエリがデータへのアクセスを必要とするテンポラルテーブルのうちの所与の１つのコンテンツを修正した後、クエリプラン演算子を実行した結果を保存し、かつテンポラルテーブルのうちの所与の１つを特定するノードに直接的または間接的に依存する既存のクエリプランのノードにより特定されたテンポラルテーブルを増分更新することを示す。この増分更新が、テンポラルテーブルのうちの所与の１つを特定するノードに直接的または間接的に依存する既存のクエリプランの１つまたは複数のノードにより表された１つまたは複数のクエリプラン演算子を増分実行することを含む（そのノードの各子ノードにより特定されたテンポラルテーブルの有効行において、そのようなノードのクエリプラン演算子を再実行する（完全再実行）のとは対照的に）実施形態において、効率がさらに向上する。ブロック８０６から、制御はブロック８０８へ進む。
【００９３】
破線のブロック８０８は、既存のクエリプランの有向グラフのノードのうちのルートノードにより特定されたテンポラルテーブルに対する増分更新を特定するデータを、先に送信されたＳＱＬクエリを送信したクライアントに送信することを示す。
【００９４】
ブロック８０６、８０８に加えてまたはその代わりに、一実施形態は、１）有向グラフによって共有された少なくとも１つのノードにより特定されたテンポラルテーブルを必要に応じて増分更新することを含んで、再利用することにより、新たに送信されたＳＱＬクエリのクエリプランを実行する、かつ２）新たに送信されたＳＱＬクエリについてのクエリ結果を、新たに送信されたＳＱＬクエリを送信したクライアントに送信する。ブロック８０６、８０８に加えてまたはその代わりに、一実施形態は、１）新たに送信されたＳＱＬクエリのクエリプランの実行の一部として、有向グラフによって共有された少なくとも１つのノードにより表されたクエリプラン演算子を増分実行する、かつ２）新たに送信されたＳＱＬクエリについてのクエリ結果を、新たに送信されたＳＱＬクエリを送信したクライアントに送信する。加えてまたはあるいは、一実施形態において、既存のクエリプランは実行後にメモリに保存されているため、有向グラフのノードおよびサブグラフは潜在的な再利用のために使用可能である。加えてまたはあるいは、一実施形態において、そのノードにより表されたクエリプラン演算子を実行した結果を保存するように作成されたテンポラルテーブルの各々は、潜在的な再利用のために実行後にメモリに保存されている。加えてまたはあるいは、一実施形態において、生成は、１）既存のクエリプランの有向グラフのノードのうちの少なくとも１つを再利用可能であると特定すること、および２）特定されたノードに連結されたエッジを、新たに送信されたＳＱＬクエリのクエリプランの有向グラフに追加することを含む。加えてまたはあるいは、生成は、１）再利用可能な既存のクエリプランの部分があることを特定し、特定された部分が、共有される有向グラフの少なくとも１つのノードを含むこと、および２）特定された部分を再作成するのではなく、新たに送信されたＳＱＬクエリのクエリプランにおいて特定された部分を再利用することを含むことができる。リレーショナルデータベース管理システムは、新たに送信されたＳＱＬクエリについてのクエリ結果をその同一のクライアントおよび／または異なるクライアントに送信することもできる。加えてまたはあるいは、一実施形態において、１つまたは複数のクエリプラン演算子は、テンポラル−リレーショナル代数演算を実行する。加えてまたはあるいは、一実施形態は、ルートノード、少なくとも１つまたは複数のリーフノード、および少なくとも１つまたは複数の中間ノードを各々含む有向グラフをサポートし、中間ノードは１つまたは複数の親ノードおよび１つまたは複数の子ノードの両方を有するノードであり（ルートノードは少なくとも１つの中間ノードに連結され、中間ノードの各々は少なくとも別の中間ノードまたは１つのリーフノードに連結され）、これら２つの有向グラフは、少なくとも１つの中間ノードおよびその子孫ノードを共有する。加えてまたはあるいは、一実施形態は、ノードおよびエッジのサブグラフを共有するクエリプランをサポートする。
【００９５】
加えてまたはあるいは、一実施形態において、先に送信されたＳＱＬクエリは、クライアントによりサブスクリプションＳＱＬクエリとして送信され、新たに送信されたＳＱＬクエリは、サブスクリプションＳＱＬクエリであるため、既存のクエリプランが実行後にメモリに保存されている間に、リレーショナルデータベース管理システムにより受信される。また、図１を参照して説明した様々な実施形態が概して図８に当てはまる。
【００９６】
ノードキー対ノードキャッシュ
図９は、一実施形態によるキャッシュ２３４を示すブロック図である。図９は、１）図２のキャッシュ２３４、物理クエリプラン２４２、およびベーステンポラルテーブル２６０、ならびに２）例示的な物理クエリプラン５６４（ＰＱＰＮ５７０Ａ〜５７０Ｆからなる有向グラフを含む）および図５Ａ、図５Ｂ、図６、図７ＢのＢＴＴ５５４Ａ、５５４Ｂを再現する。図９はまた、ノードキー９１０のセットおよびノード参照９２０のセットを含むデータ構造を有するキャッシュ２３４を示す。図９では、物理クエリプラン５６４の各ノードがキャッシュ２３４のデータ構造内にエントリを有し、各ノードのエントリは、そのノードのノードキーをセット９１０に保存し、物理クエリプラン２４２内でそのノードを位置決めするために使用する参照をセット９２０に保存する。詳細には、図９は、ＰＱＰＮ５７０Ａ〜５７０Ｆをそれぞれ特定するノードキー９１２Ａ〜９１２Ｆおよびそれぞれの関連する参照９２２Ａ〜９２２Ｆを示す。図９はテーブル形式のデータ構造を示すが、他の実施形態は異なるデータ構造（例えば、渡される各キーのハッシュをデフォルトで作成するハッシュマップ、グラフ構造など）を使用してもよい。
【００９７】
前述したように、生成中の新しいクエリプランのすべておよび／または一部を各々表す１つまたは複数のノードキーをキャッシュ２３４のノードキーと比較して、新しい物理クエリプランの生成が、１つまたは複数の既存の物理クエリプラン（例えば、物理クエリプラン５６４）の１つまたは複数の部分（各部分はノードまたはノードおよびエッジのサブグラフである）を再利用する／組み込むことができるかどうかを判定する。したがって、ＰＱＰＮの各々についてノードキーが存在し、その意味で、各ＰＱＰＮは１つのノードキーにより表される。新しい物理クエリプランに先立って論理クエリプランを最初に生成する実施形態において、論理クエリプランを使用して必要なノードキーを生成することができる。さらに、論理クエリプランを生成する実施形態において、ＬＱＰＮから生成されたノードキーは、そのＬＱＰＮ、および最終的にそのＬＱＰＮを実装するために使用されるＰＱＰＮを表す。
【００９８】
一部の実施形態において、所与のノードのノードキーは、単にそのノードを含むクエリプランの部分を表すが、そのノードの先祖（親ノード、祖父母ノードなど）（あれば）を含むクエリプランの部分を表さない。一部のそのような実施形態において、所与のノードのノードキーは、単にそのノードおよびその子孫（子ノード、孫ノードなど）（あれば）を含むクエリプランの部分を表すが、そのノードの先祖（親ノード、祖父母ノードなど）（あれば）を含むクエリプランの部分を表さない。例えば、１）一実施形態において、各ノードのノードキーは、そのノードおよびそのノードの子孫（あれば）をベースとし（例えば、そのノードのクエリプラン演算子およびパラメータ、ならびにそのノードの子孫（あれば）の各々をベースとし）、２）別の実施形態において、各ノードのノードキーは、そのノード（例えば、そのノードのクエリプラン演算子タイプおよびパラメータ）およびそのノードの子孫のキー（あれば）をベースとする（注：本実施形態において、各低レベルキーがそれ自身の子孫のすべてを既に表すため、一部の情報は複製される）。したがって、所与のクエリプランについて、１）そのクエリプランのルートノードのノードキーは、クエリプラン全体を表す、２）各リーフノード（例えば、ＢＴＴＮ）のノードキーは、リーフノードが参照するＢＴＴを特定するクエリプランの部分を単に表す、３）クエリプランに１つまたは複数の中間ノードが存在する場合には、ａ）リーフノードに連結されたノード（リーフノードを子として有するノード）の各々のノードキーは、そのノード（例えば、クエリプラン演算子タイプおよびそのパラメータ（例えば、比較述語））およびその子孫ノード（例えば、リーフノード）を含むクエリプランの部分を単に表し、ｂ）各高レベルノード（あれば）のノードキーは、高レベルノード（例えば、そのノードの子ノードにより提供された結果においてノードが実行するクエリプラン演算子およびそのパラメータ（例えば、比較述語））およびその子孫ノード（例えば、他の中間ノードおよびリーフノード）を含むクエリプランの部分を単に表す。特定の実施形態により、１）リーフノードは、テーブル参照に作用するＴＡＢＬＥクエリプラン演算子を表し、そのノードキーは、ＴＡＢＬＥクエリプラン演算子タイプおよびそれが作用するテーブル参照（例えば、ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ））をベースとし、２）第２レベルノードは、テーブルクエリプラン演算子の結果に作用するクエリプラン演算子（例えば、ＳＥＬＥＣＴ）を表し、そのノードキーは、そのクエリプラン演算子タイプ、そのパラメータ（例えば、そのクエリプラン演算子の比較述語）、およびそのノードキーが依存するリーフノード（例えば、ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ）を表すリーフノード）をベースとし、３）高レベルノードは、その子ノードの結果に作用するクエリプラン演算子（例えば、ＪＯＩＮ）を表し、そのノードキーは、そのクエリプラン演算子タイプ、そのパラメータ（例えば、そのクエリプラン演算子の比較述語）、および子孫ノードをベースとし、４）ルートノードは、その子ノードの結果に作用するＰＲＯＪＥＣＴクエリプラン演算子を表し、そのノードキーは、クエリプラン全体を表し、ＰＲＯＪＥＣＴクエリプラン演算子タイプ、そのパラメータ（例えば、そのＰＲＯＪＥＣＴクエリプラン演算子の列名の一覧）、およびその子孫ノードをベースとする。
【００９９】
別の実施形態において、各ノードのノードキーは、そのノード（例えば、そのノードのクエリプラン演算子タイプおよびパラメータをベースとする）、およびそのノードの子ノード（あれば）のキー（子ノードキーは、それ自体、その子ノード（あれば）のキーをベースとする）などをベースとする（注：本実施形態は前記複製を避けることができる）。さらに別の実施形態において、各ノードのノードキーは、そのノード（例えば、そのノードのクエリプラン演算子タイプおよびパラメータをベースとする）およびそのノードの０以上の子ノード（例えば、子ノード（あれば）のクエリプラン演算子およびパラメータをベースとする）をベースとする。
【０１００】
特定の例により、図９は、論理クエリプランを最初に生成し、論理クエリプランからノードキーを生成し、各ノードのノードキーはそのノードおよびそのノードの子孫（あれば）をベースとする（例えば、そのノードのクエリプラン演算子およびパラメータ、およびそのノードの子孫（あれば）の各々をベースとする）実施形態を示す。したがって、ノードキー９１２Ｆは、リーフＬＱＰＮ４７０Ｆ（子孫を有していない）の表現（例えば「ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ）」）であり、ノードキー９１２Ｅは、リーフＬＱＰＮ４７０Ｅ（子孫を有していない）の表現（例えば「ＴＡＢＬＥ（ＯＲＤＥＲＳ）」）であり、ノードキー９１２Ｄは、中間ＬＱＰＮ４７０Ｄおよびその子孫ＬＱＰＮ４７０Ｆの表現（例えば「ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＯＲＤＥＲＳ），ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４）」）であり、ノードキー９１２Ｃは、中間ＬＱＰＮ４７０Ｃおよびその子孫ＬＱＰＮ４７０Ｅの表現（例えば、「ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ），ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１）」）であり、ノードキー９１２Ｂは、中間ＬＱＰＮ４７０Ｃおよびその子孫ＬＱＰＮ４７０Ｃ〜４７０Ｆの表現（例えば、「ＪＯＩＮ（ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＯＲＤＥＲＳ），ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４），ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ），ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１），ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ＝ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ）」）であり、ノードキー９１２Ａは、ルートＬＱＰＮ４７０Ａおよびその子孫のすべてＬＱＰＮ４７０Ｂ〜４７０Ｆの表現（例えば、「ＰＲＯＪＥＣＴ（ＪＯＩＮ（ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＯＲＤＥＲＳ），ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ＞４），ＳＥＬＥＣＴ（ＴＡＢＬＥ（ＣＵＳＴＯＭＥＲＳ），ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ＝１０００１），ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ＝ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ），ＣＵＳＴＯＭＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ，ＣＵＳＴＯＭＥＲＳ．Ｎａｍｅ，ＣＵＳＴＯＭＥＲＳ．ＰｏｓｔａｌＣｏｄｅ，ＯＲＤＥＲＳ．ＯｒｄｅｒＩＤ，ＯＲＤＥＲＳ．ＣｕｓｔｏｍｅｒＩＤ，ＯＲＤＥＲＳ．Ｐｒｉｃｅ，ＯＲＤＥＲＳ．Ｑｕａｎｔｉｔｙ）」）である。
【０１０１】
上記の例では、ノードキーを文字列として説明したが、他の実施形態は異なるデータタイプをキーとして使用してもよい（例えば、一実施形態において、キーは文字列以外のオブジェクトであってもよく、別の実施形態において、キーを「ハッシュ」して、結果として得られるハッシュ値を使用する）。例えば、一部の実施形態において、プリティプリンタ（特定のノードから始まりその子孫を含むサブグラフの文字列表現を生成するために使用可能な周知のソフトウェアコンポーネント）の出力、またはそのハッシュを使用してキーを作成する。別の例として、一部の実施形態において、所与のＬＱＰＮのキーが、ＬＱＰＮの子ノードのハッシュからの情報、再帰的に、ＬＱＰＮの演算子タイプフィールドのデータ、ＬＱＰＮの他のパラメータフィールド（あれば）のデータを使用して（例えば、ハッシュを生成することにより）作成される。
【０１０２】
前述したように、グラフのエッジがグラフのノード内に保存される実施形態について説明したが、代わりに、代替実施形態はエッジをキャッシュ２３４に保存してもよい。
【０１０３】
前述したように、異なる実施形態は、異なる技術を使用して、クエリプランのノードおよびＴＴの各々が実行後にどのくらい長くメモリに保存されるかを判定することができる。一実施形態において、「アクティブ」または「非アクティブ」の特定は、クエリプランの各々について維持され（例えば、特定は各クエリプランの有向グラフのルートノードに関連付けることができる）、「アクティブ」クエリプランの一部ではないノード（およびノードが参照するＴＴ）は、実行後にメモリへの保存から除去される候補である。前述したように、Ｊａｖａで実装された一実施形態において、キャッシュ２３４におけるルートノードおよびリーフノードへの参照（例えば、９２２Ａ、９２２Ｅ、９２２Ｆ）は強参照タイプであり、キャッシュ２３４における中間ノード（例えば、９２２Ｂ、９２２Ｃ、９２２Ｄ）への参照は弱参照タイプであり、キャッシュ２３４において所与のルートノードが解放されると、Ｊａｖａ仮想マシンのガベージコレクタは、そのルートノードから延びる有向グラフにより消費されたメモリを解放することができる。
【０１０４】
ベーステンポラルテーブルのロード
図１０は、ある実施形態による、ベーステンポラルテーブルのデータを入力可能な方法を示すブロック図である。図１０は、図２のデータベースドライバ２０４およびＲＤＢＭＳ２１２の一部を再現する。一実施形態において、データが１つまたは複数の他のソースからＲＤＢＭＳ２１２にロードされる。例えば、図１０は、破線のボックス１００４が、リアルタイムストリーミングソース、第２のＲＤＢＭＳシステム（Ｒｅｄｗｏｏｄ  Ｓｈｏｒｅｓ、ＣａｌｉｆｏｒｎｉａのＯｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎにより製造されたＯｒａｃｌｅ（登録商標）ＲＤＢＭＳなど）、スプレッドシート、計算サーバなどのソースであることを示す。ブロック１００２は、ソース１００４から受信したデータの抽出、変換、およびロード（ＥＴＬ）演算を実行し、ＳＱＬステートメント（例えば、ＣＲＥＡＴＥ  ＴＡＢＬＥおよびＩＮＳＥＲＴ）をプロセスクライアント通信マネージャ２１４に提供して、変換されたデータをロードする周知の技術を表す。前述したように、そのようなステートメントは、パーサ２１８に提供され、内部表現２２０の形式で非クエリエグゼキュータ２２８に到達し、これに応答して、必要なベーステンポラルテーブル２６０が作成されて入力される。そのような一実施形態において、ＲＤＢＭＳ２１２は、１つまたは複数のソース上で動作するイン−メモリＲＤＢＭＳであり、他のそのような実施形態において、ＲＤＢＭＳ２１２は、オン−ディスクシステム、またはハイブリッドイン−メモリおよびオン−ディスクシステムである。図示した実施形態において、ＥＴＬ１００２は、データベースドライバを介してプロセスクライアント通信マネージャ２１４と対話するが、代替実施形態は異なって動作してもよい（例えば、ＥＴＬの代わりに、データを生成または計算する（抽出および変換とはとは対照的に）クライアントが、データベースドライバを使用して、ＳＱＬステートメント（例えば、ＣＲＥＡＴＥ  ＴＡＢＬＥおよびＩＮＳＥＲＴ）をプロセスクライアント通信マネージャ２１４に提供してデータをロードしてもよい）。
【０１０５】
別の実施形態において、ＲＤＢＭＳ２１２はイン−メモリおよびオンディスクの組合せシステムであり、ベーステンポラルテーブルは、エンドユーザがアクセス可能なデータを保存する（したがって、データを別のソースからロードする必要がない）。例えば、一実施形態において、イン−メモリおよびオン−ディスクシステムである既存のＲＤＢＭＳは、本発明の特徴を含むように拡張される。本明細書で使用するとき、「イン−メモリ」および「オン−ディスク」は、比較的速い読み書き時間を有する揮発性メインメモリ（例えば、ダイナミックランダムアクセスメモリ（ＤＲＡＭ））へのコード／データの保存を、より遅い読み書き時間を有する不揮発性の長期記憶装置（例えば、磁気ディスク、フラッシュメモリ、相変化メモリ、ソリッドステートドライブ（ＳＳＤ））と区別するために使用される周知の用語である。しかしながら、本明細書で説明したように、より速い読み書き時間を有する不揮発性メモリ（例えば、相変化メモリ）を採用することにより、揮発性メインメモリと不揮発性の長期記憶装置との過去の区別は古いものとなる。したがって、本明細書における「インメモリ」（すなわち、ハイフンなし）という用語の使用は、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せへの保存を指す。
【０１０６】
ユーザインターフェース
前述したように、複数の重複クエリが同時に存在する様々な理由がある。別のそのような理由は、異なる電子デバイス上で動作するエンドユーザクライアントを通して、複数の、しばしば多数のエンドユーザに共通のユーザインターフェース（例えば、ダッシュボード）を提供するユーザインターフェース層を使用することである。図１１は、一実施形態によるＲＤＢＭＳ２１２上のユーザインターフェース層を示す。図１１は、１）図２の物理クエリプラン２４２、ベーステンポラルテーブル２６０、および派生テンポラルテーブル２６４、２）例示的な物理クエリプラン５６４（ＰＱＰＮ５７０Ａ〜５７０Ｆからなる有向グラフを含む）および図５Ａ、図５Ｂ、図６のＢＴＴ５５４Ａ、５５４Ｂ、ならびに３）例示的な物理クエリプラン６２２〜６２８（ＰＱＰＮ６７０Ａ〜６７０Ｆを含む）を再現する。図１１では、ユーザインターフェース層１１００は、異なるエンドユーザ電子デバイス上で動作するエンドユーザクライアント（エンドユーザクライアント１１０４Ａ〜１１０４Ｎ）を通して、ユーザインターフェースを複数のエンドユーザに提供する。一実施形態において、ユーザインターフェース層は「ダッシュボード」を提供する。例えば、エンドユーザクライアント１１０４Ａ〜１１０４Ｍは、同一のダッシュボード（表示されたダッシュボード１１１０Ａ〜１１１０Ｍとして示す）のインスタンスを各々表示し、エンドユーザクライアント１１０４Ｎは異なるダッシュボード１１１０Ｎを表示する。図示した例では、２つの異なるダッシュボードのみが例示の目的で示される（表示されたダッシュボード１１１０Ａ〜１１１０Ｍと表示されたダッシュボード１１１０Ｎ）が、実施形態はより多いまたは少ないダッシュボードをサポートすることができる。
【０１０７】
ダッシュボードは、通常、しばしば単一のウェブページまたはアプリケーションウィンドウ（キャンバスとも称する）に適合し、かつ電子デバイスを通してエンドユーザに表示するためのものであるボックスの集合（しばしば矩形で、タイルまたはパネルと称する）であり、実際には、通常、所与のダッシュボードは複数の電子デバイスを通して多数のエンドユーザに表示するためのものである。ダッシュボードの各ボックスは、データセットからのデータを表す（またはこのデータをベースとする）コンテンツ要素（例えば、チャート、グラフ、画像（例えば、色分けされたマップ）、スプレッドシート、ピボットテーブル、一覧、テーブル、ウィジェットであり、これらの一部を「ビュー」または「ビジュアル」と称することがある）を含む。ダッシュボードおよび／またはボックスの１つ、複数、もしくはすべては、ユーザがダッシュボードおよび／またはボックスと対話できるようにする「メニューバー」または他のタイプの表示アイテムを含むことができる。データセットは、コンテンツ要素を作成するために使用されるデータの集合であり、１つのデータ点、または単一のデータソースからのデータ（フィルタリング可能）、または複数のソース（例えば、Ｅｘｃｅｌワークブックの１つまたは複数のテーブル、１つまたは複数のデータベース（例えば、ＳＱＬデータベース）、ウェブサイト、ソフトウェアサービス（例えば、セールスフォース）など）からのデータ（フィルタリング可能）であってよい。一実施形態において、ユーザインターフェース層１１００は、ＲＤＢＭＳ２１２に送信されたＳＱＬクエリを生成し、ＲＤＢＭＳ２１２は、データセットを形成するクエリ結果により応答し、そこからコンテンツ要素が入力される。図１１の文脈において、エンドユーザクライアント１１０４Ａ〜１１０４Ｎは、ＳＱＬステートメント（ＳＱＬクエリを含む）を送信して、コンテンツ要素１１１２Ａ〜１１１２Ｄのデータセット（図示せず）を生成し、リレーショナルデータベース管理システム２１２は、コンテンツ要素１１１２Ａ〜１１１２Ｄの適切なエンドユーザクライアントに提供されるデータセットであるクエリ結果により、ＳＱＬクエリに応答する。このようにして、エンドユーザクライアントは、ＲＤＢＭＳ２１２のクライアントであり（データベースクライアントまたはＲＤＢＭＳクライアントと称することができる）、各々データベースドライバ２０４を含む。他の実施形態において、ユーザインターフェース層１１００は、式または「ＢＩクエリ言語」（例えば、データ解析式（ＤＡＸ）言語、多次元式（ＭＤＸ）言語、独自の言語など）で要求を生成し、エンドユーザクライアント１１０４Ａ〜１１０４ＮとＲＤＢＭＳ２１２との間のＢＩサービス１１０２は、１）エンドユーザクライアント１１０４Ａ〜１１０４Ｎからの要求を、ＲＤＢＭＳ２１２に提供するＳＱＬクエリ（一部の実施形態において、サブスクリプションＳＱＬクエリ）に翻訳し、２）ＲＤＢＭＳ２１２からの応答クエリ結果を、ユーザインターフェース層１１００によりコンテンツ要素を入力するために使用されるデータセットに翻訳する。図１１の文脈において、エンドユーザ電子デバイス上で動作するエンドユーザクライアント１１０４Ａ〜１１０４Ｎ（ＢＩサービス１１０２（例えば、ＡＰＩ、ウェブブラウザ、ネイティブクライアント、ＢＩポータル、コマンドラインインターフェースなど）とインターフェース接続するソフトウェア（図示せず）を含む）は、ＢＩサービス１１０２によりコンテンツ要素１１１２Ａ〜１１１２Ｄのデータセット（図示せず）を生成するように設計されたＳＱＬステートメント（ＳＱＬクエリを含む）に翻訳された要求（図示せず）を送信する。ＢＩサービス１１０２は、データベースドライバ２０４を含み、これらのＳＱＬステートメントをＲＤＢＭＳ２１２に送信する。ＲＤＢＭＳ２１２は、クエリ結果をＢＩサービス１１０２に送ることによりＳＱＬクエリに応答し、ＢＩサービス１１０２は、このクエリ結果を、コンテンツ要素１１１２Ａ〜１１１２Ｄの適切なエンドユーザクライアントに提供されるデータセットに翻訳する。このように、エンドユーザクライアント１１０４Ａ〜１１０４ＮはＢＩサービス１１０２のクライアント（ＢＩクライアントと称することができる）であり、ＢＩサービスはＲＤＢＭＳ２１２のクライアント（データベースクライアントまたはＲＤＢＭＳクライアントと称することができる）である。さらに他の実施形態は、両タイプのエンドユーザクライアントを有する（例えば、ＲＤＢＭＳクライアントである（したがって、データベースドライバ２０４のうちの１つを有する）エンドユーザクライアント、ならびにＢＩクライアントである（したがってＢＩサービス１１０２（例えば、ＡＰＩ、ウェブブラウザ、ネイティブクライアント、ＢＩポータル、コマンドラインインターフェースなど）とインターフェース接続するソフトウェアを有し、次いでＲＤＢＭＳクライアントとなり、データベースドライバ２０４を含む）他のエンドユーザクライアント、またはさらにはＢＩクライアントおよびＲＤＢＭＳクライアントの両方である（したがって、ＢＩサービスおよびデータベースドライバ２０４のうちの１つとインターフェース接続する両ソフトウェアを含む）エンドユーザクライアントを有することができる）。
【０１０８】
図１１では、コンテンツ要素１１１２Ａ、１１１２Ｂのデータセットは、物理クエリプラン６２２、５６４からのクエリ結果によりそれぞれ提供され、コンテンツ要素１１１２Ｃのデータセットは物理クエリプラン６２４、６２６のクエリ結果により提供され、コンテンツ要素１１１２Ｄのデータセットは物理クエリプラン６２８のクエリ結果により提供される。図１１では、コンテンツ要素１１１２Ａ〜１１１２Ｄのデータセットについてのクエリ結果を提供するクエリプランはすべて重複する。異なるダッシュボードの異なるコンテンツ要素についてのデータセットを提供するクエリプランは、重複することができる（例えば、物理クエリプラン６２８の有向グラフは、そのエッジのうちの少なくとも１つにより、物理クエリプラン５６４の有向グラフの少なくとも１つのノード（ＰＱＰＮ５７０Ｂ）に連結されて、それらの有向グラフが少なくとも１つのノード（少なくともＰＱＰＮ５７０Ｂ）を共有するようになっており、物理クエリプラン５６４、６２８はそれぞれ第１のＳＱＬクエリおよび第２のＳＱＬクエリについて生成および実行されて、それぞれ第１のダッシュボードコンテンツ要素（例えば、コンテンツ要素１１１２Ｂ）および第２のダッシュボードコンテンツ要素（例えば、コンテンツ要素１１１２Ｄ）を入力し、第１のダッシュボードコンテンツ要素（例えば、コンテンツ要素１１１２Ｂ）および第２のダッシュボードコンテンツ要素（例えば、コンテンツ要素１１１２Ｄ）は、異なるエンドユーザクライアントにより表示される異なるダッシュボード（エンドユーザクライアント１１０４Ａ、１１０４Ｎによりそれぞれ表示されるダッシュボード１１１０Ａ、１１１０Ｎ）の一部である。したがって、１つのダッシュボードのコンテンツ要素が別のダッシュボードのコンテンツ要素と同一となり得ない場合でも、それらのコンテンツ要素について送信されたＳＱＬクエリは、重複するクエリプランを生じさせることができる。
【０１０９】
さらに、同一のダッシュボードの異なるコンテンツ要素についてのデータセットを提供するクエリプランは、重複することができる（例えば、物理クエリプラン６２２の有向グラフは、そのエッジのうちの少なくとも１つにより、物理クエリプラン５６４の有向グラフの少なくとも１つのノード（ＰＱＰＮ５７０Ｅ）に連結されて、それらの有向グラフが少なくとも１つのノードを共有するようになっており、物理クエリプラン５６４、６２２はそれぞれ第１のＳＱＬクエリおよび第２のＳＱＬクエリについて生成および実行されて、それぞれ第１のダッシュボードコンテンツ要素（例えば、コンテンツ要素１１１２Ｂ）および第２のダッシュボードコンテンツ要素（例えば、コンテンツ要素１１１２Ａ）を入力し、第１のダッシュボードコンテンツ要素（例えば、コンテンツ要素１１１２Ａ）および第２のダッシュボードコンテンツ要素（例えば、コンテンツ要素１１１２Ｂ）は、異なるエンドユーザクライアントによりそのインスタンスが表示される同一のダッシュボード（例えば、エンドユーザクライアント１１０４Ａ、１１０４Ｍによりそれぞれ表示されるダッシュボード１１１０Ａ、１１１０Ｍ）の一部である。図１１の例は、コンテンツ要素１１１２Ａ〜１１１２Ｄのデータセットについてのクエリ結果を提供するクエリプランがすべて重複しているときを示すが、これは常に必要というわけではない（他の別個の物理クエリプラン、互いに重複する物理クエリプランの他の別個のセットなどがあってもよい）。
【０１１０】
一部の実施形態において、ダッシュボードは通常、しばらくの間表示され、コンテンツ要素が略リアルタイムで更新されることが望まれるため、リレーショナルデータベース管理システム２１２に送信されたＳＱＬクエリは、サブスクリプションＳＱＬクエリとして送信することができる。前述したように、一部の実施形態は、クエリプラン演算子を増分実行することができ、これにより、完全再実行と比較して効率が向上する。したがって、サブスクリプションＳＱＬクエリを使用して、増分実行と組み合わせてダッシュボードのコンテンツ要素についてのクエリ結果を提供することにより、そのＳＱＬクエリ結果が依存するデータの変更に応答する更新がより速くなる。
【０１１１】
さらに、一部の実施形態において、クライアントのうちの少なくとも１つが、クエリプランを生成したＳＱＬクエリに対する更新を受信するようにサブスクライブされている限り、サブスクリプションＳＱＬクエリのクエリプランは実行後にメモリに保存され、第１のクライアントによるサブスクリプションＳＱＬクエリの使用により、そのサブスクリプションＳＱＬクエリのクエリプラン（およびそのノードが特定するテンポラルテーブル）が潜在的な再利用のために実行後にメモリに保存される時間窓、したがって、別のクライアントが重複するまたは同一のＳＱＬクエリ（非サブスクリプションまたはサブスクリプション）を送信することのできる時間窓を延長し、ＲＤＢＭＳは、既存のクエリプランを再利用できることを検出することができる（すなわち、リレーショナルデータベース管理システム２１２は、別のクライアントにより送信されたＳＱＬクエリのクエリプランが、第１のクライアントにより送信されたサブスクリプションＳＱＬクエリについて実行後にメモリに既に保存されている既存のクエリプランと完全にまたは部分的に重複することを検出する）。
【０１１２】
同一の時間に異なる電子デバイス上の異なるエンドユーザが同一のダッシュボードを使用することにより、そのような各電子デバイスは、ダッシュボードのコンテンツ要素ごとに同一のＳＱＬクエリを発行して、そのコンテンツ要素を入力する。例えば、所与のダッシュボードがＸ個の電子デバイスにより表示されている場合、そのダッシュボードの所与のコンテンツ要素を入力するために使用されるＳＱＬクエリを、Ｘ回発行することができる（Ｘ個の電子デバイスの各々につき１回）。前述したように、実施形態は重複クエリプランを生成することができるため、複数のクライアントが同一のＳＱＬクエリを送信することによって、その同一のＳＱＬクエリについて単一のクエリプランを生成し共有することができる（これは、クエリプランが完全に重複して、単一のクエリプランのみが実行後にメモリに保存される場合に当てはまる）。したがって、同一の時間に複数のエンドユーザクライアントが共通のダッシュボードを使用することにより、その共通のダッシュボードのコンテンツ要素について同一の１つまたは複数のＳＱＬクエリを送信することができ（エンドユーザクライアントがＲＤＢＭＳクライアントである場合には、送信は直接であり、エンドユーザクライアントが、ＲＤＢＭＳクライアントであってクエリの複製に自身で対処しないＢＩサービスのクライアントである場合には、送信は間接的である）、これにより、ＲＤＢＭＳによって、その共通のダッシュボードについて１つまたは複数の完全に重複するクエリプランを再利用することになる。要するに、一実施形態において、同一のダッシュボードを同時に使用する複数のエンドユーザクライアントにより、サブスクリプションＳＱＬクエリの同一のセットを（場合により異なる時間に）ＲＤＢＭＳに送信することができ、ＲＤＢＭＳは、サブスクリプションＳＱＬクエリのクエリプランの単一のセットを生成し、クエリ結果をサブスクライブクライアントの各々に提供する（すべての有効なデータレコードを含む初期クエリ結果および経時的な増分クエリ結果（例えば、変更一覧の形式）の両方を、サブスクライブクライアントの各々にサブスクライブ中に提供する）。したがって、複数のエンドユーザクライアントがダッシュボードの同一のコンテンツ要素を使用することと組み合わせて、サブスクリプションＳＱＬクエリを使用してダッシュボードのコンテンツ要素についてのクエリ結果を提供することにより、そのサブスクリプションＳＱＬクエリのクエリプランが潜在的な再利用のために実行後にメモリに保存される時間窓、したがって別のクライアントが同一のＳＱＬクエリを送信できる時間窓が大きくなり、リレーショナルデータベース管理システムは既存のクエリプランを再利用できることを検出することができる。
【０１１３】
また、ある実施形態におけるユーザインターフェースにより、エンドユーザは１つまたは複数のコンテンツ要素と対話することができ、コンテンツ要素を入力するように発行されたＳＱＬクエリが異なるエンドユーザクライアントについて同一ではなく重複するようになっている。例えば、第１のエンドユーザおよび第２のエンドユーザのエンドユーザクライアントは、単一のクエリプランが生成および実行された同一のＳＱＬクエリに依拠する同一のコンテンツ要素を表示することができる。しかしながら、第１のエンドユーザは、異なるクエリプランを必要とするようにベースとなるＳＱＬクエリを変更する方法で、ダッシュボードのコンテンツ要素と対話することができるが、異なるクエリプランは、依然として、第２のエンドユーザに対して表示されているコンテンツ要素についてのクエリプランと部分的に重複する。
【０１１４】
また、一部の実施形態において、ダッシュボードを提供するユーザインターフェースは、使用可能なダッシュボードが比較的一定であるようになっているが、他の実施形態において、ユーザインターフェースにより、エンドユーザはダッシュボードを作成、編集し、他のエンドユーザと共有することができる。これを可能にする既存のユーザインターフェース（ビジネスインテリジェンスツールと称することがある）がある。ダッシュボードを作成および／または編集する能力を、セルフサービスダッシュボードまたはユーザカスタマイズ可能なダッシュボードと称することがある。この能力により、「データディスカバリ」の周知の概念が可能になる。データディスカバリは、データセットを理解するユーザ主導型プロセスであり、データセット内のパターンまたは特定のアイテムを検索することを含む。データディスカバリアプリケーションは、パターンまたは特定のアイテムを見つけるプロセスを迅速かつ直感的にするために、しばしば視覚ツール（例えば、マップ、ピボットテーブル）を使用する。データディスカバリは、これらの目標を達成するために統計技術およびデータマイニング技術を活用することができる。ベースとなるデータベースの応答性が高くなるほど、データディスカバリが効率的および実用的なるため、増分実行およびクエリプランの再利用をサポートするリレーショナルデータベース管理システム２１２により、複数のクライアントおよびより効率的なデータディスカバリをサポートするより応答性の高いテンポラル−リレーショナルデータベースが可能になる。詳細には、データディスカバリにより、エンドユーザがデータセット内のパターンおよびアイテムを検索するときに一連の重複クエリを発行することができるため、増分実行およびクエリプランの再利用を実行するリレーショナルデータベース管理システム２１２の能力によって、リレーショナルデータベース管理システム２１２は比較的迅速に応答できるようになり、より効率的なデータディスカバリが可能になる。
【０１１５】
要するに、一部の実施形態は、リレーショナルデータベース管理システム２１２上にユーザインターフェース層１１００を有し、１）ユーザインターフェース層は、エンドユーザがダッシュボードを作成、編集、共有できるようにするセルフサービスエンドユーザダッシュボードを提供し、必要なＳＱＬクエリ（適宜サブスクリプションＳＱＬクエリを含む）をリレーショナルデータベース管理システムに送信し、２）テンポラル−リレーショナルデータベースを管理し、かつ同時ＳＱＬクエリ（サブスクリプションＳＱＬクエリを含む）をサポートするリレーショナルデータベース管理システムは、（ａ）重複クエリプランをサポートし、（ｂ）クエリプランを実行後にメモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に保存し、（ｃ）それらのクエリプランの中間ノードおよびルートノードにより特定されたテンポラルテーブルを実行後にメモリに保存し、（ｄ）増分実行を行って、それらのテンポラルテーブル、および最終的に、必要なＳＱＬクエリについてのクエリ結果を増分更新する。
【０１１６】
例示的な実装
以下で、クラスのインスタンス／オブジェクトを使用し、双方向クエリプラングラフを生成してダーティ通知有向グラフを生成してもよい実施形態について説明する。
【０１１７】
図１２は、一実施形態によるＤＴＴＮクラスのブロック図である。図１２は、ＤＴＴＮクラス１２０２が、１つまたは複数の記述子フィールド１２０４のセット、ＴＴ参照フィールド１２０６、子参照フィールド１２０８、最新リフレッシュ時間フィールド１２１０、およびＥｖａｌｕａｔｅメソッド１２１２を含むことを示す。記述子フィールド１２０４のセットは、図４のＬＱＰＮについて説明したものと同様の方法で実装することができる。前述したように、各ルートノードおよび中間ノードはＤＴＴＮクラス１２０２のインスタンス／オブジェクトであり、ＴＴ参照フィールド１２０６は、そのノードにより実行されたクエリプラン演算の結果を保存するテンポラルテーブルをカプセル化する派生テンポラルテーブルオブジェクトのうちの１つを特定する参照を保存するためのものである。子参照フィールド１２０８は、図４のＬＱＰＮについて説明したものと同様の方法で実装することができる（例えば、子ノード（すなわち、直系の子孫）への参照の一覧）。最新リフレッシュ時間フィールド１２１０は、クエリプラン演算が最後に実行された時間（言い換えると、クエリプランのノードであるＤＴＴＮクラス１２０２の所与のインスタンス／オブジェクトについて、Ｅｖａｌｕａｔｅメソッド１２１２に渡され、最新リフレッシュ時間フィールドに保存された最新のタイムスタンプ値を反映するタイムスタンプ）を保存するためのものである。
【０１１８】
Ｅｖａｌｕａｔｅメソッド１２１２は、ＤＴＴＮクラス１２０２の所与のインスタンス／オブジェクト（各ルートノードおよび中間ノードはＤＴＴＮクラス１２０２のインスタンス／オブジェクトである）により表されたクエリプラン演算（テンポラルテーブルに作用、少なくとも場合により、テーブルのテンポラルコンテンツ（例えば、一部の実施形態において、ｖａｌｉｄ＿ｆｒｏｍ列および／またはｖａｌｉｄ＿ｔｏ列のコンテンツの少なくとも一部）を使用するという点でテンポラル−リレーショナル代数演算を実行する）を行うように実行される。一実施形態において、Ｅｖａｌｕａｔｅメソッド１２１２は、評価開始時間を渡され、クエリプラン演算を実行する必要があると決定されると、１）その子ノードのＥｖａｌｕａｔｅメソッドを呼び出し、２）これらの呼出しからの返しにおいて、その子ノードのＢＴＴ／ＤＴＴにアクセスして（または、一部の実施形態において、そのようなＢＴＴ／ＤＴＴの読取専用ビューもしくは読取専用コピーを参照して）必要なデータレコードを入手し、３）そのＴＴ参照フィールド１２０６を参照して特定されたそれ自身のＤＴＴに対する更新を実行し、４）そのＤＴＴの読取専用ビューまたは読取専用コピーに参照を返す。Ｊａｖａなどの一部のプログラミング言語では、オブジェクトはデフォルトで参照により渡されるため、参照によりオブジェクトを渡すのに特別なプログラミングは必要ない。
【０１１９】
加えて、図１２は、破線のボックスにより、ＤＴＴＮクラス１２０２が、親参照フィールド１２１４、最新更新時間フィールド１２１６（ダーティタイムスタンプフィールドとも称する）、Ａｄｄ  Ｐａｒｅｎｔメソッド１２１８、およびＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０を含んでもよいことを示す。これら破線のボックスは、双方向クエリプラングラフを生成してダーティ通知有向グラフを作成する例示的な実装において使用される。親参照フィールド１２１４は、親ノード（すなわち、直系の先祖）への参照の一覧を保存するためのものである。最新更新時間フィールド１２１６は、クエリプラン演算が（直接的または間接的に）依存するＢＴＴが最後に更新された時間（言い換えると、クエリプランのノードであるＤＴＴＮクラス１２０２の所与のインスタンス／オブジェクトについて、そのノードが依拠するＢＴＴがダーティになった（修正された）ときを反映するタイムスタンプ）を保存するためのものである。Ａｄｄ  Ｐａｒｅｎｔメソッド１２１８は、親ノードにより、その親ノードを参照して（その親ノードの初期化中に）呼び出され、このメソッドは親ノードへの参照を親参照フィールド１２１４に保存する。したがって、親ノードの初期化中、各子ノードのこのメソッドを呼び出して親ノードへの参照を渡し、各子ノードのこのメソッドは、この親ノードへの参照をその子ノードの親参照フィールド１２１４に挿入し、これにより、双方向クエリプラングラフの作成を助けてダーティ通知有向グラフを生成する。所与のノードのＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０は子ノードにより呼び出され、その実行により、その所与のノードの最新更新時間フィールド１２１６を更新し、所与のノードの親参照フィールド１２１４にリストされた所与のノードの親ノード（あれば）のＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０を呼び出す。動作中、ＢＴＴが修正されると、ダーティ通知有向グラフを使用して、そのダーティ通知有向グラフのルートノード（例えば、修正されたＢＴＴをカプセル化するＢＴＴＮ）からそのダーティ通知有向グラフのリーフノード（クエリプランのルートノード）まで再帰呼出しを行うことにより、変更によって影響された各ノードを特定し、これにより、ダーティ表示が、中間ノードを通ってそのＢＴＴを消費するクエリプランのルートノードまで流れることができる。
【０１２０】
図１３は、一実施形態によるＢＴＴＮクラスのブロック図である。図１３は、ＢＴＴＮクラス１３０２が、１つまたは複数の記述子フィールド１３０４のセット、ＴＴ参照フィールド１３０６、Ｅｖａｌｕａｔｅメソッド１３１２、およびメソッド１３２２を含むことを示す。記述子フィールド１３０４フィールドのセットは、図４のＬＱＰＮについて説明したものと同様の方法で実装することができる。前述したように、各リーフノードはＢＴＴＮクラス１３０２のインスタンス／オブジェクトであり、ＴＴ参照フィールド１３０６は、そのリーフノードのテンポラルテーブル（すなわち、テンポラル−リレーショナルデータベースのテンポラルテーブル）をカプセル化するベーステンポラルテーブルオブジェクトのうちの１つを特定する参照を保存するためのものである。
【０１２１】
ＢＴＴＮクラス１３０２の所与のインスタンス／オブジェクトのＥｖａｌｕａｔｅメソッド１３１２は、所与のインスタンス／オブジェクトのＴＴ参照フィールド１３０６で特定されたＢＴＴの読取専用ビューまたは読取専用コピーへの参照を返す。
【０１２２】
メソッド１３２２は、データレコードの追加、データレコードの削除、および／または既存のデータレコードのコンテンツの変更（例えば、ＩＮＳＥＲＴ、ＵＰＤＡＴＥ、ＤＥＬＥＴＥ、および他の同様の演算でもよい）によって、そのノードにより特定されたテンポラルテーブルのコンテンツを修正するメソッド（各リーフノードはＢＴＴＮクラス１３０２のインスタンス／オブジェクトであり、テンポラルテーブルは、そのリーフノードのＴＴ参照フィールド１３０６により特定されたベーステンポラルテーブルオブジェクトによってカプセル化される）、ならびにテーブルを作成するメソッドを含み、テーブルのコンテンツではなくテーブル自体を変更する他のデータ定義言語（ＤＤＬ）の演算を含んでもよい。
【０１２３】
加えて、図１３は、ＢＴＴＮクラス１３０２が親参照フィールド１３１４およびＡｄｄ  Ｐａｒｅｎｔメソッド１３１８を含んでもよいことを示す。親参照フィールド１３１４は、親ノード（すなわち、直系の先祖）への参照の一覧を保存するためのものである。Ａｄｄ  Ｐａｒｅｎｔメソッド１３１８は、親ノードにより、その親ノードを参照して（その親ノードの初期化中に）呼び出され、このメソッドは親参照フィールド１３１４の親ノードへの参照を保存する。したがって、親ノードの初期化中、各子ノードのこのメソッドを呼び出して親ノードへの参照を渡し、各子ノードのこのメソッドは、この親ノードへの参照をその子ノードの親参照フィールド１３１４に挿入し、これにより、双方向クエリプラングラフの作成を助けてダーティ通知有向グラフを生成する。
【０１２４】
図１４は、一実施形態によるＴＴクラスのブロック図である。図１４は、ＴＴクラス１４０２が、ＴＴフィールド１４０６、１つまたは複数のｇｅｔ  ｒｏｗメソッドのセット（図示した実施形態において、Ｇｅｔ  Ｖａｌｉｄ  Ｒｏｗｓメソッド１４２４、Ｇｅｔ  Ｉｎｓｅｒｔｅｄ  Ｒｏｗｓメソッド１４２６、およびＧｅｔ  Ｄｅｌｅｔｅｄ  Ｒｏｗｓメソッド１４２８を含む）、ならびにメソッド１４２２を含むことを示す。各テンポラルテーブルがＴＴクラス１４０２のインスタンス／オブジェクト（本明細書において、派生テンポラルテーブル（ＤＴＴ）またはベーステンポラルテーブル（ＢＴＴ）と称する）によりカプセル化される場合、ＴＴフィールド１４０６はそのテンポラルテーブルを保存するためのものである。「Ｇｅｔ…Ｒｏｗｓ」メソッドは、ＴＴフィールド１４０６のテンポラルテーブルのデータにアクセスするために呼び出される。Ｇｅｔ  Ｖａｌｉｄ  Ｒｏｗｓメソッド１４２４は、タイムスタンプを渡され、そのタイムスタンプにより表された時間に有効なすべてのデータレコードを返し、初期クエリ結果を提供するためのものである。クエリプラン演算および／またはサブスクリプションＳＱＬクエリの増分実行をサポートする一実施形態において、Ｇｅｔ  Ｉｎｓｅｒｔｅｄ  Ｒｏｗｓメソッド１４２６およびＧｅｔ  Ｄｅｌｅｔｅｄ  Ｒｏｗｓメソッド１４２８を使用して、テンポラルテーブルへの変更（または「差分」）のみを返す。一実施形態において、これらのメソッドの各々は、２つのタイムスタンプを渡され、それらのタイムスタンプ間の時間にそれぞれ挿入または削除されたデータレコードを返す。Ｇｅｔ  Ｉｎｓｅｒｔｅｄ  Ｒｏｗｓメソッド１４２６は、２つのタイムスタンプを渡され、タイムスタンプにより表された２つの時間の間で挿入されたデータレコードを返し、Ｇｅｔ  Ｄｅｌｅｔｅｄ  Ｒｏｗｓメソッド１４２８は、２つのタイムスタンプを渡され、タイムスタンプにより表された２つの時間の間で削除されたデータレコードを返す。一実施形態は、図示した３つの「Ｇｅｔ…Ｒｏｗｓ」メソッドを実装するが、代替実施形態は、より多い、少ない、および／または異なるメソッド（例えば、単一のメソッド）を実装してもよい。上記のｖａｌｉｄ＿ｆｒｏｍおよびｖａｌｉｄ＿ｔｏの概念と同様に、理解を容易にするために、実施形態について、論理ビューおよび「１つまたは複数のｇｅｔ  ｒｏｗメソッドのセット」という用語（Ｇｅｔ  Ｖａｌｉｄ  Ｒｏｗｓメソッド１４２４、Ｇｅｔ  Ｉｎｓｅｒｔｅｄ  Ｒｏｗｓメソッド１４２６、およびＧｅｔ  Ｄｅｌｅｔｅｄ  Ｒｏｗｓメソッド１４２８として図示）を参照して説明したが、これらの用語の使用は行指向テンポラルテーブルのみを使用する実施形態に限定するものではなく、これらの用語の類義語は、ｇｅｔ  ｄａｔａ  ｒｅｃｏｒｄｓメソッド（例えば、Ｇｅｔ  Ｖａｌｉｄ  Ｄａｔａ  Ｒｅｃｏｒｄｓメソッド、Ｇｅｔ  Ｉｎｓｅｒｔｅｄ  Ｄａｔａ  Ｒｅｃｏｒｄｓメソッド、およびＧｅｔ  Ｄｅｌｅｔｅｄ  Ｄａｔａ  Ｒｅｃｏｒｄｓメソッドを含む）を含む。
【０１２５】
メソッド１４２２は、データレコードの追加、データレコードの削除、および／または既存のデータレコードのコンテンツの変更（例えば、ＩＮＳＥＲＴ、ＵＰＤＡＴＥ、ＤＥＬＥＴＥ、および他の同様の演算でもよい）によって、ＴＴフィールド１４０６のテンポラルテーブルのコンテンツを修正するメソッド、ならびにテーブルを作成するメソッドを含み、テーブルのコンテンツではなくテーブル自体を変更する他のデータ定義言語（ＤＤＬ）の演算を含む。一実施形態において、メソッド１４２２は、ＤＴＴＮクラス１２０２のＥｖａｌｕａｔｅメソッド１２１２および／またはＢＴＴＮクラス１３０２のメソッド１３２２により呼び出される。
【０１２６】
図１５は、一実施形態による図２の非クエリエグゼキュータ２２８のフロー図である。図１５は、異なる非クエリＳＱＬステートメントタイプが区別されるブロック１５０２から始まる。ＣＲＥＡＴＥ  ＴＡＢＬＥを有するＳＱＬステートメントの場合、制御はブロック１５０４へ進む。これに対して、データレコードの追加、データレコードの削除、および／または既存のデータレコードのコンテンツの変更によってテーブルのコンテンツを修正するＳＱＬステートメントの場合、制御はブロック１５１０へ進む。本発明の実施形態は、ブロック１５０４の非クエリＳＱＬステートメントタイプをさらに区別し、かつ／または追加の非クエリＳＱＬステートメントをサポートすることができる。
【０１２７】
ブロック１５０４では、ベーステンポラルテーブルが作成され、フローが終了する。一実施形態において、ブロック１５０４を２つの動作に分けてもよく、ベーステンポラルテーブルが作成されてから、ベーステンポラルテーブルノードが作成される。詳細には、ブロック１５０６で、ベーステンポラルテーブルが作成され（例えば、ＴＴクラス１４０２のインスタンス／オブジェクトがインスタンス化され）、制御はブロック１５０８へ進み、そこで、ベーステンポラルテーブルノード（ＢＴＴＮ）が作成され（例えば、ＢＴＴＮクラス１３０２のインスタンス／オブジェクトがインスタンス化され、ＢＴＴＮを初期化するために以下が実行される。１）記述子フィールド１３０４が入力される、２）ブロック１５０６で作成されたＢＴＴを参照してＴＴ参照フィールド１３０６が入力される、３）親参照フィールド１３１４を実装する実施形態において、「空」を示す値が親参照フィールド１３１４に保存される）。代替実施形態において、ＢＴＴＮが最初に作成され、そのＢＴＴを貪欲に（ＢＴＴＮがインスタンス化されるとき）またはレイジーに（例えば、ＩＮＳＥＲＴによりＢＴＴに書き込む必要があるとき）作成する。
【０１２８】
ブロック１５１０では、データレコードの追加、データレコードの削除、および／または既存のデータレコードのコンテンツの変更によりテーブルのコンテンツを修正するＳＱＬステートメントが実行され、フロー図が終了する。ＢＴＴＮを実装し、ＢＴＴＮを通してＢＴＴにアクセスする一実施形態において、ブロック１５１０はブロック１５１２を含み、ここでは、ＢＴＴＮのメソッド１３２２のうちの適切な１つが呼び出され、これによりＢＴＴのメソッド１４２２のうちの適切な１つを呼び出す。親参照フィールド１３１４およびＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０を実装する一実施形態において、ブロック１５１０は、親参照フィールド１３１４にリストされた親ノードのＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０を呼び出すことを含む。
【０１２９】
一実施形態において、ＳＱＬクエリの送信前に、ＳＱＬステートメントを送信してＳＱＬクエリに必要なベーステンポラルテーブル（ＢＴＴ）を作成（例えば、非クエリエグゼキュータ２２８によりＢＴＴおよびそれらのＢＴＴのＢＴＴＮを作成）すべきであり、そのようなＳＱＬクエリを含むＳＱＬステートメントの１つに応答して、パーサ２１８のタスクは、必要なＢＴＴが作成されたことを確認することを含む。
【０１３０】
図１６は、一実施形態による図２のクエリプランコネクタ２３２のフロー図である。前述したように、一実施形態において、ＳＱＬクエリの物理クエリプランの生成前に、そのＳＱＬクエリの論理クエリプランが生成され、論理クエリプランはクエリプランコネクタ２３２により使用される。そのような実施形態において、図１６はブロック１６０２から始まり、ここでは、論理クエリプランノードが論理クエリプランから現在の論理クエリプランノードとして選択される。
【０１３１】
制御はブロック１６０４へ進み、そこで、選択された論理クエリプランノードのノードキーがキャッシュ２３４にあるかどうかを判定する。一実施形態において、選択された論理クエリプランノードのノードキーが生成され、その後、そのノードキーがキャッシュ２３４にある（再利用／組込み可能な物理クエリプランノード、および場合によりサブグラフが既に存在することを示す）かどうかを判定する。ノードキーがキャッシュ２３４にある場合には、制御はブロック１６１２へ進み、そこで、すべての論理クエリプランノードが考慮されたかどうかを判定する。すべての論理クエリプランノードが考慮された場合には、制御はブロック１６１４へ進み、そこでフロー図は終了する。すべての論理クエリプランノードが考慮されていない場合には、制御はブロック１６０２に戻り、そこで、別の論理クエリプランノードが現在の論理クエリプランノードとして選択される。異なる実施形態は、論理クエリプランノードを異なる順序で選択することができる。例えば、一実施形態は、論理クエリプランのリーフノードの親ノードを選択することにより始まり、次いで、選択された論理クエリプランのノードの親ノードを選択するなどして、論理クエリプランのルートノードに到達する。したがって、この実施形態は「論理クエリプランを上にたどる」。別の実施形態は、論理クエリプランのルートノードを選択することにより始まり、その論理クエリプランノードのノードキーがキャッシュ２３４にある場合には、ＳＱＬクエリの物理クエリプランが既にメモリに存在するため物理クエリプランを生成する必要がないが、ノードキーがキャッシュ２３４にない場合には、論理クエリプランのリーフノードの親ノードを選択し、次いで、選択された論理クエリプランのノードの親ノードを選択するなどして、論理クエリプランのルートノードに到達する。したがって、論理クエリプランのルートノードが見つからない場合、この実施形態も「論理クエリプランを上にたどる」。別の実施形態は、論理クエリプランのルートノードを選択することにより始まり、その論理クエリプランノードのノードキーがキャッシュ２３４にある場合には、ＳＱＬクエリの物理クエリプランが既にメモリに存在するため物理クエリプランを生成する必要がないが、論理クエリプランのルートノードのノードキーがキャッシュ２３４にない場合には、現在の論理クエリプランノードの子ノードを選択するなどして、論理クエリプランのリーフノードに到達する。この実施形態は、論理クエリプランを「下にたどる」。
【０１３２】
ブロック１６０４で、選択された論理クエリプランノードのノードキーがキャッシュ２３４にないと判定された場合、制御はブロック１６０６へ進む。ブロック１６０６で、物理クエリプランノードがインスタンス化され、制御はブロック１６０８へ進む。一実施形態において、これは、ＤＴＴＮクラス１２０２のオブジェクトのインスタンス化を伴う。
【０１３３】
ブロック１６０８で、物理クエリプランノードが初期化される。ＤＴＴＮクラス１２０２のインスタンス／オブジェクトに関し、以下が実行される。１）記述子フィールド１２０４が入力される、２）ＴＴ参照フィールド１３０６に空を示す値が入力される、３）親参照フィールド１２１４を実装する実施形態において、空を示す値が親参照フィールド１２１４に保存される、４）論理クエリプランのノードを上にたどる実施形態において、選択された論理クエリプランノードの子ノードについて生成されたノードキーを使用するキャッシュ２３４のルックアップをベースとして、子参照フィールド１２０８が入力される、５）最新リフレッシュ時間フィールド１２１０に、「なし」を示す値（例えば０）が入力される、６）最新更新時間フィールド１２１６を実装する実施形態において、現在の時間が入力される、７）上にたどり、かつＡｄｄ  Ｐａｒｅｎｔメソッド１２８０、１３１８を実装する実施形態において、子参照フィールド１２０８の各子ノードのＡｄｄ  Ｐａｒｅｎｔメソッド１２１８または１３１８が、初期化されている物理クエリプランノードを参照して呼び出される。論理クエリプランを上にたどる実施形態を参照してブロック１６０８を説明したが、論理クエリプランノードを選択する他の手法の１つを取る実施形態は、別の時間に動作４および７を必要とする。ブロック１６０８から、制御はブロック１６１０へ進む。
【０１３４】
ブロック１６１０で、現在の論理クエリプランのノードキーおよびブロック１６０４でインスタンス化された物理クエリプランノードへの参照が、キャッシュ２３４のエントリに保存される。ブロック１６１０から、制御はブロック１６１２へ進む。
【０１３５】
図１７は、一実施形態によるクエリエグゼキュータ２４０のフロー図である。図１７はブロック１７０２から始まり、ここで、現在のＳＱＬクエリの時間（例えば、クライアントによりＳＱＬクエリが送られた時間（クライアントがこれと通信する方法を有すると仮定する）、ＳＱＬクエリがＲＤＢＭＳにより受信された時間、クエリプランの実行を開始する時間）に設定された評価開始時間を有する現在のクエリプラン（ルートＰＱＰＮ）のルートノードのＥｖａｌｕａｔｅメソッドが呼び出される。物理クエリプランのルートノード（ＤＴＴＮクラス１２０２のインスタンス／オブジェクト）のＥｖａｌｕａｔｅメソッド１２１２への呼出しにより、リーフＰＱＰＮ（ＢＴＴＮクラス１３０２のインスタンス／オブジェクト）に到達するまで、物理クエリプランのＰＱＰＮの再帰呼出しが行われ（各親がその子ノード（あれば）のＥｖａｌｕａｔｅメソッドを呼び出す）、そのような呼出しは、前述したように、ＤＴＴ／ＢＴＴのノードの読取専用ビューまたは読取専用コピーへの参照を返す。したがって、物理クエリプランのルートノードのＥｖａｌｕａｔｅメソッド１２１２は、最終的にルートノードのＤＴＴの読取専用ビューまたは読取専用コピーへの参照を返す。ブロック１７０２から、制御はブロック１７０４へ進む。
【０１３６】
ブロック１７０４で、現在のクエリプランのルートノードのＥｖａｌｕａｔｅメソッド１２１２により参照が返されたＤＴＴのＧｅｔ  Ｖａｌｉｄ  Ｒｏｗｓメソッド１４２４（Ｇｅｔ  Ｖａｌｉｄ  Ｄａｔａ  Ｒｅｃｏｒｄｓメソッドとも称することができる）を呼び出して、評価開始時間を渡す。ブロック１７０４から、制御はブロック１７０６へ進み、そこで、クライアントに送る初期クエリ結果が作成される。一実施形態において、ブロック１７０６は、Ｇｅｔ  Ｖａｌｉｄ  Ｒｏｗｓメソッド（Ｇｅｔ  Ｖａｌｉｄ  Ｄａｔａ  Ｒｅｃｏｒｄｓメソッドとも称することができる）によるデータレコードからテーブルのｖａｌｉｄ＿ｆｒｏｍ列およびｖａｌｉｄ＿ｔｏ列を除去（すなわちｖａｌｉｄ＿ｆｒｏｍフィールドおよびｖａｌｉｄ＿ｔｏフィールドを除去）して初期クエリ結果を作成することを含む。
【０１３７】
ブロック１７０６から、制御はブロック１７０８へ進み、そこで、現在の物理クエリプランのルートノードへの参照および初期クエリ結果が、ＳＱＬクエリを送信したクライアントに送るために提供される。一実施形態において、クエリエグゼキュータ２４０には単一のメソッドが実装され、この単一のメソッドは、現在の物理クエリプランのルートノードへの参照および初期クエリ結果を返す。この単一のメソッドは、１）ルートノードに返された参照が無視される、非サブスクリプションＳＱＬクエリの場合のプロセスクライアント通信マネージャ（ＰＣＣＭ）２１４、２）サブスクリプションＳＱＬクエリの場合のサブスクリプションマネージャ（本明細書で後述する）により呼び出される。代替実施形態において、複数のメソッドを使用して、クエリエグゼキュータ２４０を実装することができる。例えば、そのような一実施形態において、クエリエグゼキュータ２４０は２つの別個のメソッドとして実装され、一方は、非サブスクリプションＳＱＬクエリの場合のＰＣＣＭ２１４により呼び出され、初期クエリ結果を返し、現在の物理クエリプランのルートノードへの参照は返さないものであり、他方のメソッドは、サブスクリプションＳＱＬクエリの場合のサブスクリプションマネージャ（本明細書で後述する）により呼び出され、現在の物理クエリプランのルートノードへの参照および初期クエリ結果を返すものである。別のそのような実施形態において、クエリエグゼキュータ２４０は２つの別個のメソッドとして実装され、一方は、初期クエリ結果を返し、ＰＣＣＭ２１４およびサブスクリプションマネージャ（本明細書で後述する）の両方により呼び出されるものであり、他方は、現在の物理クエリプランのルートノードへの参照を返し、サブスクリプションマネージャ（ＰＣＣＭ２１４ではない）により呼び出されるものである。
【０１３８】
図１８は、一実施形態によるＥｖａｌｕａｔｅメソッド１２１２のフロー図である。これにより、物理クエリプランの現在のノードのＤＴＴＮ．Ｅｖａｌｕａｔｅメソッド１２１２が呼び出される。前述したように、Ｅｖａｌｕａｔｅメソッド１２１２は、呼び出されたときに、評価開始時間を渡される。図１８は決定ブロック１８０２から始まり、ここで、計算が必要であるかどうかを決定する。計算が必要でない場合、制御はブロック１８１６へ進み、計算が必要な場合には、制御はブロック１８０８へ進む。ブロック１８０２は、必要でない場合に実行（増分実行であっても完全再実行であっても）を避ける最適化（上記でスキップ更新と称する）である。
【０１３９】
一実施形態において、ブロック１８０２はブロック１８０４、１８０６を含む。ブロック１８０４で、評価開始時間が最新リフレッシュ時間よりも短い（すなわち、早い時間である）かどうかを判定する（Ｅｖａｌｕａｔｅメソッド１２１２に渡された評価開始時間を、現在のノードの最新リフレッシュ時間フィールド１２１０の時間と比較する）。短い場合には、制御はブロック１８１６へ進み、短くない場合には、制御はブロック１８０６へ進む。ブロック１８０４は、現在のノードのクエリプラン演算の実行を避けると共に、渡された評価開始時間の後に現在のノードがリフレッシュされた場合に、いずれかの子ノードのＥｖａｌｕａｔｅメソッドを呼び出す最適化である。例えば、これは、クエリプランの実行を並行してサポートする、かつ／またはクエリ実行を「過去の日付で」サポートする実施形態において行うことができる。ブロック１８０６で、最新リフレッシュ時間が最新更新時間よりも短い（すなわち、早い時間である）かどうかを判定する（最新更新時間フィールド１２１６を実装する実施形態において、現在のノードの最新リフレッシュ時間フィールド１２１０の時間が最新更新時間フィールド１２１６の時間よりも短いかどうかを判定する）。短い場合には、制御はブロック１８０８へ進み、短くない場合には、制御はブロック１８１６へ進む。ブロック１８０６は、最後のリフレッシュ後に更新が行われたかどうかを判定する、したがって現在のノードが、ダーティＢＴＴに（直接的または間接的に）依存する（すなわち、ノードの入力が変更されたことがわかっている）ためリフレッシュする必要があるかどうかを判定する最適化である。
【０１４０】
ブロック１８０８で、現在のノードの子参照フィールド１２０８の各ノードのＥｖａｌｕａｔｅメソッドを呼び出し、評価開始時間を渡す。ブロック１８０８から、制御はブロック１８１０へ進む。
【０１４１】
ブロック１８１０に示すように、呼び出された子ノードのＥｖａｌｕａｔｅメソッドにより参照が返されたＴＴオブジェクトのＧｅｔ  Ｉｎｓｅｒｔｅｄ  ＲｏｗｓメソッドおよびＧｅｔ  Ｄｅｌｅｔｅｄ  Ｒｏｗｓメソッド（Ｇｅｔ  Ｉｎｓｅｒｔｅｄ  Ｄａｔａ  ＲｅｃｏｒｄｓメソッドおよびＧｅｔ  Ｄｅｌｅｔｅｄ  Ｄａｔａ  Ｒｅｃｏｒｄｓメソッドとも称することができる）の１つまたは複数の呼出しが行われ、それらのメソッドに以下を渡す。１）増分挿入および削除されたデータレコードを検索するための、評価開始時間および現在のノードの最新リフレッシュ時間フィールド１２１０からの最新リフレッシュ時間（現在のノードがクエリプラン演算の増分実行をサポートする場合）、または２）挿入および削除されたすべてのデータレコードを検索するための、適切に遅い時間（例えば、最大値（評価開始時間、最新更新時間）、無限大）および適切に早い時間（例えば、０）（現在のノードがクエリプラン演算の増分実行をサポートしない場合、またはノードがクエリプラン演算の増分実行をサポートするが、それにもかかわらず、対応するクエリプラン演算（例えば、増分ＪＯＩＮ）を実行するために、挿入および削除されたすべてのデータレコードを必要とする場合）。前述したように、１つまたは複数のテンポラルテーブルのセットを入力として有するクエリプラン演算子の実行が、それらのテンポラルテーブルのうちの少なくとも１つから、増分挿入および削除されたデータレコードのみ（すべてのデータレコードとは対照的に差分）にアクセスすることを含む場合には、実行は「増分実行」となる。これに対して、１つまたは複数のテンポラルテーブルのセットを入力として有するクエリプラン演算子の実行が、セット内のすべてのテンポラルテーブルから、挿入および削除されたすべてのデータレコードにアクセスする必要がある場合には、実行は「完全実行」となる。増分実行、完全実行、または両方（両方の場合、可能であれば増分実行を行う）を行うように、所与のクエリプラン演算子を実装することができる。ブロック１８１０から、制御はブロック１８１２へ進む。
【０１４２】
ブロック１８１２で、現在のノードのクエリプラン演算が実行され、現在のノードにより特定された（ＴＴ参照フィールド１２０６において特定された）ＤＴＴに結果がマージされる。一実施形態において、現在のノードのＴＴ参照フィールド１２０６により特定されたＤＴＴのメソッド１３２２のうちの適切なものを呼び出すことにより、結果がマージされる。ブロック１８１２から、制御はブロック１８１４へ進む。
【０１４３】
ブロック１８１４で、現在のノードの最新リフレッシュ時間が、［最新更新時間フィールド１２１６が実装される場合には最新更新時間、または、実装されない場合には評価開始時間］に設定され、制御はブロック１８１６へ進む。
【０１４４】
ブロック１８１６で、現在のノードのＴＴ参照フィールド１２０６において特定されたＤＴＴの読取専用コピーまたは読取専用ビューへの参照が返される。
【０１４５】
図１９は、一実施形態によるメソッド１３２２のフロー図である。ブロック１９０２で、ＢＴＴは、テンポラルテーブルのコンテンツを修正することにより更新される。一実施形態において、ＢＴＴＮは、そのＢＴＴＮのＴＴ参照フィールド１３０６において特定されたＢＴＴのメソッド１４２２のうちの適切なものを呼び出し、この呼出しに応答して、ＢＴＴはＴＴフィールド１４０６のデータを更新する。ブロック１９０２から、制御はブロック１９０４へ進む。ブロック１９０４で、Ｎｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０を実装する実施形態において、ＢＴＴＮの親参照フィールド１３１４において特定されたノードのＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０を呼び出し、最新更新時間を渡す。
【０１４６】
図２０は、一実施形態によるＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０のフロー図である。ブロック２００２では、現在のノードの最新更新時間フィールド１２１６が、渡された最新更新時間に設定される。ブロック２００２から、制御はブロック２００４へ進み、そこで、現在のノードの親参照フィールド１２１４におけるノードのＮｏｔｉｆｙ  Ｄｉｒｔｙメソッドを呼び出し、最新更新時間を渡す。
【０１４７】
サブスクリプション
図２１は、一実施形態によるサブスクリプションＳＱＬクエリのフロー図である。ブロック２１０２では、ＲＤＢＭＳは、サブスクリプションＳＱＬクエリを受信したことに応答して、物理クエリプランを生成および実行し、物理クエリプランおよび派生テンポラルテーブルを実行後にメモリ（すなわち、揮発性メモリ、不揮発性メモリ、および／またはこれらの組合せ）に保存する。ブロック２１０２から、制御はブロック２１０４へ進み、そこで、サブスクリプションＳＱＬクエリを送信したクライアントに初期クエリ結果が送られる。ブロック２１０２、２１０４は前述した方法で実行することができる。ブロック２１０４から、制御はブロック２１０６へ進む。
【０１４８】
ブロック２１０６で、サブスクリプション更新の時間であることが判定される。サブスクリプション更新の目的は、テンポラル−リレーショナルデータベースの一部であり、かつサブスクリプションＳＱＬクエリがデータへのアクセスを必要とするテンポラルテーブルのうちの少なくとも所与の１つのコンテンツの修正に応答して、更新を提供することである。しかしながら、前述したように、異なる実施形態は、異なるタイミングで（例えば、前述したように、直ちに、また、レイジー更新をサポートする実施形態においては、１つまたは複数の事象が発生する（例えば、クエリ結果（例えば、初期または増分）をクライアントに送る必要がある、一定時間が経過する、プログラム可能な時間が経過する、ノードおよびエッジをベースとして（例えば、ノードと他のノードとの連結、ノードのタイプ、過去のノードの使用などをベースとして）計算された時間が経過する、他のＳＱＬクエリの到着率が閾値を超える、および／または使用可能な計算リソースが閾値を下回る）まで更新を遅延させる）、そのような修正に応答することができる。さらに、異なる実施形態は、ブロック２１０６を実行する担当を異なって割り当てることができる。例として、プッシュモデルの実施形態およびプルモデルの実施形態について本明細書で後述する。
【０１４９】
ブロック２１０６から、制御はブロック２１０８へ進み、そこで、実行後にメモリに保存された物理クエリプランおよび派生テンポラルテーブルを使用して増分クエリ結果が生成される。前述したように、増分実行を使用して、クエリプラン演算の完全再実行を避けることができ、スキップ更新を使用して、あるクエリプラン演算の実行を避けることができる。加えて、一実施形態において、クライアントに送られる増分クエリ結果は、既にクライアントに送られた結果に対する変更のみを含む（本明細書で、例示的な形式について後述する）。
【０１５０】
ブロック２１０８から、制御はブロック２１１０へ進み、そこで、サブスクリプションについての増分クエリ結果が、サブスクリプションＳＱＬクエリにサブスクライブされているクライアントに送られる。複数のクライアントが同一のＳＱＬクエリに同時にサブスクライブされていることをサポートする実施形態において、サブスクリプションによる増分クエリ結果を複数のクライアントに送ることができる。
【０１５１】
図２２は、一実施形態による、非サブスクリプションＳＱＬクエリおよびサブスクリプションＳＱＬクエリの両方をサポートするために追加のブロックを有するリレーショナルデータベース管理システム２１２を示すブロック図である。図２２は、図２における１）データベースドライバ２０４、ならびに２）プロセスクライアント通信マネージャ（ＰＣＣＭ）２１４、パーサ２１８、クエリエグゼキュータ２４０、物理クエリプラン２４２、テンポラル−リレーショナルデータベース２６２のベーステンポラルテーブル２６０、および派生テンポラルテーブル２６４を含むリレーショナルデータベース管理システム２１２を再現する。図２２はまた、サブスクリプションＳＱＬクエリを含むことのできるＳＱＬステートメント２１６を再現する。ＰＣＣＭ２１４は、そのようなサブスクリプションＳＱＬクエリ２２１８を、Ｓｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２およびＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４を含むサブスクリプションマネージャ２２２０に送る。一実施形態において、ＰＣＣＭ２１４は、サブスクリプションＳＱＬクエリを送っているクライアントのデータベースドライバ２０４のうちの１つから「Ｓｕｂｓｃｒｉｂｅ  Ｔｏ」遠隔手続き呼出しを受信し、ＰＣＣＭ２１４はＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２を呼び出して、サブスクリプションＳＱＬクエリを渡す。再び、矢印線はデータフローおよび／または接続などの何らかのタイプの結合を表す。
【０１５２】
Ｓｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２は、１）サブスクリプションＳＱＬクエリのＳＱＬクエリ部分（２２２８）をパーサ２１８に送信することにより、物理クエリプランを生成および実行し、２）結果として得られる初期クエリ結果をクエリエグゼキュータ２４０から受信し、３）ＰＣＣＭ２１４により、初期クエリ結果をサブスクリプション識別子（ＩＤ）と共に、サブスクリプションＳＱＬクエリを送信したクライアントに送る（クエリ結果およびサブスクリプションＩＤ２２１２参照）。一部の実施形態において、Ｓｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２は、サブスクリプションＳＱＬクエリごとに、現在のサブスクリプションの中で固有のサブスクリプションＩＤを生成し、そのサブスクリプションＩＤを（初期クエリ結果と共に）ＰＣＣＭ２１４に返して、サブスクリプションＳＱＬクエリを送ったクライアントについてのデータベースドライバ２０４のうちの１つに返し、データベースドライバは、クライアントのサブスクリプションＳＱＬクエリについてのサブスクリプションＩＤを保持する。代替実施形態において、サブスクリプションＳＱＬクエリが送られた「固有の接続」を特定するデータが、サブスクリプションＩＤとして使用される（すなわち、データベースドライバ２０４のうちの所与の１つにより送信されたサブスクリプションＳＱＬクエリごとの固有のＴＣＰ接続を使用することなどにより、「固有の接続」はクライアントとサブスクリプションＳＱＬクエリとの組合せを固有に特定する）。さらに、ＳＱＬステートメント２２２６により示したように、ＰＣＣＭ２１４は、前述の通り、（サブスクリプションＳＱＬクエリ２２１８のものではない）他のすべてのＳＱＬステートメント２１６をパーサ２１８に送信する。パーサ２１８は、前述の通り、内部表現２２６を生成する。
【０１５３】
Ｓｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２はまた、サブスクリプションＳＱＬクエリごとに、サブスクリプションオブジェクト２２３０にサブスクリプションオブジェクトを作成する。各サブスクリプションオブジェクト２２３０は、１）サブスクリプションＩＤ（識別子）フィールド２２３２を含んでもよく、２）ルートノード参照フィールド２２３４、３）最新サブスクリプション更新時間フィールド２２３６、４）Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８、および５）プッシュモデル（ダーティ通知グラフを必要とする）を使用する実施形態において、Ｎｏｔｉｆｙ  Ｄｉｒｔｙメソッド２２４０を含む。サブスクリプションＩＤフィールド２２３２は、追跡の目的で使用可能な、サブスクリプションのサブスクリプションＩＤを保存するためのものである。ルートノード参照フィールド２２３４は、サブスクリプションＳＱＬクエリについて生成された物理クエリプランのルートＰＱＰＮ（例えば、ＤＴＴＮ）の物理クエリプラン２４２における位置への参照を保存するためのものである。最新サブスクリプション更新時間フィールド２２３６は、サブスクリプションが最後に更新された時間を反映するタイムスタンプを保存するためのものである。Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８は、実行時に、ルートノード参照フィールド２２３４のルートノードにより特定された物理クエリプランを実行させる。Ｎｏｔｉｆｙ  Ｄｉｒｔｙメソッド２２４０は、ルートノード参照フィールド２２３４において特定されたルートノードからの呼出しに応答して実行され、この呼出しは、サブスクリプションＳＱＬクエリについてデータにアクセスするＢＴＴに対して修正が行われたことを表す。Ｎｏｔｉｆｙ  Ｄｉｒｔｙメソッド２２４０の実行により、Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８が実行される。サブスクリプションオブジェクトを初期化すると、サブスクリプションオブジェクトは、そのサブスクリプションオブジェクトを参照して、ルートノード参照フィールド２２３４のルートノードのＡｄｄ  Ｐａｒｅｎｔメソッド１２１８を呼び出し、このＡｄｄ  Ｐａｒｅｎｔメソッド１２１８は、そのルートノードの親参照フィールド１２１４におけるサブスクリプションオブジェクトへの参照を保存し、これにより、双方向クエリプラングラフの適切なルートノードの親ノードとしてサブスクリプションオブジェクトを追加することにより、サブスクリプションオブジェクトは生成されたダーティ通知有向グラフの一部となる。動作時に、ＢＴＴが修正されると、ダーティ通知有向グラフを使用して、そのダーティ通知有向グラフのルートノード（例えば、修正されたＢＴＴをカプセル化するＢＴＴＮ）からそのダーティ通知有向グラフのリーフノード（クエリプランの各ルートノードまたはそのルートノード上に追加されたサブスクリプションオブジェクト）まで再帰呼出しを行うことによって、修正により影響された各ノードを特定し、これにより、ダーティ表示が、中間ノードを通って、そのＢＴＴを消費するクエリプランのルートノードおよび／またはサブスクリプションオブジェクトまで流れることができる。
【０１５４】
Ｉｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４は、サブスクリプションＳＱＬクエリに対する増分更新の判定を容易にする。データベースドライバ２０４およびＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４は、本明細書で後述するプッシュモデルまたはプルモデルを実装する実施形態において異なって実装することができる。例えば、Ｉｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４は、プルモデルを実装する実施形態において、データベースドライバ２０４のＧｅｔ  Ｍｏｒｅ  Ｒｅｓｕｌｔｓメソッド（図示せず）により、更新が望まれるたびに、遠隔手続き呼出しによって呼び出すことができ、Ｉｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４は、プッシュモデルを実装する実施形態において、データベースドライバ２０４のＬｉｓｔｅｎメソッド（図示せず）のみによって呼び出すことができる。
【０１５５】
前述したように、一実施形態において、サブスクリプションＳＱＬクエリのクエリプラン、およびそのクエリプランのノードにより特定された派生テンポラルテーブルは、少なくとも、そのサブスクリプションＳＱＬクエリを送信したクライアントがそのサブスクリプションＳＱＬクエリについてのクローズサブスクリプションメッセージを送信するまで、実行後にメモリに保存される。そのようなクローズサブスクリプションメッセージは、例えば、クローズするサブスクリプションＳＱＬクエリを特定するサブスクリプションＩＤを含むことができる。一実施形態において、ＰＣＣＭ２１４はまた、そのようなクローズサブスクリプションメッセージ（図示せず）をサブスクリプションマネージャ２２２０に送り、サブスクリプションマネージャ２２２０は、１）物理クエリプランの１つまたは複数のノードを実行後にメモリに保存する必要がなくなったかどうかを判定し、これらのノードの除去およびキャッシュ２３４内の対応するエントリの除去（例えば、キャッシュ２３４からの対応するエントリの除去）を可能にする必要な措置を行い、２）そのサブスクリプションＳＱＬクエリについてのサブスクリプションオブジェクトを削除する。
【０１５６】
図２３は、一実施形態によるＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２のフロー図である。ブロック２３０２で、サブスクリプションＳＱＬクエリが受信され、制御はブロック２３０４へ進む。ブロック２３０４で、サブスクリプションＳＱＬクエリのＳＱＬクエリ部分が実行される。一実施形態において、この実行は、例えば、サブスクリプションＳＱＬクエリの初期実行を調整するＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２からの呼出しに応答して、ＳＱＬクエリの物理クエリプランを生成および実行することを含む（パーサ２１８、クエリリライタ２２４、クエリオプティマイザ２３０（クエリプランコネクタ２３２を含む）、およびクエリエグゼキュータ２４０を伴い、したがって、生成は、前述した既存のノードおよびエッジの再利用／組込みを含むことができ、実行は増分実行を含むことができる）。ブロック２３０４から、制御はブロック２３０６へ進む。
【０１５７】
ブロック２３０６で、クエリエグゼキュータ２４０からサブスクリプションＳＱＬクエリの物理クエリプランのルートノードへの参照を受信したことに応答して、サブスクリプションオブジェクトが作成され初期化される。一実施形態において、この初期化は、１）実装されると、サブスクリプションＩＤをサブスクリプションＩＤフィールド２２３２に保存する、２）物理クエリプランのルートノードへの参照をルートノード参照フィールド２２３４に保存する、３）最新サブスクリプション更新時間フィールド２２３６に十分に早い時間を保存して、最初のサブスクリプション更新時にすべての更新が確実に取り込まれるようにする（例えば、結果テーブルのｖａｌｉｄ＿ｆｒｏｍタイムスタンプおよびｖａｌｉｄ＿ｔｏタイムスタンプの最大値）、ならびに４）Ａｄｄ  Ｐａｒｅｎｔメソッド１２８０、１３１８を実装する実施形態において、ルートノード参照フィールド２２３４のルートノードのＡｄｄ  Ｐａｒｅｎｔメソッド１２１８が、初期化されているサブスクリプションオブジェクトを参照して呼び出される。
【０１５８】
ブロック２３０６から、制御はブロック２３０８へ進む。ブロック２３０８で、クエリエグゼキュータ２４０から初期クエリ結果を受信したことに応答して、初期クエリ結果がＰＣＣＭ２１４に提供されて、サブスクリプションＳＱＬクエリを送信したクライアントに送られる。
【０１５９】
図２４Ａは、プルモデルを実装する実施形態によるＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４のフロー図である。本実施形態において、ＲＤＢＭＳクライアントは、先に送信されたサブスクリプションＳＱＬクエリに対する更新が望ましいと判定するたびに、データベースドライバ２０４のＧｅｔ  Ｍｏｒｅ  Ｒｅｓｕｌｔｓメソッドを呼び出す。Ｇｅｔ  Ｍｏｒｅ  Ｒｅｓｕｌｔｓメソッドにより、サブスクリプションＳＱＬクエリの増分更新のためにＲＤＢＭＳ２１２への遠隔手続き呼出し（ＲＰＣ）を行う（サブスクリプションＩＤがＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２により生成された値である実施形態において、サブスクリプションＩＤはデータベースドライバにより送られ、サブスクリプションＳＱＬクエリを送った固有の接続をサブスクリプションＩＤデータが特定する実施形態において、ＲＰＣはその固有の接続を通して行われる。これは、サブスクリプションＳＱＬクエリ送信に関連してクライアントとＰＣＣＭ２１４との間に接続が先に確立されているため、接続自体を使用してサブスクリプションＳＱＬクエリを特定することができるからである）。これに応答して、ＰＣＣＭ２１４はＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４を呼び出して、サブスクリプションＩＤを渡す。ブロック２４０２で、そのような呼出しはＰＣＣＭ２１４から受信され、制御はブロック２４０４へ進む。
【０１６０】
ブロック２４０４で、サブスクリプションＩＤにより特定されたサブスクリプションオブジェクトのＳｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８が呼び出される。一実施形態において、サブスクリプションマネージャ２２２０は、サブスクリプションＩＤをサブスクリプションオブジェクト２２３０にマッピングするデータ構造（例えば、テーブル）を維持するが、代替実施形態は、他のタイプの周知の機構を使用して、サブスクリプションオブジェクト２２３０のうちの適切な１つを位置決めすることができる。ブロック２４０４から、制御はブロック２４０６へ進む。
【０１６１】
ブロック２４０６に示すように、サブスクリプションオブジェクトのＳｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８から増分クエリ結果を受信したことに応答して、増分クエリ結果がＰＣＣＭ２１４に返されて、先に送信されたサブスクリプションＳＱＬクエリに対する更新を望むクライアントに送られる。一実施形態において、増分クエリ結果がＰＣＣＭ２１４（接続を管理し、クライアントにより呼び出された）によりクライアントに送られるが、別の実施形態において、Ｉｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッドは、サブスクリプションＳＱＬクエリを送った固有の接続を介して（例えば、サブスクリプションＩＤがサブスクリプションＳＱＬクエリを送った固有の接続を特定するデータである実施形態において、サブスクリプションＩＤを使用して）増分クエリ結果をクライアントに送る。
【０１６２】
図２４Ｂは、プッシュモデルを実装する実施形態によるＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４のフロー図である。第１のそのような実施形態において、サブスクリプションＳＱＬクエリの送信後、クライアントコードは、データベースドライバ２０４のＬｉｓｔｅｎメソッドを一度呼び出して、サブスクリプションＳＱＬクエリに対するプッシュベースの更新を受信する。Ｌｉｓｔｅｎメソッドは、特定のサブスクリプションＳＱＬクエリについてＲＤＢＭＳ２１２に対して遠隔手続き呼出し（ＲＰＣ）を行う（サブスクリプションＩＤがＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２により生成された値である実施形態においては、サブスクリプションＩＤはデータベースドライバ２０４により送られ、サブスクリプションＩＤがサブスクリプションＳＱＬクエリを送った固有の接続を特定するデータである実施形態においては、サブスクリプションＩＤを送る必要がない。これは、サブスクリプションＳＱＬクエリの送信に応答して、クライアントとＰＣＣＭ２１４との間に接続が先に確立されているため、接続自体がサブスクリプションＳＱＬクエリを特定するからである）。これに応答して、ＰＣＣＭ２１４は、サブスクリプションＳＱＬクエリを送った接続を特定するデータ（前述した一部の実施形態においては、サブスクリプションＩＤであり、サブスクリプションＩＤがＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２により生成された値である実施形態においては、サブスクリプションＩＤも送られる）を含むＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４を呼び出す。ブロック２４１２で、そのような呼出しがＰＣＣＭ２１４から受信され、制御はブロック２４１４へ進む。この段落で説明した第１の実施形態において、サブスクリプションＩＤはＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２からＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４へ、クライアントコードを通して間接的に提供されるが、代替実施形態は異なって動作する。例えば、そのような１つの代替実施形態において、ブロック２３０２は、データベースドライバ内のコールバックメソッド（関数ポインタ、関数オブジェクトなどとしてＬｉｓｔｅｎメソッドなどに渡すことのできる「Ｏｎ  Ｄａｔａ  Ｕｐｄａｔｅ」メソッドなど）を特定するデータを含み、ブロック２３０８は、クライアントコードを通すのとは対照的に、サブスクリプションＩＤをＲＤＢＭＳ２１２内でＳｕｂｓｃｒｉｂｅ  Ｔｏメソッド２２２２からＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４へ（例えば、Ｉｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッドへの引数として、共有メモリの領域を介して、他のプロセス間通信機構を介してなど）提供することを含む。この場合、ブロック２４１２は、クライアントコードのＬｉｓｔｅｎメソッドからのＲＰＣに応答する、ＰＣＣＭを通したリッスンへの呼出しを伴わない。
【０１６３】
ブロック２４１４で、サブスクリプションオブジェクトおよび接続情報を含むサブスクリプションスレッドが作成され、サブスクリプションスレッドは、１）適切なサブスクリプションオブジェクト２２３０のルートノード参照フィールド２２３４におけるルートノードのＡｄｄ  Ｐａｒｅｎｔメソッド１２１８を呼び出して、参照をそのサブスクリプションオブジェクトに渡し、Ａｄｄ  Ｐａｒｅｎｔメソッド１２１９（前述した）は、サブスクリプションオブジェクトへの参照をそのルートノードの親参照フィールド１２１４に保存し、２）サブスクリプションオブジェクトのＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０がルートノードのＮｏｔｉｆｙ  Ｄｉｒｔｙメソッドにより呼び出されるのを待ってスリープ状態となる。ブロック２４１４から、制御はブロック２４１６へ進む。
【０１６４】
ブロック２４１６に示すように、ルートノードのＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド１２２０からサブスクリプションオブジェクトのＮｏｔｉｆｙ  Ｄｉｒｔｙメソッド２２４０（最新更新時間を渡される）を呼び出すことによりサブスクリプションスレッドを呼び起こすたびに、サブスクリプションスレッドは、サブスクリプションオブジェクトのＳｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８を呼び出し（Ｎｏｔｉｆｙ  Ｄｉｒｔｙメソッド２２４０により渡された最新更新時間をＳｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８に渡し）、その後、Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８から（例えば、データベースドライバ（例えばＲＰＣ）からのブロック呼出しにより、データベースドライバにより確立された固有の接続を通してデータを送ることにより（例えば、ＲＰＣストリーミングにより）など）増分クエリ結果を受信したことに応答して、ＳＱＬクエリにサブスクライブされたクライアントに対して増分クエリ結果をプッシュし、その後、スリープ状態に戻る。一実施形態において、増分クエリ結果がＰＣＣＭ２１４（接続を管理し、クライアントにより呼び出された）によりクライアントに送られるが、別の実施形態において、Ｉｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４は、Ｉｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４への呼出しにおいて特定された固有の接続により（例えば、サブスクリプションＩＤがサブスクリプションＳＱＬクエリを送った固有の接続を特定するデータである実施形態において、サブスクリプションＩＤを使用して）、増分クエリ結果をクライアントに送る。ブロック２３０２がデータベースドライバのコールバックメソッドを特定するデータを含む実施形態において、データベースドライバは、そのコールバックメソッドを呼び出して、増分クエリ結果をそのようなメソッドに提供する。
【０１６５】
図２５は、一実施形態によるＳｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８のフロー図である。このフロー図は、前記プルモデルおよびプッシュモデルを使用する実施形態において使用することができる。ブロック２５０２で、サブスクリプションオブジェクトのルートノード参照フィールド２２３４により特定されたルートノードのＥｖａｌｕａｔｅメソッド１２１２を呼び出して、評価開始時間を渡す。異なる実施形態は、評価開始時間を異なって設定することができる（例えば、現在の時間（例えば、このメソッドを呼び出すシステム時間、クライアントがＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッドを呼び出す時間（メソッド呼出しが送られる場合）、プルモデルにおいてＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッドへの呼出しが（例えば、ＰＣＣＭ）により受信される時間）に設定され、かつプッシュモデルにおいて最新更新時間に設定される）。ブロック２５０２から、制御はブロック２５０４へ進む。
【０１６６】
ブロック２５０４で、呼び出されたルートノードのＥｖａｌｕａｔｅメソッドにより参照またはビューが返されたＴＴオブジェクトのＧｅｔ  Ｉｎｓｅｒｔｅｄ  ＲｏｗｓメソッドおよびＧｅｔ  Ｄｅｌｅｔｅｄ  Ｒｏｗｓメソッド（Ｇｅｔ  Ｉｎｓｅｒｔｅｄ  Ｄａｔａ  ＲｅｃｏｒｄメソッドおよびＧｅｔ  Ｄｅｌｅｔｅｄ  Ｄａｔａ  Ｒｅｃｏｒｄメソッドと称することもできる）を呼び出して、それらのメソッドに、評価開始時間およびサブスクリプションオブジェクトの最新サブスクリプション更新時間フィールド２２３６からの最新サブスクリプション更新時間を渡す。ブロック２５０４から、制御はブロック２５０６へ進む。
【０１６７】
ブロック２５０６で、増分クエリ結果が作成される。一実施形態において、増分クエリ結果はクライアントに送られる変更一覧である。一実施形態において、変更一覧は、変更（すなわち、先に計算されたクエリ結果を表す（対応するクエリプランのルートノードにより特定された）テンポラルテーブルに対する変更）ごとに、１）そのようなテンポラルテーブルの対応するデータレコードの各列の値、２）変更タイプ（例えば、挿入または削除）、および３）変更の時間を特定するタイムスタンプを含む。一実施形態において、変更一覧は、１）「ｖａｌｉｄ＿ｆｒｏｍ」列および「ｖａｌｉｄ＿ｔｏ」列を除去すること、２）変更タイプを保存する「変更タイプ」列（データレコードが挿入されたか削除されたかをデータレコードごとに示す）を追加すること、および３）変更時間を特定するタイムスタンプ（データレコードがいつ挿入または削除されたかをデータレコードごとに示す）を保存する「変更時間」列を追加することにより、ブロック２５０４において返されたデータレコードから生成される。ブロック２５０６から、制御はブロック２５０８へ進む。
【０１６８】
ブロック２５０８で、サブスクリプションオブジェクトの最新サブスクリプション更新時間フィールド２２３６が、［プルモデルの実施形態においては評価開始時間、または、プッシュモデルの実施形態においては最新更新時間］に更新される。ブロック２５０８から、制御はブロック２５１０へ進む。
【０１６９】
ブロック２５１０で、ＳＱＬクエリにサブスクライブされたクライアントに、増分クエリ結果が送られる。プルモデルを使用する実施形態において、Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８がサブスクリプションマネージャ２２２０のＩｎｃｒｅｍｅｎｔａｌ  Ｕｐｄａｔｅメソッド２２２４により呼び出され、増分クエリ結果が、サブスクリプションマネージャ２２２０を通してクライアントに送り返される（増分クエリ結果をＰＣＣＭ２１４を通してクライアントに送ることができ、またはサブスクリプションマネージャ２２２０への呼出しにおいて特定された固有の接続によりクライアント自身に送ることができる）。プルモデルを使用する代替実施形態は異なって動作することができる（例えば、Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８は、増分クエリ結果を、Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８への呼出しにおいて特定された固有の接続によりクライアント自身に送ることができる）。同様に、プッシュモデルを使用する実施形態において、増分クエリ結果をクライアントに送る担当が変化してもよい（例えば、サブスクリプションスレッドは、増分クエリ結果をＰＣＣＭ２１４に送り、ＰＣＣＭ２１４が増分クエリ結果をクライアントに送ることができる、Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８は、増分クエリ結果を、Ｓｕｂｓｃｒｉｐｔｉｏｎ  Ｕｐｄａｔｅメソッド２２３８への呼出しにおいて特定された固有の接続によりクライアント自身に送ることができる）。
【０１７０】
例示的な使用事例
上記実施形態を様々に組み合わせて、ある使用事例を満たすことができる。例として、１つの使用事例は、金融市場における漸進的リスク集約である。この使用事例は、通常、ダッシュボードを使用する異なるユーザ電子デバイスにおける複数のエンドユーザにより、略リアルタイムのデータと大量の過去のデータ（長期ビューを提供するため）との組合せの複雑な解析を行う必要がある。ある実施形態は、この使用事例を、図１１のユーザインターフェース層１１００およびリレーショナルデータベース管理システム２１２によりサポートする。詳細には、ユーザインターフェース層１１００は、異なるエンドユーザ電子デバイス上の複数の、実際には多数のエンドユーザに同一のダッシュボードを同時に提示する（これにより、同時に重複する複数のクエリプランが得られる）ことを含むダッシュボードの使用をサポートし、ある実施形態において、ダッシュボードを作成、編集、共有し、データディスカバリを可能にするセルフサービスエンドユーザダッシュボードの使用をサポートする。リレーショナルデータベース管理システム２１２（ある実施形態において、イン−メモリおよび解析リレーショナルデータベース管理システムである）は、テンポラル−リレーショナルデータベースを管理し、複数のクライアントを同時にサポートするサーバであり、複数のＳＱＬクエリ（サブスクリプションＳＱＬクエリを含む）を同時にサポートし、クエリプラン（ルートＰＱＰＮおよび中間ＰＱＰＮを含む）を実行後にメモリに保存し、それらのクエリプラン（ルートＰＱＰＮおよび中間ＰＱＰＮを含む）の派生テンポラルテーブルを実行後にメモリに保存し、重複クエリプラン（中間ＰＱＰＮおよびリーフＰＱＰＮの共有を含む）をサポートし、少なくともあるクエリプラン演算子についての増分クエリプラン実行をサポートする。したがって、一部のそのような実施形態において、ダッシュボードのコンテンツ要素を略リアルタイムで更新することができる。比較的大きいクエリ深さのＳＱＬクエリについてのものを含むこの略リアルタイムのパフォーマンスは、金融市場における漸進的リスク集約に特に適している。加えてまたはあるいは、一部の実施形態において、ＲＤＢＭＳ２１２はトランザクションＲＤＢＭＳであり、テンポラルテーブル（ＢＴＴおよびＤＴＴ）は列指向構成を使用してメモリに保存される。
【０１７１】
さらに、あるそのような実施形態において、ユーザインターフェース層１１００は、ＢＩクエリ言語に依拠するセルフサービスエンドユーザダッシュボードをサポートし、ＢＩサービス１１０２は、そのような言語をリレーショナルデータベース管理システム２１２に送信する前にＳＱＬステートメント（ＳＱＬクエリを含む）に変換する。そのような一実施形態において、本明細書に記載されたように、ＢＩクエリ言語およびＳＱＬの両方がサブスクリプションをサポートするように拡張されて、ＢＩクエリ言語サブスクリプションが、リレーショナルデータベース管理システム２１２に送信されるサブスクリプションＳＱＬクエリに変換されるようになっている。
【０１７２】
例示的な電子デバイス
実施形態の１つまたは複数の部分は、ソフトウェア、ファームウェア、および／またはハードウェアの異なる組合せを使用して実装することができる。電子デバイスは、コード（ソフトウェア命令から構成され、コンピュータプログラムコードまたはコンピュータプログラムと称することがある）および／またはデータを、機械可読記憶媒体（例えば、磁気ディスク、光ディスク、読取専用メモリ（ＲＯＭ）、フラッシュメモリ、相変化メモリ、ソリッドステートドライブ（ＳＳＤ））、および機械可読伝送媒体（キャリアとも称する）（例えば、電気信号、光信号、無線信号、音響信号、または搬送波、赤外線信号などの他の形式の伝搬信号）などの機械可読媒体（コンピュータ可読媒体とも称する）を使用して、保存し送信する（内部におよび／またはネットワークを通して他の電子デバイスに）ことができる。したがって、電子デバイス（例えば、コンピュータ）は、プロセッサのセットで実行するためのコードを保存し、かつ／またはデータを保存するための１つまたは複数の機械可読記憶媒体に接続された、１つまたは複数のプロセッサのセットなどのハードウェアおよびソフトウェアを含む。例えば、電子デバイスは、コードを含む不揮発性メモリ（より遅い読み書き時間を有する。例えば、磁気ディスク、光ディスク、読取専用メモリ（ＲＯＭ）、フラッシュメモリ、相変化メモリ、ＳＳＤ）を含むことができる。これは、電子デバイスをオフにしたとき（電力を除去したとき）でも、不揮発性メモリがコード／データを持続することができるからである。一方、電子デバイスをオンにしたときには、その電子デバイスのプロセッサにより実行されるコードの部分が、電子デバイスの不揮発性メモリから揮発性メモリ（例えば、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、スタティックランダムアクセスメモリ（ＳＲＡＭ））にコピーされる。これは、揮発性メモリがより速い読み書き時間を有する（演算するすべてのデータのうちの一部もこの揮発性メモリに保存される）からである。別の例として、電子デバイスは、電子デバイスをオフにしたときにコード／データを保存するための不揮発性メモリ（例えば、相変化メモリ）を含むことができ、その同一の不揮発性メモリは、十分に速い読み書き時間を有し、実行されるコードの部分を揮発性メモリにコピーするのではなく、コード／データをプロセッサに直接提供する（例えば、プロセッサのキャッシュにロードする）ことができるようになっている。言い換えると、この不揮発性メモリは長期記憶装置およびメインメモリの両方として動作し、したがって、電子デバイスは、メインメモリとしてＤＲＡＭをまったく有していないか、または少しだけ有していればよい。一般的な電子デバイスはまた、他の電子デバイスとのネットワーク接続を確立する（伝搬信号を使用してコードおよび／またはデータを送信および／または受信する）ために、１つまたは複数の物理ネットワークインターフェースのセットを含む。
【０１７３】
図２６は、一実施形態による電子デバイス２６０４を示す。図２６は、１つまたは複数のプロセッサ２６４２のセットおよび１つまたは複数のネットワークインターフェース２６４４（無線および／または有線）のセット、ならびにソフトウェア２６５０を保存した非一過性の機械可読記憶媒体２６４８を含む、ハードウェア２６４０を含む。前述したエンドユーザクライアント、ＢＩサービス、およびリレーショナルデータベース管理システム２１２の各々は、１つまたは複数の電子デバイス２６０４に実装することができる。一実施形態において、各エンドユーザクライアントは、別々の電子デバイス２６０４（例えば、エンドユーザにより操作されるエンドユーザ電子デバイス。この場合、そのような各エンドユーザ電子デバイスのソフトウェア２６５０は、データベースドライバ２０４のうちの１つを含む、エンドユーザクライアントのうちの１つを実装するためのソフトウェア、および／またはＢＩサービス１１０２（例えば、ＡＰＩ、ウェブブラウザ、ネイティブクライアント、ＢＩポータル、コマンドラインインターフェースなど）とインターフェース接続するソフトウェアを含む）に実装され、リレーショナルデータベース管理システム２１２は、１つまたは複数の電子デバイス２６０４の別のセットに実装され（この場合、ソフトウェア２６５０はリレーショナルデータベース管理システム２１２を実装するためのソフトウェアである）、動作時に、エンドユーザ電子デバイスおよびＲＤＢＭＳを実装する電子デバイスは、相互に接続され（例えば、ネットワークにより）、デバイス間に（または、１つまたは複数の他の層（例えば、ＲＤＢＭＳを実装する１つまたは複数の電子デバイスのセットとは別個の、これと重複する、またはこれと同一の１つまたは複数の電子デバイスのセットに実装可能なＢＩサービス（この場合、ソフトウェア２６５０は、ＢＩサービスを実装するためのソフトウェアを含む））を通して）、ＳＱＬクエリをＲＤＢＭＳ２１２に送信しクエリ結果を返すための前記接続を確立する。電子デバイスの他の構成を他の実施形態（例えば、エンドユーザクライアント、ＢＩサービス（使用する場合）、およびＲＤＢＭＳが単一の電子デバイスに実装される実施形態）で使用してもよい。
【０１７４】
計算仮想化を使用する電子デバイスにおいて、プロセッサ２６４２は、通常、仮想化層２６５４およびソフトウェアコンテナ２６６２Ａ〜２６６２Ｒをインスタンス化するためのソフトウェアを実行する（例えば、オペレーティングシステムレベルの仮想化について、仮想化層２６５４は、１つまたは複数のアプリケーションのセットを実行するために各々使用可能な複数のソフトウェアコンテナ２６６２Ａ〜２６６２Ｒ（別個のユーザ空間インスタンスおよび呼び出された仮想化エンジン、仮想専用サーバ、またはｊａｉｌを表す）の作成を可能にするオペレーティングシステムのカーネル（またはベースオペレーティングシステム上で実行するシム）を表す。完全仮想化について、仮想化層２６５４は、ハイパバイザ（仮想マシンモニタ（ＶＭＭ）と称することがある）またはホストオペレーティングシステム上で実行するハイパバイザを表し、ソフトウェアコンテナ２６６２Ａ〜２６６２Ｒは、ハイパバイザにより動作し、かつゲストオペレーティングシステムを含むことのできる、仮想マシンと称するしっかりと隔離された形式のソフトウェアコンテナを各々表す。準仮想化について、仮想マシンで動作するオペレーティングシステムまたはアプリケーションは、最適化の目的で仮想化の存在を認識することができる）。再び、計算仮想化を使用する電子デバイスで、動作中、ソフトウェア２６５０のインスタンス（インスタンス２６７６Ａとして示す）が仮想化層２６５４のソフトウェアコンテナ２６６２Ａ内で実行される。計算仮想化を使用しない電子デバイスでは、ホストオペレーティングシステム上のインスタンス２６７６Ａは「ベアメタル」電子デバイス２６０４上で実行される。インスタンス２６７６Ａ、ならびに仮想化層２６５４およびソフトウェアコンテナ２６６２Ａ〜２６６２Ｒ（実装する場合）のインタンス化を、まとめてソフトウェアインスタンス２６５２と称する。
【０１７５】
電子デバイスの代替実施形態は、前述した実施形態の多数の変形形態を有することができる。例えば、カスタマイズされたハードウェアおよび／またはアクセラレータを電子デバイスにおいて使用してもよい。
【０１７６】
代替実施形態
図中のフロー図は、ある実施形態により実行される動作の特定の順序を示すが、そのような順序は例示的なものである（例えば、代替実施形態は、動作を異なる順序で実行する、ある動作を組み合わせる、ある動作を並行して実行するなどしてもよい）。
【０１７７】
加えて、本発明についていくつかの実施形態に関して説明したが、本発明は、記載された実施形態に限定されず、添付の特許請求の範囲の精神および範囲内で修正および変更を伴って実施することができることを当業者は理解するだろう。したがって、説明は限定的なものではなく例示的なものであるとみなすべきである。
【図１】
0006850907.tif 000002
【図２】
0006850907.tif 000003
【図３Ａ】
0006850907.tif 000004
【図３Ｂ】
0006850907.tif 000005
【図３Ｃ】
0006850907.tif 000006
【図４】
0006850907.tif 000007
【図５Ａ】
0006850907.tif 000008
【図５Ｂ】
0006850907.tif 000009
【図６】
0006850907.tif 000010
【図７Ａ】
0006850907.tif 000011
【図７Ｂ】
0006850907.tif 000012
【図８】
0006850907.tif 000013
【図９】
0006850907.tif 000014
【図１０】
0006850907.tif 000015
【図１１】
0006850907.tif 000016
【図１２】
0006850907.tif 000017
【図１３】
0006850907.tif 000018
【図１４】
0006850907.tif 000019
【図１５】
0006850907.tif 000020
【図１６】
0006850907.tif 000021
【図１７】
0006850907.tif 000022
【図１８】
0006850907.tif 000023
【図１９】
0006850907.tif 000024
【図２０】
0006850907.tif 000025
【図２１】
0006850907.tif 000026
【図２２】
0006850907.tif 000027
【図２３】
0006850907.tif 000028
【図２４Ａ】
0006850907.tif 000029
【図２４Ｂ】
0006850907.tif 000030
【図２５】
0006850907.tif 000031
【図２６】
0006850907.tif 000032