IBM Netezza SQL 変換ガイド
IBM Netezza データ ウェアハウジングは、Netezza 固有の SQL 構文で動作するように設計されています。Netezza SQL は、Postgres 7.2 に基づいています。Netezza 用に作成された SQL スクリプトは、SQL 言語に違いがあるため、そのままでは BigQuery データ ウェアハウスで使用できません。
このドキュメントでは、次の分野での Netezza と BigQuery の SQL 構文の類似点と相違点について、詳しく説明します。
- データ型
- SQL 言語要素
- クエリ構文
- データ操作言語(DML)
- データ定義言語(DDL)
- ストアド プロシージャ
- 関数
また、バッチ SQL 変換を使用して複数の SQL スクリプトを一括で移行することも、インタラクティブ SQL 変換を使用してアドホック クエリ変換することもできます。IBM Netezza SQL/NZPLSQL は、プレビューの両方のツールでサポートされています。
データ型
Netezza | BigQuery | 注 |
---|---|---|
INTEGER/INT/INT4 |
INT64 |
|
SMALLINT/INT2 |
INT64 |
|
BYTEINT/INT1 |
INT64 |
|
BIGINT/INT8 |
INT64 |
|
DECIMAL
|
NUMERIC
|
Netezza の DECIMAL データ型は、NUMERIC データ型のエイリアスです。 |
NUMERIC
|
NUMERIC
INT64 |
|
NUMERIC(p,s)
|
NUMERIC
|
BigQuery の NUMERIC 型は、Netezza のようにカスタムの精度または位取り(制約)を適用できません。BigQuery では小数点以下 9 桁で固定されていますが、Netezza ではカスタム設定が可能です。Netezza では、精度 p として可能な範囲は 1~38、スケール s は 0~精度です。 |
FLOAT(p) |
FLOAT64 |
|
REAL/FLOAT(6) |
FLOAT64 |
|
DOUBLE PRECISION/FLOAT(14) |
FLOAT64 |
|
CHAR/CHARACTER
|
STRING
|
BigQuery の STRING 型は可変長であり、Netezza の CHARACTER および VARCHAR 型で必要なように最大文字列長を手動で設定する必要はありません。CHAR(n) の n のデフォルト値は 1 です。最大文字列サイズは 64,000 文字です。 |
VARCHAR
|
STRING
|
BigQuery の STRING 型は可変長であり、Netezza の CHARACTER および VARCHAR 型で必要なように最大文字列長を手動で設定する必要はありません。最大文字列サイズは 64,000 文字です。 |
NCHAR
|
STRING
|
BigQuery の STRING 型は、可変長の UTF-8 エンコードされた Unicode として保存されます。最大長は 16,000 文字です。 |
NVARCHAR
|
STRING
|
BigQuery の STRING 型は、可変長の UTF-8 エンコードされた Unicode として保存されます。最大長は 16,000 文字です。 |
VARBINARY |
BYTES |
|
ST_GEOMETRY |
GEOGRAPHY |
|
BOOLEAN/BOOL
|
BOOL
|
BigQuery の BOOL 型は TRUE/FALSE のみを取ります。これは、0/1 、yes/no 、true/false, 、on/off などさまざまな値を受け入れる Netezza の BOOL 型とは異なります。 |
DATE |
DATE |
|
TIME |
TIME |
|
TIMETZ/TIME WITH TIME ZONE
|
TIME
|
Netezza は TIME データ型を UTC で格納し、WITH TIME
ZONE 構文を使用して UTC からのオフセットを渡すことができます。BigQuery の TIME データ型は、日付やタイムゾーンに依存しない時間を表します。 |
TIMESTAMP
|
DATETIME
|
Netezza TIMESTAMP 型には、BigQuery の DATETIME 型と同様に、タイムゾーンが含まれません。 |
ARRAY
|
Netezza には配列データ型はありません。配列型は varchar フィールドに格納されます。 |
タイムスタンプと日付型形式
Netezza SQL で使用される日付型の形式の詳細については、Netezza の日時テンプレート パターンのドキュメントをご覧ください。日付と時刻の関数の詳細については、Netezza の日付/時間関数のドキュメントをご覧ください。
日付型形式要素を Netezza から GoogleSQL に変換する場合は、次の表に記載されているように、TIMESTAMP
と DATETIME
のタイムゾーンの違いに特に注意を払う必要があります。
Netezza | BigQuery |
---|---|
CURRENT_TIMESTAMP CURRENT_TIME Netezza の TIME 情報には、WITH TIME ZONE 構文を使用して定義される異なるタイムゾーン情報が含まれることがあります。
|
可能であれば、正しい形式の CURRENT_TIMESTAMP 関数を使用してください。ただし、出力形式では UTC タイムゾーンが常に表示されるとは限りません(BigQuery にはタイムゾーンがありません)。bq コマンドライン ツールと Google Cloud コンソールの DATETIME オブジェクトは、RFC 3339 に従って T 区切り文字を使用して形式設定されます。ただし Python と Java JDBC では、区切り文字にスペースが使用されます。日付形式を正しく定義するには、FORMAT_DATETIME 関数を明示的に使用します。それ以外の場合は、次のように文字列に明示的にキャストします。CAST(CURRENT_DATETIME() AS STRING) これにより、スペース区切り文字も返されます。 |
CURRENT_DATE |
CURRENT_DATE |
CURRENT_DATE-3
|
BigQuery は算術データ演算をサポートしていません。代わりに DATE_ADD 関数を使用してください。 |
SELECT
ステートメント
通常、Netezza の SELECT
ステートメントは BigQuery と互換性があります。次の表に、例外の一覧を示します。
Netezza | BigQuery |
---|---|
FROM 句のない SELECT ステートメント |
次のような特殊なケースに対応します。
|
SELECT (subquery) AS flag, CASE WHEN flag = 1 THEN ... |
BigQuery では、列は同じクエリ内で定義された他の列の出力を参照できません。ロジックを複製するか、ネストされたクエリにロジックを移動する必要があります。
オプション 1 SELECT (subquery) AS flag, CASE WHEN (subquery) = 1 THEN ... オプション 2 SELECT q.*, CASE WHEN flag = 1 THEN ... FROM ( SELECT (subquery) AS flag, ... ) AS q |
比較演算子
Netezza | BigQuery | 説明 |
---|---|---|
exp = exp2 |
exp = exp2 |
等しい |
exp <= exp2 |
exp <= exp2 |
以下 |
exp < exp2 |
exp < exp2 |
次より小さい |
exp <> exp2 exp != exp2 |
exp <> exp2 exp != exp2 |
等しくない |
exp >= exp2
|
exp >= exp2
|
以上 |
exp > exp2 |
exp > exp2 |
次より大きい |
組み込み SQL 関数
Netezza | BigQuery | 説明 |
---|---|---|
CURRENT_DATE
|
CURRENT_DATE
|
現在の日付(年、月、日)を取得します。 |
CURRENT_TIME
|
CURRENT_TIME
|
小数を含む現在の時刻を取得します。 |
CURRENT_TIMESTAMP
|
CURRENT_TIMESTAMP
|
現在のシステム日時を秒単位で取得します。 |
NOW
|
CURRENT_TIMESTAMP
|
現在のシステム日時を秒単位で取得します。 |
COALESCE(exp, 0)
|
COALESCE(exp, 0)
|
NULL をゼロに置き換えます。 |
NVL(exp, 0)
|
IFNULL(exp, 0)
|
NULL をゼロに置き換えます。 |
EXTRACT(DOY FROM
timestamp_expression)
|
EXTRACT(DAYOFYEAR FROM
timestamp_expression)
|
年初からの日数を返します。 |
ADD_MONTHS(date_expr,
num_expr) |
DATE_ADD(date,
INTERVAL k MONTH) |
日付に月を追加します。 |
DURATION_ADD(date,
k) |
DATE_ADD(date,
INTERVAL k DAY) |
日付に対する加算を実行します。 |
DURATION_SUBTRACT(date,
k) |
DATE_SUB(date,
INTERVAL k DAY) |
日付に対する減算を実行します。 |
str1 || str2 |
CONCAT(str1,
str2) |
文字列を連結します。 |
関数
このセクションでは、Netezza と BigQuery の関数を比較します。
集計関数
分析関数
日付と時刻の関数
文字列関数
数学関数
Netezza | BigQuery |
---|---|
ABS |
ABS |
ACOS |
ACOS |
ACOSH |
|
ASIN |
ASIN |
ASINH |
|
ATAN |
ATAN |
ATAN2 |
ATAN2 |
ATANH |
|
CEIL DCEIL |
CEIL
|
CEILING |
|
COS |
COS |
COSH |
|
COT |
COT |
DEGREES |
|
DIV |
|
EXP |
EXP |
FLOOR DFLOOR |
FLOOR
|
GREATEST |
GREATEST |
IEEE_DIVIDE |
|
IS_INF |
|
IS_NAN |
|
LEAST |
LEAST |
LN |
LN |
LOG |
LOG |
LOG10 |
|
MOD |
MOD |
NULLIF (expr, 0) |
|
PI |
ACOS (-1) |
POW FPOW |
POWER POW |
RADIANS |
|
RANDOM |
RAND |
ROUND |
ROUND |
SAFE_DIVIDE |
|
SETSEED |
|
SIGN |
SIGN |
SIN |
SIN |
SINH |
|
SQRT NUMERIC_SQRT |
SQRT
|
TAN |
TAN |
TANH |
|
TRUNC |
TRUNC |
IFNULL (expr, 0) |
DML 構文
このセクションでは、Netezza と BigQuery の DML 構文を比較します。
INSERT
ステートメント
Netezza | BigQuery |
---|---|
INSERT INTO table VALUES (...); |
INSERT INTO table (...) VALUES (...); Netezza には、列に関する DEFAULT キーワードとその他の制約があります。BigQuery では、すべての列が指定される場合に限り、INSERT ステートメントでの列名の省略が許可されます。 |
INSERT INTO table (...) VALUES (...); INSERT INTO table (...) VALUES (...); |
INSERT INTO table VALUES (), (); BigQuery では、1 日に実行できる DML ステートメント数を制限する DML 割り当てが適用されます。割り当てを最大限に利用するには、次の方法を検討してください。
|
BigQuery の DML スクリプトは、それに対応する Netezza のステートメントとは整合性セマンティクスが少し異なります。また、BigQuery では NOT
NULL
以外の制約がないことにも注意してください。
スナップショット分離と、セッションとトランザクションの処理の概要については、整合性の保証とトランザクション分離をご覧ください。
UPDATE
ステートメント
Netezza では WHERE
句は省略可能ですが、BigQuery では必須です。
Netezza | BigQuery |
---|---|
UPDATE tbl SET tbl.col1=val1; |
WHERE 句がない場合はサポートされません。すべての行を更新するには WHERE true 句を使用します。 |
UPDATE A SET y = B.y, z = B.z + 1 FROM B WHERE A.x = B.x AND A.y IS NULL; |
UPDATE A SET y = B.y, z = B.z + 1 FROM B WHERE A.x = B.x AND A.y IS NULL; |
UPDATE A alias SET x = x + 1 WHERE f(x) IN (0, 1) |
UPDATE A SET x = x + 1 WHERE f(x) IN (0, 1); |
UPDATE A SET z = B.z FROM B WHERE A.x = B.x AND A.y = B.y |
UPDATE A SET z = B.z FROM B WHERE A.x = B.x AND A.y = B.y; |
例については、UPDATE
の例をご覧ください。
DML 割り当てがあるため、複数の個々の UPDATE
ステートメントと INSERT
ステートメントではなく、サイズの大きい MERGE
ステートメントを使用することをおすすめします。BigQuery の DML スクリプトは、それに対応する Netezza のステートメントとは整合性セマンティクスが少し異なります。スナップショット分離と、セッションとトランザクションの処理の概要については、整合性の保証とトランザクション分離をご覧ください。
DELETE
および TRUNCATE
ステートメント
DELETE
ステートメントと TRUNCATE
ステートメントはいずれも、テーブルのスキーマやインデックスに影響を与えることなくテーブルから行を削除できます。TRUNCATE
ステートメントの効果は DELETE
ステートメントと同じですが、大規模なテーブルの場合、DELETE
ステートメントよりもはるかに高速です。TRUNCATE
ステートメントは Netezza ではサポートされていますが、BigQuery ではサポートされていません。ただし DELETE
ステートメントは Netezza と BigQuery の両方で使用できます。
BigQuery では、DELETE
ステートメントには WHERE
句が必要です。Netezza では、WHERE
句は省略可能です。WHERE
句が指定されていない場合、Netezza テーブル内のすべての行が削除されます。
Netezza | BigQuery | 説明 |
---|---|---|
BEGIN; LOCK TABLE A IN EXCLUSIVE MODE; DELETE FROM A; INSERT INTO A SELECT * FROM B; COMMIT; |
テーブルのコンテンツをクエリ出力で置き換える処理は、トランザクションに相当します。これは、query クエリまたはコピー(cp ) オペレーションで実行できます。bq query \ bq cp \ |
テーブルの内容をクエリの結果に置換します。 |
DELETE FROM database.table |
DELETE FROM table WHERE TRUE; |
Vertica では、delete ステートメントが実行されたとき、行が物理的に削除されるのではなく単に削除対象のマークが付けられるだけです。後で GROOM TABLE または nzreclaim コマンドを実行すると、削除対象マークが付けられた行が削除され、対応するディスク容量が再利用されます。 |
GROOM
TABLE |
Netezza では、GROOM TABLE コマンドを使用して、削除対象マークが付いた行を削除することで、ディスク容量を再利用します。 |
MERGE
ステートメント
MERGE
ステートメントでは、ターゲット行ごとに最大で 1 つのソース行を対応させる必要があります。BigQuery の DML スクリプトは、それに対応する Netezza のステートメントとは整合性セマンティクスが少し異なります。スナップショット分離と、セッションとトランザクションの処理の概要については、整合性の保証とトランザクション分離をご覧ください。例については、BigQuery の MERGE
の例と Netezza の MERGE
の例をご覧ください。
DDL 構文
このセクションでは、Netezza と BigQuery の DDL 構文を比較します。
CREATE TABLE
ステートメント
Netezza | BigQuery | 説明 |
---|---|---|
TEMP TEMPORARY
|
BigQuery では DDL がサポートされているので、クエリの結果からテーブルを作成でき、作成時にテーブルの有効期限を指定できます。たとえば、3 日間の場合は次のようになります。CREATE TABLE
'fh-bigquery.public_dump.vtemp' OPTIONS (expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 3 DAY)) |
セッションに対して一時的なテーブルを作成します。 |
ZONE MAPS
|
サポート対象外。 | WHERE 条件のクイック検索を行います。 |
DISTRIBUTE ON
|
PARTITION BY
|
パーティショニング。これは直接変換ではありません。DISTRIBUTE ON では、通常は均等分散のために一意のキーを指定してノード間でデータを共有します。PARTITION BY はデータをセグメントにプルーニングします。 |
ORGANIZE ON
|
CLUSTER BY
|
Netezza と BigQuery の両方で、クラスタリング用に最大 4 つのキーがサポートされています。Netezza クラスタ基本テーブル(CBT)では、各クラスタリング列の優先度が同等になります。BigQuery では、テーブルがクラスタ化される最初の列が優先され、次に 2 番目の列が優先されます。 |
ROW SECURITY |
Authorized View |
行レベルのセキュリティ |
CONSTRAINT |
サポート対象外 | チェック制約。 |
DROP
ステートメント
Netezza | BigQuery | 説明 |
---|---|---|
DROP TABLE |
DROP TABLE |
|
DROP DATABASE |
DROP DATABASE |
|
DROP VIEW |
DROP VIEW |
列のオプションと属性
Netezza | BigQuery | 説明 |
---|---|---|
NULL NOT NULL
|
NULLABLE REQUIRED
|
列に NULL 値を含めることを許可するかどうかを指定します。 |
REFERENCES
|
サポート対象外 | 列の制約を指定します。 |
UNIQUE
|
サポート対象外 | 列内の各値を一意にする必要があります。 |
DEFAULT
|
サポート対象外 | 列内のすべての値のデフォルト値。 |
一時テーブル
Netezza では、セッション中に存在する TEMPORARY
テーブルがサポートされています。
BigQuery で一時テーブルを作成する手順は次のとおりです。
- 有効期間が短い(12 時間など)データセットを作成します。
このデータセット内に一時テーブルを作成します。テーブル名の接頭辞は
temp
にします。たとえば、有効期限が 1 時間のテーブルを作成するには、次のようにします。CREATE TABLE temp.name (col1, col2, ...) OPTIONS(expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));
一時テーブルでの読み取りと書き込みを開始します。
ダウンストリーム システムのエラーを確認するために、重複を個別に削除することもできます。
BigQuery では DEFAULT
列と IDENTITY
(シーケンス)列はサポートされていません。
手続き型 SQL ステートメント
Netezza では、NZPLSQL スクリプト言語を使用してストアド プロシージャを記述します。NZPLSQL は Postgres の PL/pgSQL 言語をベースとしています。ここでは、ストアド プロシージャ、関数、トリガーで使用される手続き型 SQL ステートメントを Netezza から BigQuery に変換する方法について説明します。
CREATE PROCEDURE
ステートメント
Netezza と BigQuery のいずれでも、CREATE PROCEDURE
ステートメントを使用したストアド プロシージャの作成がサポートされています。詳細については、SQL ストアド プロシージャを操作するをご覧ください。
変数宣言と割り当て
Netezza | BigQuery | 説明 |
---|---|---|
DECLARE var
datatype(len) [DEFAULT
value]; |
DECLARE
|
変数を宣言します。 |
SET var = value; |
SET |
変数に値を代入します。 |
例外ハンドラ
Netezza では、特定のエラー状態に対してトリガーできる例外ハンドラがサポートされています。BigQuery では条件ハンドラはサポートされていません。
Netezza | BigQuery | 説明 |
---|---|---|
EXCEPTION
|
サポート対象外 | 一般的なエラーについては SQL 例外ハンドラを宣言します。 |
動的 SQL ステートメント
Netezza では、ストアド プロシージャ内の動的 SQL クエリがサポートされています。BigQuery では動的 SQL ステートメントがサポートされていません。
Netezza | BigQuery | 説明 |
---|---|---|
EXECUTE IMMEDIATE sql_str; |
EXECUTE IMMEDIATE sql_str; |
動的 SQL を実行します。 |
フロー制御ステートメント
Netezza | BigQuery | 説明 |
---|---|---|
IF THEN ELSE STATEMENT IF 条件THEN ... ELSE ... END IF; |
IF 条件THEN ... ELSE ... END IF;
|
条件に基づいて実行します。 |
反復制御FOR var AS SELECT ... DO stmts END FOR; FOR var AS cur CURSOR FOR SELECT ... DO stmts END FOR; |
サポート対象外 | 行のコレクションを反復処理します。 |
反復制御LOOP stmts END LOOP; |
LOOP sql_statement_list END LOOP; |
ステートメントのブロックをループします。 |
EXIT WHEN |
BREAK |
プロシージャを終了します。 |
WHILE *condition* LOOP
|
WHILE 条件DO ... END WHILE |
while 条件が失敗するまで、ステートメントのループを実行します。 |
その他のステートメントと手続き型言語要素
Netezza | BigQuery | 説明 |
---|---|---|
CALL proc(param,...) |
サポート対象外 | プロシージャを実行します。 |
EXEC proc(param,...) |
サポート対象外 | プロシージャを実行します。 |
EXECUTE proc(param,...) |
サポート対象外 | プロシージャを実行します。 |
複数ステートメントおよび複数行 SQL ステートメント
Netezza と BigQuery はどちらもトランザクション(セッション)をサポートしているため、一貫して一緒に実行されるステートメントをセミコロンで区切って指定できます。詳細については、複数ステートメント トランザクションをご覧ください。
その他の SQL ステートメント
Netezza | BigQuery | 説明 |
---|---|---|
GENERATE
STATISTICS
|
現在のデータベース内のすべてのテーブルに関する統計情報を生成します。 | |
GENERATE
STATISTICS ON
table_name |
特定のテーブルに関する統計情報を生成します。 | |
GENERATE
STATISTICS ON
table_name(col1,col4)
|
MIN, MAX, AVG, などの統計関数、UI、または Cloud Data Loss Prevention API を使用します。 |
テーブル内の特定の列に関する統計情報を生成します。 |
GENERATE
STATISTICS ON
table_name |
APPROX_COUNT_DISTINCT(col) |
列の一意の値の数を示します。 |
INSERT INTO
table_name |
INSERT INTO
table_name |
行を挿入します。 |
LOCK TABLE
table_name FOR
EXCLUSIVE; |
サポート対象外 | 行をロックします。 |
SET SESSION
CHARACTERISTICS AS
TRANSACTION ISOLATION
LEVEL ...
|
BigQuery では、常にスナップショット分離を使用します。詳細については、整合性の保証とトランザクション分離をご覧ください。 | トランザクション分離レベルを定義します。 |
BEGIN TRANSACTION END TRANSACTION COMMIT |
BigQuery では、常にスナップショット分離を使用します。詳細については、整合性の保証とトランザクション分離をご覧ください。 | マルチステートメント リクエストのトランザクション境界を定義します。 |
EXPLAIN ...
|
サポート対象外。クエリプランとタイムラインの同様の機能 | SELECT ステートメントのクエリプランを表示します。 |
ユーザービューのメタデータ システムビューのメタデータ |
SELECT * EXCEPT(is_typed) FROM mydataset.INFORMATION_SCHEMA.TABLES; BigQuery Information Schema |
データベース内のオブジェクトをクエリします |
整合性の保証とトランザクション分離
Netezza と BigQuery はどちらもアトミックです。つまり、多数の行にわたってミューテーション単位で ACID に準拠しています。たとえば MERGE
オペレーションは、複数の挿入値がある場合でも完全にアトミックです。
トランザクション
Netezza の構文では、ANSI SQL のトランザクション分離の 4 つのモードがすべてを受け入れられます。ただし、指定されたモードに関係なく、SERIALIZABLE
モードのみが使用されるので、可能な限り高いレベルの整合性が実現します。また、このモードでは同時実行トランザクション間のダーティ読み取り、再現不能な読み取り、ファントム読み取りも回避されます。Netezza は、整合性を適用するために従来のロックを使用しません。代わりに、シリアル化依存関係チェックを使用します。これはオプティミスティック同時実行制御の一種であり、2 つのトランザクションが同じデータを変更しようとしたときに、最新のトランザクションを自動的にロールバックします。
また、BigQuery はトランザクションをサポートしています。BigQuery では、スナップショット分離を使用して、オプティミスティック同時実行制御(最初の commit が優先)が確実に実行されるようにします。この場合、クエリは、クエリの開始前に最後に commit されたデータを読み取ります。このアプローチにより、行ごと、ミューテーションごと、および同じ DML ステートメント内の行全体で同じレベルの整合性が保証され、デッドロックも回避されます。同じテーブルに対して複数の DML 更新を行う場合、BigQuery はペシミスティック同時実行制御に切り替わります。読み込みジョブは完全に独立して実行され、テーブルへの追加を実行できます。
ロールバック
Netezza は ROLLBACK
ステートメントをサポートしています。このステートメントは、現在のトランザクションを中止し、トランザクションで行われたすべての変更をロールバックします。
BigQuery では、ROLLBACK TRANSACTION
ステートメントを使用できます。
データベースに関する制限
上限 | Netezza | BigQuery |
---|---|---|
データベースあたりのテーブル数 | 32,000 | 制限なし |
テーブルあたりの列数 | 1600 | 10000 |
最大行数 | 64 KB | 100 MB |
列とテーブルの名前の長さ | 128 バイト | 16,384 Unicode 文字 |
テーブルあたりの行数 | 無制限 | 無制限 |
SQL リクエストの最大長 | 1 MB(未解決標準 SQL クエリの最大長) 12 MB(解決済み以前の SQL クエリと 標準 SQL クエリの最大長)。 ストリーミング: 10 MB(HTTP リクエスト サイズの上限) 10,000(リクエストあたりの最大行数) |
|
リクエストとレスポンスの最大サイズ | 10 MB(リクエスト)および 10 GB(レスポンス)、ただしページ分けまたは Cloud Storage API を使用する場合は実質的に無制限。 | |
同時実行セッションの最大数 | 63 の同時読み取り / 書き込みトランザクション。サーバーへの 2,000 の同時接続。 | 100 個の同時実行クエリ(スロット予約で増やすことができます)、ユーザーあたり 300 個の同時実行 API リクエスト。 |
次のステップ
- IBM Netezza から BigQuery に移行する手順を確認する。