カテゴリ:

システム関数 (システム情報)

SYSTEM$STREAM_HAS_DATA

指定されたストリームに変更データキャプチャ(CDC)レコードが含まれているかどうかを示します。

構文

SYSTEM$STREAM_HAS_DATA('<stream_name>')
Copy

引数

stream_name

クエリするストリームの名前です。

  • データベースとスキーマ(名前が完全修飾されている場合)を含む、名前全体を一重引用符で囲む必要があります。つまり、 '<データベース>.<スキーマ>.<ストリーム名>'

  • ストリーム名で大文字と小文字が区別されるか、特殊文字やスペースが含まれる場合、大文字と小文字の処理には二重引用符が必要です。二重引用符は、一重引用符で囲む必要があります。例: '"<ストリーム名>"'

使用上の注意

  • この関数は、タスクの定義の WHEN 式で使用することを目的としています。指定されたストリームに変更データが含まれていない場合、タスクは現在の実行をスキップします。このチェックは、ウェアハウスを不必要に開始または再開することを回避するのに役立ちます。ただし、この関数はフォールスネガティブ(つまり、ストリームに変更データが含まれている場合でもfalse値を返す)を回避するように設計されています。しかし、この関数は、誤検知の回避を保証するものでは ありません (つまり、ストリームに変更データが含まれていない場合にtrue値を返す)。

  • この関数は、テーブルバージョンメタデータの差分(ストリームオフセットと現在のトランザクション時間の間)を実行して、ストリームに CDC の記録が含まれているかどうかを判断します。その期間中のテーブルの DML アクティビティが、挿入、オプションで更新、削除される同じ行セットで構成され、元のテーブル状態に戻った場合、ストリームに CDC 記録が含まれていない場合でも、この関数は TRUE 値を返す可能性があります。

  • 入力がビューストリームの場合、 基になるテーブル の変更に対する変更データキャプチャ(CDC)が記録すると、戻り値は TRUE になります。この関数は、ビュー自体ではなく、基になるテーブルのバージョンメタデータに対して差分を実行します。ソースビュー定義のクエリが、変更された基になるテーブルの行を参照していない場合、結果は誤検知になります。ビューがより選択的になるにつれて、誤検知の割合が増加します。

    この関数がタスク定義のオプションの WHEN パラメーターで参照されている場合、誤検知率が高いということは、テーブルストリームが関数の入力である場合よりも、ビューストリームが空の場合にタスクが実行される可能性があることを意味します。ただし、このチェックでは、基になるテーブルデータに変更がない場合でも、タスクの実行は回避されます。

  • ストリームが空で、 SYSTEM$STREAM_HAS_DATA 関数が FALSE を返す場合、ストリーム上でこの関数を呼び出すことで古くなるのを防ぐことができます。

  • この関数が TRUE を返す場合、誤検知か実際の変更データかに関係なく、 DML 操作でストリームを使用する必要があります。ストリームを消費しない場合、この関数は TRUE を返し続け、 WHEN 句でこの関数を使用するタスクは実行をスキップしません。その結果、不要なタスクの実行とウェアハウスの料金が発生します。

    結果が誤検知の場合にストリームを効率的に消費するには、たとえば、 ストリームをクエリしても記録が返されない場合、次の例のようなステートメントを使用します。

    CREATE TEMPORARY TABLE _unused_table AS SELECT * FROM my_stream WHERE 1=0;
    
    Copy

    CREATE TABLE AS SELECT は DML トランザクションであるため、このステートメントはストリームを消費する DML 操作としてカウントされます。WHERE 1=0 句はすべてのデータをフィルターするため、何も処理または保存されません。この操作はストリームオフセットを進め、および新しい変更が行われるまで SYSTEM$STREAM_HAS_DATAFALSE を返します。

    または、ストリーム上で通常のデータ処理ロジック --- INSERT、 UPDATE、 MERGE またはその他 DML ステートメント --- を実行します。これはまた、ストリームを消費し、ストリームに変更記録が含まれていない場合でも、オフセットを進めます。

create table MYTABLE1 (id int);

create table MYTABLE2(id int);

create stream MYSTREAM on table MYTABLE1;

insert into MYTABLE1 values (1);

-- returns true because the stream contains change tracking information
select system$stream_has_data('MYSTREAM');

+----------------------------------------+
| SYSTEM$STREAM_HAS_DATA('MYSTREAM')     |
|----------------------------------------|
| True                                   |
+----------------------------------------+

 -- consume the stream
begin;
insert into MYTABLE2 select id from MYSTREAM;
commit;

-- returns false because the stream was consumed
select system$stream_has_data('MYSTREAM');

+----------------------------------------+
| SYSTEM$STREAM_HAS_DATA('MYSTREAM')     |
|----------------------------------------|
| False                                  |
+----------------------------------------+
Copy