現状ではSnowflakeアダプターをご利用する際には下記のような注意事項があります。
■共通
マルチセレクトオプション(旧CDataオプション)の利用上の共通的な注意事項については下記をご参照ください。
■動作環境
- ASTERIA Warp 2206以降
■アダプターの動作
- SnowflakeSQLCallコンポーネントでは、ストアドプロシージャからの戻り値を取得することはできません。
- SnowflakeのVARIANT型のフィールドへデータを追加・更新する場合は、SnowflakeSQLCallコンポーネントを使用し、to_variant関数を経由させて追加・更新する必要があります。SnowflakePutコンポーネントでは、VARIANT型のフィールドへデータを追加・更新することはできません。コンポーネント上では設定できたように見えますが、フロー実行時に「 SQLコンパイルエラー:式型が列データ型と一致しません」といったエラーが発生します。
- SnowflakeのOBJECT型のフィールドへデータを追加・更新する場合は、SnowflakeSQLCallコンポーネントを使用し、object_construct関数を経由させて追加・更新する必要があります。SnowflakePutコンポーネントでは、OBJECT型のフィールドへデータを追加・更新することはできません。コンポーネント上では設定できたように見えますが、フロー実行時に「 SQLコンパイルエラー:式型が列データ型と一致しません」といったエラーが発生します。
- SnowflakeのARRAY型のフィールドへデータを追加・更新する場合は、SnowflakeSQLCallコンポーネントを使用し、array_construct関数を経由させて追加・更新する必要があります。SnowflakePutコンポーネントでは、ARRAY型のフィールドへデータを追加・更新することはできません。コンポーネント上では設定できたように見えますが、フロー実行時に「 SQLコンパイルエラー:式型が列データ型と一致しません」といったエラーが発生します。
- SnowflakeのDATE型のフィールドは、フロー側ではDateTime型として取り扱われます。データを追加・更新する際には時刻情報は切り捨てられます。データを取得する際には時刻部分は00:00:00となります。
- SnowflakeのTIME型のフィールドは、フロー側ではDataTime形として取り扱われます。データを追加・更新する際には日付情報は切り捨てられます。データを取得する際には日付部分は1970-01-01となります。
- SnowflakeのFLOAT型には `NaN` `inf` `-inf` という特別な値がありますが、これらには対応しておりません。
- SnowflakeSQLCallコンポーネントを用いてDDLを実行する場合、使用するコネクションの詳細設定でQuery Passthroughプロパティをtrueに設定する必要があります。Query Passthroughプロパティを設定しないまたはfalseに設定したコネクションを用いてDDLを実行した場合、本来の仕様と異なるデータ型でフィールドが作成されるなど、意図しない動作をする可能性があります。ただし、Query Passthroughプロパティをtrueに設定した場合は、ドライバ独自のクエリ構文 *1 が使用できません。
- SnowflakeのGEOGRAPHY型のフィールドは、検索キーやソートキーとしては使用できません。SQLビルダーでの設定は可能ですが、フロー実行時にエラーとなります。
- SnowflakePutコンポーネントでデータの追加を実施するとき、バッチ件数プロパティが2以上に設定されている場合、データが追加される順番は保証されません。順番が入れ替わる場合があります。
- SnowflakePutコンポーネントでデータの追加を実施するとき、バッチの繰り返し回数が多くなった場合に「Your session expired.」 のようなエラーが発生する場合があります。明確な再現条件はありませんが、「1バッチあたりの処理件数100件・データ総件数10,000件」「1バッチあたりの処理件数1件・データ総件数100件」など、バッチ回数がおよそ100回を超える場合に発生しやすくなる傾向があります。
- ASTERIA Warp 2306までのバージョンでは、言語が日本語に設定されたSnowflake環境においてデータの更新ができない場合があります。言語が英語に設定された環境ではこの問題は発生しません。ASTERIA Warp 2312以降のバージョンではこの問題は解消されました。
- SnowflakeのDATETIME型およびTIMEZONE_NTZ型のカラムに値を書き込むとき、デフォルト設定では時刻部分が内部的に変換されて書き込まれます。
- ASTERIA Warp 2306まで
- 時刻が内部的に協定世界時(UTC)として取り扱われます。その結果、日本標準時のDateTime値をそのまま書き込むとマイナス9時間された時刻が書き込まれます。
- ASTERIA Warp 2312以降
- 時刻が内部的に太平洋標準時(PST)として取り扱われます。その結果、日本標準時のDateTime値をそのまま書き込むとマイナス17時間された時刻が書き込まれます。
- これらの現象はコネクションのSession Parametersプロパティに値「CLIENT_TIMESTAMP_TYPE_MAPPING=TIMESTAMP_NTZ」を設定することで回避できますが、代わりにTIMESTAMP型、TIMESTAMP_LTZ型、TIMESTAMP_TZ型へ書き込まれる時刻が変換されるようになります。
- ASTERIA Warp 2306まで
- Snowflakeには Binding API と Upload API の2種類のAPIが用意されています。この2つには時刻表現の変換仕様やパラメーター数の制限、パフォーマンスに差異があります。
- Binding API:
時刻変換はCLIENT_TIMESTAMP_TYPE_MAPPINGの値に依存。デフォルトはTIMESTAMP_LTZ。
パラメーターの数は65280で制限されてそれ以上は実行できません。 - Upload API:
時刻変換は行われません。Binding APIと比べてパフォーマンスが低下する可能性や、ストレージのコストに影響が発生する可能性があります。 - Snowflakeアダプターでは以下のようにどちらのAPIが使用されるかが選択されます。コネクションの詳細プロパティ「Batch Mode」にて明示的に Binding か Upload を設定することにより、固定することが可能です。
- コンポーネントプロパティ「バッチ処理件数」が1以下の場合:Binding API が使用されます。
- コンポーネントプロパティ「バッチ処理件数」が1より大きい場合:パラメーター数によって自動的に使い分けられます。
- Binding API:
*1 ドライバ独自のクエリ構文についての詳細は、CData社の情報をご参照ください。
INSERT INTO SELECT構文 https://cdn.cdata.com/help/OWH/jp/jdbc/pg_insertselect.htm
SQL関数 https://cdn.cdata.com/help/OWH/jp/jdbc/pg_sqlfunctions.htm
データのキャッシュ https://cdn.cdata.com/help/OWH/jp/jdbc/pg_caching.htm
■更新履歴
- ASTERIA Warp 2406
- ユーザーがバッチモードを手動で指定できるようにする新しい接続プロパティ BatchMode が追加されました。
- Binding API と Upload API についての説明を「アダプターの動作」欄に追記しました。
- ASTERIA Warp 2312
- SnowflakeのTIME型のカラムに値を書き込むとき、日付を含む文字列は書き込めなくなりました。SnowflakeSQLCallコンポーネントでデータを書き込む場合に注意が必要です。
- SnowflakeのDATETIME型のカラムに値を書き込むとき、"JST”などのタイムゾーン表記を含む文字列は書き込めなくなりました。SnowflakeSQLCallコンポーネントでデータを書き込む場合に注意が必要です。
- SnowflakeのDATETIME型およびTIMEZONE_NTZ型のカラムに値を書き込むとき、時刻が内部的に太平洋標準時(PST)として取り扱われるようになりました。その結果、日本標準時(JST)のDateTime値をそのまま書き込むとマイナス17時間された時刻が書き込まれます。
- 言語が日本語に設定されたSnowflake環境においてデータの更新ができない場合があった問題が解消されました。
上記は現在、弊社で確認した内容について記載しています。
今後、不具合対応やバージョンアップなどで改善される場合は確認出来次第、反映します。
他にマルチセレクトオプション固有の制限事項について詳しくは以下のヘルプをご参考ください。
ASTERIA Warpバージョン | ヘルプページ |
2406 | |
2312 | |
2306 | |
2212 | |
2206 |