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 Streams

ストリームは、Oracle CQL問合せでの操作の対象となる主なデータ・ソースです。

ストリームSは要素のバッグ(またはマルチセット)(s,T)のバッグです。sSのスキーマを持ち、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およびSlide: 等しい(定常状態条件)

図1-2の説明が続きます。
「図1-2 RangeおよびSlide: 等しい(定常状態条件)」の説明

図1-2で、Rangeの指定は「8秒間に相当するデータを参照する必要がある」ことを示し、Slideの指定は「4秒ごとに結果が必要である」ことを示します。この場合、各Rangeの指定中に2回、問合せで結果が返されます(「問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide」で説明されている特定の条件を除く)。

図1-3 RangeおよびSlide: 異なる(定常状態条件)

図1-3の説明が続きます
「図1-3 RangeおよびSlide: 異なる(定常状態条件)」の説明

表1-1は、範囲ベースとタプル・ベースのストリームからリレーションへのウィンドウ演算子に関するデフォルトのRangeRangeの単位およびSlide(該当する場合)のリストです。

表1-1 デフォルトのRangeおよびタプルベースのストリームからリレーションへの演算子

ウィンドウ演算子 デフォルトのRange デフォルトのRange単位 デフォルトのSlide

範囲ベースのストリームからリレーションへのウィンドウ演算子

Unbounded

seconds

1ナノ秒

タプルベースのストリームからリレーションへのウィンドウ演算子

該当なし

該当なし

1タプル

1.1.2.1.1 問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide

表1-2は、問合せ開始時の時間や空のリレーションなど、特定の場合のRangeRowsおよびSlideの動作のリストです。

表1-2 問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide

演算子または関数 結果

COUNT(*)またはCOUNT(expression)

空のリレーションの場合、RangeまたはRowsに相当するデータの累積前、および最初のSlide前にすぐに0を返します(GROUP BYがない場合)。

SUM(attribute)および他の集計関数

空のリレーションの場合、RangeまたはRowsに相当するデータの累積前、および最初のSlide前にすぐにnullを返します。

詳細および例は、次を参照してください。

1.1.2.2 パーティション

キーワードPartition Byでは、Partition Byで指定された属性の同一性に基づいて、データ・ストリームSが異なるサブストリームに論理的に分割されます。たとえば、S[Partition By A,C Rows 2]のように分割を指定すると、ACの値のペアの固有な組合せごとにサブストリームが作成され、それらのサブストリームに対して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つのイベントが同じ時間値を持つことがないようにシステムによって時間が割り当てられます。ただし、アプリケーション・タイムスタンプを持つストリームとリレーションの場合は、イベントが同じ時間値を持つ場合があります。

1.2 Oracle CQLとSQL標準

Oracle CQLは新しいテクノロジですが、SQL99のサブセットに基づいています。

Oracleでは業界に受け入れられた標準への準拠に努め、SQL標準調査会に積極的に参加しています。OracleではOracle CQLの標準化を積極的に推進しています。