1.6 キャラクタ・ラージ・オブジェクト(CLOB)処理のプッシュダウンについて
Hadoopデータに対する問合せには、レコード数が数百万になる可能性があるラージ・オブジェクトの処理を伴うことがあります。こうしたオブジェクトをフィルタ処理や解析のためにOracle Databaseに戻すことは非効率です。Oracle Big Data SQLでは、Hadoopクラスタ上の専用処理セルにCLOBの処理をプッシュ・ダウンすることで大幅なパフォーマンス向上を実現できます。Hadoopでフィルタ処理すると、Oracle Databaseに戻す行の数が少なくなります。解析することで、フィルタ処理した各行内の列から返されるデータの量が少なくなります。
CLOB処理はユーザーのニーズに適合するように無効化または再有効化できます。
現在のリリースでは、この機能は現時点でCLOBデータを返すJSON式にのみ適用されます。ストレージ・レイヤーの評価に適格なJSONフィルタ式には、単純化された構文のJSON_VALUEおよびJSON_QUERYが含まれます。
将来のリリースでは、その他のCLOB型(substrやinstrなど)に加えてBLOBデータにも同じサポートが提供されます。
Oracle Big Data SQLは、次に示すサイズ制約の範囲内で、HadoopにCLOBの処理をプッシュ・ダウンできます。
-
CLOB列のフィルタリングは最大サイズが1 MB。
ストレージ・サーバーでの評価に利用できる実際のデータ量は、使用される文字セットに応じて異なることがあります。
-
列の解析は最大32 KB。
この制限は、CLOBデータ型のストレージからの選択リストの投影を表します。
列のサイズがこれらの2つの値を超える場合にのみ、処理がOracle Databaseに戻されます。
例1-3 JSONドキュメントの処理
{"ponumber":9764,"reference":"LSMITH-20141017","requestor":"Lindsey Smith","email”: “Lindsey@myco.com”, “company”:”myco” …}
CREATE TABLE POS_DATA
( pos_info CLOB )
ORGANIZATION EXTERNAL
( TYPE ORACLE_HDFS
DEFAULT DIRECTORY DEFAULT_DIR
LOCATION ('/data/pos/*')
)
REJECT LIMIT UNLIMITED;
SELECT p.pos_info.email, p.pos_info.requestor
FROM POS_DATA p
WHERE p.pos_info.company=’myco’
この問合せ例では、次の2つのデータ除外の最適化が実施されます。
-
データは、Hadoopクラスタ内のOracle Big Data SQLセルでフィルタ処理されます。「myco」という会社に関連するレコードのみが解析されます(解析後、該当するレコードから選択されたデータのみがデータベースに返されます)。
-
クラスタ内のOracle Big Data SQLセルは、フィルタ処理されたレコードのセットを解析して、各レコードから要求された2つの属性(
p.pos_info.email
とp.pos_info.requestor
)の値のみがデータベースに返されます。
次の表では、CLOB処理のプッシュダウンがサポートされる別の例を示します。前述したように、投影(CLOB列の選択側のリファレンス)は32 KBのCLOBデータに制限されていて、述語のプッシュダウンは1 MBのCLOBデータに制限されています。
問合せ | コメント |
---|---|
SELECT count(*) FROM pos_data p WHERE pos_info is json; |
この場合、述語によりJSON形式に準拠する列のみが返されるようになります。 |
SELECT pos_info FROM pos_data p WHERE pos_info is json; |
前の場合と同じ述語ですが、CLOB値が投影されるようになっています。 |
SELECT json_value(pos_info, '$.reference') FROM pos_data p WHERE json_value(pos_info, '$.ponumber') > 9000 |
ここでは、述語はJSONドキュメントのフィールドに対して発行されます。また、投影されたCLOB JSON値の上部にあるフィールド"reference"を取得するJSON値も実行しています。 |
SELECT p.pos_info.reference FROM pos_data p WHERE p.pos_info.ponumber > 9000; |
これは前の例と同様に機能しますが、簡略化された構文で表現されています。 |
SELECT p.pos_info.email FROM po_data p WHERE json_exists(pos_info, '$.requestor') and json_query(pos_info, '$.requestor') is not null; |
この例は、述語としてjson_exists とjson_query も使用できるようにする方法を示しています。
|