1 Oracle CQLの概要
Oracle Continuous Query Language (Oracle CQL)は、ストリーミング・データをサポートする構文が追加されたSQLベースの問合せ言語です。Oracle CQLを使用すると、GoldenGate Stream Analytics (GGSA)を使用してデータ・ストリームに対する問合せを表現できます。
1.1 Oracle CQLの基本
データベースは、格納された有限のデータ・セットに対して問合せを実行するために最適化されています。ただし、最近の多くのアプリケーションは、連続的な無制限のデータ・セットに対して問合せを長時間実行する必要があります。設計上、格納されたデータ・セットは、データの大部分が繰り返し問い合され、更新頻度が比較的低い場合に向いています。これとは対照的に、データ・ストリームは、新規要素の挿入を通じて継続的に、通常は排他的に変化するデータを表します。データの大部分を複数回操作することは、不要であるか、実用的ではありません。
センサー・データ・アプリケーション、財務表示、ネットワーク性能測定ツール、ネットワーク監視およびトラフィック管理アプリケーション、クリックストリーム分析ツールなどの多くの種類のアプリケーションでは、データ・セットのかわりにデータ・ストリームが生成されます。これらの種類のアプリケーション・データを管理および処理する際は、厳密な時間によるフォーカスを使用して、データ管理および問合せ機能を作成します。
こうした要件に対応するために、構造化データ・レコードのストリームと格納されたリレーションの概念をサポートするデータ管理インフラストラクチャのGoldenGate Stream Analytics (GGSA)が導入されました。
統一的な宣言フレームワークを提供するために、データのストリーミングをサポートするコンストラクトが追加されたSQLに基づく問合せ言語のOracle Continuous Query Language (Oracle CQL)が提供されています。
Oracle CQLは次の理念に基づいて設計されています。
-
連続するデータ・ストリームと従来の格納されたデータ・セットに対する大量の問合せをサポートするスケーラビリティ。
-
複雑なシナリオを扱う包括性。たとえば、構成を通じて、問合せの様々な中間ビューを作成できます。
GGSAを使用すると、JMS、リレーショナル・データベース表、ローカル・ファイル・システムのファイルなどの各種データ・ソースに対するイベント・アダプタを定義できます。複数の入力チャネルをOracle CQLプロセッサに接続したり、Oracle CQLプロセッサを複数の出力チャネルに接続できます。出力チャネルを別のOracle CQLプロセッサ、アダプタ、キャッシュまたはイベントBeanに接続できます。
これらの要素の詳細は、次の項を参照してください。
1.1.1 ストリームとリレーション
Oracle CQLを使用して、ストリームとリレーションの次の操作を実行できます。
-
ストリームからリレーションへの演算子(ウィンドウ): ストリームからのリレーションの作成
-
ストリームからストリームへの演算子: 1つ以上の他のストリームからのストリームの作成。
1.1.1.1 Streams
ストリームは、Oracle CQL問合せでの操作の対象となる主なデータ・ソースです。
ストリームS
は要素のバッグ(またはマルチセット)(s,T)
のバッグです。s
はS
のスキーマを持ち、T
は時間ドメインに属します。
ストリーム要素は、タイムスタンプのタプル挿入のシークエンスとして表すタプル・タイムスタンプ・ペアです。つまり、ストリームは、タイムスタンプされたタプルのシークエンスです。同じタイムスタンプを持つ複数のタプルがある場合があります。入力ストリームのタプルは、タイムスタンプの昇順にシステムに到着する必要があります。詳細は、「時間」を参照してください。
ストリームには名前付き属性のセットで構成される関連付けられたスキーマがあり、ストリームのすべてのタプルはスキーマに準拠しています。
「ストリームのタプル」という用語はストリーム要素のデータ部分(タイムスタンプ・データは除く)の順序付きリストを表します(<s,t>
のs
)。次の例は、株価表示データ・ストリームがどのように表示されるかを示しています。各ストリーム要素は、<timestamp value>
、<stock symbol>
および<stock price>
で構成されます。
... <timestampN> NVDA,4 <timestampN+1> ORCL,62 <timestampN+2> PCAR,38 <timestampN+3> SPOT,53 <timestampN+4> PDCO,44 <timestampN+5> PTEN,50 ...
ストリーム要素<timestampN+1> ORCL,62
では、タプルはORCL,62
です。
定義により、ストリームは無制限です。
1.1.1.2 リレーションとGoldenGate Stream Analyticsタプルの種類インジケータ
デフォルトでは、GGSAで生成されるリレーションには、タイム・スタンプとGGSAタプルの種類インジケータが含まれます。
Timestamp Tuple Kind Tuple 1000: + ,abc,abc 2000: + hihi,abchi,hiabc 6000: - ,abc,abc 7000: - hihi,abchi,hiabc 8000: + hi1hi1,abchi1,hi1abc 9000: + ,abc,abc 13000: - hi1hi1,abchi1,hi1abc 14000: - ,abc,abc 15000: + xyzxyz,abcxyz,xyzabc 20000: - xyzxyz,abcxyz,xyzabc
GGSAタプルの種類インジケータは次のとおりです:
-
挿入タプルの場合は
+
-
削除タプルの場合は
-
-
更新タプルの場合は
U
1.1.2 ストリームからリレーションへの演算子(ウィンドウ)
Oracle CQLでは、スライディング・ウィンドウに基づいた、ストリームからリレーションへの演算がサポートされています。通常、S[W]
はリレーションです。時間T
のリレーションには、T
までにストリームS
に適用されたウィンドウW
のすべてのタプルが含まれます。
同じソース(ストリーム)とウィンドウ指定を持つ問合せは、共通のメモリー領域を共有するために最適化されます。これらのパラメータで新しい問合せが追加されると、この共有ウィンドウのコンテンツ(イベント)が自動的に受信されます。この最適化により、問合せは、新しく追加されたイベントを受信していない場合でも初期イベントを出力できます。
window_type::=
図1-1 window_type

Oracle CQLでは、次の種類の組込みウィンドウがサポートされています。
-
Range: 時間ベース
S[Range T]
またはオプションで、S[Range T1 Slide T2]
-
Range: 時間ベース(無制限)
S[Range Unbounded]
-
Range: 時間ベース(現在)
S[Now]
-
Range: 定数値
S[Range C on ID]
-
タプルベース:
S[Rows N]
またはオプションで、S[Rows N1 Slide N2]
-
パーティション化:
S[Partition By A1 ... Ak Rows N]
またはオプションで、S[Partition By A1 ... Ak Rows N Range T]
またはS[Partition By A1 ... Ak Rows N Range T1 Slide T2]
この項では、ストリームからリレーションへの演算子の次のプロパティについて説明します。
詳細については、以下を参照:
1.1.2.1 Range、RowおよびSlide
キーワードRange
およびRows
は問合せで操作するデータの量を指定します。
-
Range
では指定の期間内に到着するタプルの数が指定されます。 -
Rows
ではタプルの数が指定されます。
Slideキーワードは、問合せからの出力を参照する頻度を、Rangeキーワードは、問合せイベントまでの時間の範囲を指定します。RangeとSlideを一緒に使用すると、問合せを行うイベントのセットになり、そのセットは、問合せウィンドウのスライド先に基づいて変わります。
したがって、セット時間は、問合せのためにイベントが取り出される時間です。時間間隔は、スライドのために指定した時間で割った実際の時間(イベントのタイムスタンプで測定)です。ここからの残りが0ならば、セット時間は、スライドに指定した時間を掛けた時間間隔です。残りが0より大きい場合、セット時間はスライドに指定した時間を時間間隔+ 1に掛けた値になります。
これを別の方法で表すと、timeInterval = actualTime / slideSpecification if((actualTime % slideSpecification) == 0) // No remainder setTime = timeInterval * slideSpecification else setTime = (timeInterval + 1) * slideSpecification
という式になります。
図1-2で、Range
の指定は「4秒間に相当するデータを参照する必要がある」ことを示し、Slide
の指定は「4秒ごとに結果が必要である」ことを示します。この場合、各Slide
の指定の終わりに問合せで結果が返されます(「問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide」で説明されている特定の条件を除く)。
図1-2で、Range
の指定は「8秒間に相当するデータを参照する必要がある」ことを示し、Slide
の指定は「4秒ごとに結果が必要である」ことを示します。この場合、各Range
の指定中に2回、問合せで結果が返されます(「問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide」で説明されている特定の条件を除く)。
表1-1は、範囲ベースとタプル・ベースのストリームからリレーションへのウィンドウ演算子に関するデフォルトのRange
、Range
の単位およびSlide
(該当する場合)のリストです。
表1-1 デフォルトのRangeおよびタプルベースのストリームからリレーションへの演算子
ウィンドウ演算子 | デフォルトのRange | デフォルトのRange単位 | デフォルトのSlide |
---|---|---|---|
|
|
1ナノ秒 |
|
該当なし |
該当なし |
1タプル |
1.1.2.1.1 問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide
表1-2は、問合せ開始時の時間や空のリレーションなど、特定の場合のRange
、Rows
およびSlide
の動作のリストです。
表1-2 問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide
演算子または関数 | 結果 |
---|---|
|
空のリレーションの場合、 |
|
空のリレーションの場合、 |
詳細および例は、次を参照してください。
1.1.2.2 パーティション
キーワードPartition By
では、Partition By
で指定された属性の同一性に基づいて、データ・ストリームS
が異なるサブストリームに論理的に分割されます。たとえば、S[Partition By A,C Rows 2]
のように分割を指定すると、A
とC
の値のペアの固有な組合せごとにサブストリームが作成され、それらのサブストリームに対してRows
の指定が適用されます。Rows
の指定は、「2タプルに相当するデータを参照する必要がある」ことを示します。
詳細は、「Range、RowおよびSlide」を参照してください。
1.1.2.3 デフォルトのストリームからリレーションへの演算子
Oracle CQL問合せにおいて、リレーションが予想される場所でストリームを参照する際(一般に、from
句で)、デフォルトでストリームにRange Unbounded
ウィンドウが適用されます。たとえば、次の例の問合せは同一です。
<query id="q1"><![CDATA[ select * from InputChannel ]]></query>
<query id="q1"><![CDATA[ IStream(select * from InputChannel[RANGE UNBOUNDED]) ]]></query>
1.1.3 ストリームからストリームへの演算子
一般に、ストリームからストリームへの演算は、次のように実行します。
-
ストリームからリレーションへの演算子によって、ストリームをリレーションに変換します。詳細は、「ストリームからリレーションへの演算子(ウィンドウ)」を参照してください。
詳細については、以下を参照:
また、Oracle CQLでは、次に示すストリームからストリームへの直接的な演算子がサポートされています:
-
MATCH_RECOGNIZE
: この句を使用して、入力ストリームの各種のパターン認識問合せを作成します。詳細は、「パターン認識」を参照してください。
1.1.4 パターン認識
Oracle CQL MATCH_RECOGNIZE
コンストラクトは、パターン認識を実行するための主な手段です。
入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQLのパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれるString
名を使用してこれらの条件を識別できます。照合されるパターンは、これらの相関変数に対する正規表現として指定され、様々な着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序が決定されます。
詳細は、「MATCH_RECOGNIZEを使用したパターン認識」を参照してください。
1.1.5 関数
ファンクションは、データ項目を操作し、結果を戻すという点で演算子に似ています。ファンクションと演算子は引数を指定する書式が異なります。次の書式によって、ファンクションでは0(ゼロ)以上の引数を操作できます。
function(argument, argument, ...)
引数を持たない関数は疑似列と同じです(「疑似列」を参照)。ただし、疑似列ではリレーションの各タプルで異なる値が返されますが、引数を持たない関数では各タプルに対して通常は同じ値が返されます。
Oracle CQLには、ストリーム・データの操作を実行する、次のような広範な組込み関数が用意されています。
-
問合せのストリームまたはビューの各行ごとに単一の結果行を返す単一行関数
-
単一のタプルのかわりにタプルのグループに基づいて単一の集計結果を返す集計関数
-
Coltオープン・ソース・ライブラリに基づいた、高性能な科学技術計算のための単一行の統計的かつ高度な算術演算
-
Coltオープン・ソース・ライブラリに基づいた、高性能な科学技術計算のための集計の統計的かつ高度な算術演算
-
java.lang.Math
クラスに基づいた統計的かつ高度な算術演算
Oracle CQL関数の所定のデータ型以外のデータ型の引数でOracle CQL関数を呼び出した場合、GGSAではOracle CQL関数を実行する前に、その引数を所定のデータ型に変換しようと試みます。
Oracle CQLには、Coltオープン・ソース・ライブラリに基づいた、高性能な科学技術計算のための様々な組込みの単一行関数および集計関数が用意されています。Coltライブラリの一部として使用可能な関数は、Big Decimalデータ型またはNULL入力値はサポートしません。また、関数の値計算は増分形式ではありません。詳細は、COLTのWebサイトを参照してください。
ノート:
関数名では、大/小文字が区別されます。
-
組込み関数: 小文字のみを使用できます。
詳細については、以下を参照:
1.1.6 時間
タイムスタンプはGGSAストリームの重要な部分です。ただし、タイプスタンプは必ずしもクロック・タイムと同じである必要はありません。たとえば、アプリケーション・ドメインで時間を定義し、シーケンス番号で表すことができます。タイムスタンプは、タイムスタンプの値が増加する順に更新がシステムに到着することだけを保証するよう要求されます。
タイムスタンプの順序の要件は、1つのストリームまたはリレーションに固有のものです。たとえば、異なるストリームのタプルは任意の順序で相互配置できます。同じタイムスタンプのタプルの処理順序は、複数ストリームを処理している場合は保証されません。さらに、負のタイムスタンプの動作は定義されていません。t = 0の場合、全順序を想定してイベントはただちに出力されます。
GGSAでは、処理時間とイベント時間を監視できます。
システムがタイムスタンプを付けたリレーションまたはストリームでは、時間は、リレーションまたはストリームのソース上のデータの受信に依存します。指定された時間(たとえば1分)が経過してもアクティビティが発生しない(ストリームまたはリレーションのソースにデータが到着しない)場合、GGSAではシステムのタイムスタンプが付いたリレーションまたはストリームでハートビートが生成されます。リレーションまたはストリームに指定のソースが移入されるか、GGSAによってハートビートが1分ごとに生成されます。これにより、リレーションまたはストリームの遅れが1分を超えることはなくなります。
システム・タイムスタンプを持つストリームとリレーションの場合、2つのイベントが同じ時間値を持つことがないようにシステムによって時間が割り当てられます。ただし、アプリケーション・タイムスタンプを持つストリームとリレーションの場合は、イベントが同じ時間値を持つ場合があります。