IBM Netezza SQL 변환 가이드

IBM Netezza 데이터 웨어하우징은 Netezza와 관련된 SQL 구문과 연동하도록 설계되었습니다. Netezza SQL은 Postgres 7.2를 기반으로 합니다. SQL 언어가 다르므로 Netezza용으로 작성된 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까지 가능하고 0부터 이 정밀도까지 s를 확장할 수 있습니다.
FLOAT(p) FLOAT64
REAL/FLOAT(6) FLOAT64
DOUBLE PRECISION/FLOAT(14) FLOAT64
CHAR/CHARACTER STRING BigQuery의 STRING 유형은 가변 길이이며 Netezza CHARACTERVARCHAR 유형에 필요한 것처럼 최대 문자 길이를 수동으로 설정할 필요가 없습니다. CHAR(n)에서 n의 기본값은 1입니다. 최대 문자열 크기는 64,000입니다.
VARCHAR STRING BigQuery의 STRING 유형은 가변 길이이며 Netezza CHARACTERVARCHAR 유형에 필요한 것처럼 최대 문자 길이를 수동으로 설정할 필요가 없습니다. 최대 문자열 크기는 64,000입니다.
NCHAR STRING BigQuery의 STRING 유형은 가변 길이 UTF-8로 인코딩된 유니코드로 저장됩니다. 최대 길이는 16,000자입니다.
NVARCHAR STRING BigQuery의 STRING 유형은 가변 길이 UTF-8로 인코딩된 유니코드로 저장됩니다. 최대 길이는 16,000자입니다.
VARBINARY BYTES
ST_GEOMETRY GEOGRAPHY
BOOLEAN/BOOL BOOL BigQuery의 BOOL 유형은 0/1, yes/no, true/false, on/off와 같은 다양한 값을 수락할 수 있는 Netezza의 BOOL 유형과 달리 TRUE/FALSE만 수락할 수 있습니다.
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로 데이터 유형 형식 요소를 변환할 때는 다음 표에 요약된 대로 TIMESTAMPDATETIME 사이의 시간대 차이에 특히 주의해야 합니다.

Netezza BigQuery
CURRENT_TIMESTAMP
CURRENT_TIME

Netezza의 TIME 정보는 WITH TIME ZONE 구문을 사용하여 정의되는 다른 시간대 정보를 가질 수 있습니다.
가능한 경우 올바르게 형식이 지정된 CURRENT_TIMESTAMP 함수를 사용합니다. 그러나 출력 형식에 항상 UTC 시간대가 표시되지는 않습니다(내부적으로 BigQuery에 시간대가 없음). bq 명령줄 도구 및 Google Cloud 콘솔에서 DATETIME 객체는 RFC 3339에 따라 T 구분 기호를 사용하여 형식이 지정됩니다. 그러나 Python 및 자바 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 1 UNION ALL SELECT 2;


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을 0으로 바꿉니다.
NVL(exp, 0) IFNULL(exp, 0) NULL을 0으로 바꿉니다.
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
ANY_VALUE
APPROX_COUNT_DISTINCT
APPROX_QUANTILES
APPROX_TOP_COUNT
APPROX_TOP_SUM
AVG AVG
intNand BIT_AND
intNnot 비트 NOT 연산자: ~
intNor BIT_OR
intNxor BIT_XOR
intNshl
intNshr
CORR CORR
COUNT COUNT
COUNTIF
COVAR_POP COVAR_POP
COVAR_SAMP COVAR_SAMP
GROUPING
LOGICAL_AND
LOGICAL_OR
MAX MAX
MIN MIN
MEDIAN PERCENTILE_CONT(x, 0.5)
STDDEV_POP STDDEV_POP
STDDEV_SAMP STDDEV_SAMP
STDDEV
STRING_AGG
SUM SUM
VAR_POP VAR_POP
VAR_SAMP VAR_SAMP
VARIANCE

분석 함수

Netezza BigQuery
ANY_VALUE
ARRAY_AGG
ARRAY_CONCAT ARRAY_CONCAT_AGG
ARRAY_COMBINE
ARRAY_COUNT
ARRAY_SPLIT
ARRAY_TYPE
AVG AVG
intNand BIT_AND
intNnot 비트 NOT 연산자: ~
intNor BIT_OR
intNxor BIT_XOR
intNshl
intNshr
CORR CORR
COUNT COUNT
COUNTIF
COVAR_POP COVAR_POP
COVAR_SAMP COVAR_SAMP
CUME_DIST CUME_DIST
DENSE_RANK DENSE_RANK
FIRST_VALUE FIRST_VALUE
LAG LAG
LAST_VALUE LAST_VALUE
LEAD LEAD
AND LOGICAL_AND
OR LOGICAL_OR
MAX MAX
MIN MIN
NTH_VALUE
NTILE NTILE
PERCENT_RANK PERCENT_RANK
PERCENTILE_CONT PERCENTILE_CONT
PERCENTILE_DISC PERCENTILE_DISC
RANK RANK
ROW_NUMBER ROW_NUMBER
STDDEV STDDEV
STDDEV_POP STDDEV_POP
STDDEV_SAMP STDDEV_SAMP
STRING_AGG
SUM SUM
VARIANCE VARIANCE
VAR_POP VAR_POP
VAR_SAMP VAR_SAMP
VARIANCE
WIDTH_BUCKET

날짜 및 시간 함수

Netezza BigQuery
ADD_MONTHS DATE_ADD
TIMESTAMP_ADD
AGE
CURRENT_DATE CURRENT_DATE
CURRENT_DATETIME
CURRENT_TIME CURRENT_TIME
CURRENT_TIME(p)
CURRENT_TIMESTAMP CURRENT_TIMESTAMP
CURRENT_TIMESTAMP(p)
DATE
DATE_ADD
DATE_DIFF
DATE_FROM_UNIX_DATE
DATE_SUB
DATE_TRUNC DATE_TRUNC
DATE_PART
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
DURATION_ADD
DURATION_SUBTRACT
EXTRACT EXTRACT (DATE)
EXTRACT (TIMESTAMP)
FORMAT_DATE
FORMAT_DATETIME
FORMAT_TIME
FORMAT_TIMESTAMP
LAST_DAY DATE_SUB( DATE_TRUNC( DATE_ADD( date_expression, INTERVAL 1 MONTH ), MONTH ), INTERVAL 1 DAY )
MONTHS_BETWEEN DATE_DIFF(date_expression, date_expression, MONTH)
NEXT_DAY
NOW
OVERLAPS
PARSE_DATE
PARSE_DATETIME
PARSE_TIME
PARSE_TIMESTAMP
STRING
TIME
TIME_ADD
TIME_DIFF
TIME_SUB
TIME_TRUNC
TIMEOFDAY
TIMESTAMP DATETIME
TIMESTAMP_ADD
TIMESTAMP_DIFF
TIMESTAMP_MICROS
TIMESTAMP_MILLIS
TIMESTAMP_SECONDS
TIMESTAMP_SUB
TIMESTAMP_TRUNC
TIMEZONE
TO_DATE PARSE_DATE
TO_TIMESTAMP PARSE_TIMESTAMP
UNIX_DATE
UNIX_MICROS
UNIX_MILLIS
UNIX_SECONDS

문자열 함수

Netezza BigQuery
ASCII TO_CODE_POINTS(string_expr)[OFFSET(0)]
BYTE_LENGTH
TO_HEX
CHAR_LENGTH
CHARACTER_LENGTH
CODE_POINTS_TO_BYTES
BTRIM
CHR CODE_POINTS_TO_STRING([numeric_expr])
CONCAT
DBL_MP
DLE_DST
ENDS_WITH
FORMAT
FROM_BASE32
FROM_BASE64
FROM_HEX
HEX_TO_BINARY
HEX_TO_GEOMETRY
INITCAP
INSTR
INT_TO_STRING
LE_DST
LENGTH LENGTH
LOWER LOWER
LPAD LPAD
LTRIM LTRIM
NORMALIZE
NORMALIZE_AND_CASEFOLD
PRI_MP
REGEXP_CONTAINS
REGEXP_EXTRACT REGEXP_EXTRACT
REGEXP_EXTRACT_ALL REGEXP_EXTRACT_ALL
REGEXP_EXTRACT_ALL_SP
REGEXP_EXTRACT_SP
REGEXP_INSTR STRPOS(col, REGEXP_EXTRACT())
REGEXP_LIKE
REGEXP_MATCH_COUNT
REGEXP_REPLACE REGEXP_REPLACE
REGEXP_REPLACE_SP IF(REGEXP_CONTAINS,1,0)
REGEXP_EXTRACT
REPEAT REPEAT
REPLACE
REVERSE
RPAD RPAD
RTRIM RTRIM
SAFE_CONVERT_BYTES_TO_STRING
SCORE_MP
SEC_MP
SOUNDEX
SPLIT
STARTS_WITH
STRING_TO_INT
STRPOS STRPOS
SUBSTR SUBSTR
TO_BASE32
TO_BASE64
TO_CHAR
TO_DATE
TO_NUMBER
TO_TIMESTAMP
TO_CODE_POINTS
TO_HEX
TRANSLATE
TRIM
UPPER UPPER
UNICODE
UNICODES

수학 함수

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에는 매일 실행 가능한 DML 문 수를 제한하는 DML 할당량이 적용됩니다. 할당량을 최대한 활용하려면 다음 방법을 사용해 보세요.

  • INSERT 문당 한 개의 행 대신 하나의 INSERT 문에서 여러 행을 결합합니다.
  • MERGE 문을 사용하여 여러 DML 문(INSERT 문 포함)을 결합합니다.
  • CREATE TABLE ... AS SELECT 문을 사용하여 새 테이블을 만들고 값을 채웁니다.

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 할당량으로 인해 여러 개의 단일 UPDATEINSERT 문 대신 큰 MERGE 문을 사용하는 것이 좋습니다. BigQuery의 DML 스크립트와 그에 해당하는 Netezza의 문 간에는 시맨틱스의 일관성 측면에 약간의 차이점이 있습니다. 스냅샷 격리와 세션 및 트랜잭션 처리에 관한 개요는 일관성 보장 및 트랜잭션 격리를 참조하세요.

DELETETRUNCATE

테이블 스키마 또는 색인에 영향을 주지 않고 테이블에서 행을 삭제하려면 DELETETRUNCATE 문을 사용합니다. TRUNCATE 문은 DELETE 문과 효과가 동일하지만 큰 테이블의 경우 DELETE 문보다 훨씬 빠릅니다. TRUNCATE 문은 Netezza에서 지원되지만 BigQuery에서 지원되지 않습니다. 그러나 Netezza 및 BigQuery 모두 DELETE 문을 사용할 수 있습니다.

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 \
--replace \
--destination_table \
tableA \
'SELECT * \
FROM tableB \
WHERE ...'


bq cp \
-f tableA tableB

테이블의 콘텐츠를 쿼리 결과로 바꿉니다.


DELETE FROM database.table


DELETE FROM table WHERE TRUE;

Netezza에서 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는 테이블이 클러스터링된 첫 번째 열, 그 다음 두 번째 열, 그 다음 열 등에 따라 우선순위를 지정합니다.
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에서 임시 테이블을 빌드하려면 다음을 수행합니다.

  1. 12시간 정도로 수명이 짧은 데이터 세트를 만듭니다.
  2. temp의 테이블 이름 프리픽스를 사용하여 데이터 세트에 임시 테이블을 만듭니다. 예를 들어 1시간 내에 만료되는 테이블을 만들려면 다음을 수행합니다.

    CREATE TABLE temp.name (col1, col2, ...)
    OPTIONS(expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(),
    INTERVAL 1 HOUR));
    
  3. 임시 테이블에서 읽기 및 쓰기를 시작합니다.

다운스트림 시스템에서 오류를 찾기 위해 중복 항목을 독립적으로 삭제할 수도 있습니다.

BigQuery는 DEFAULTIDENTITY(시퀀스) 열을 지원하지 않습니다.

절차적 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 정보 스키마
데이터베이스의 객체 쿼리

일관성 보장 및 트랜잭션 격리

Netezza 및 BigQuery 모두 원자적인 특성을 갖습니다. 즉, 여러 행에 걸쳐 변형당 수준에서 ACID와 호환됩니다. 예를 들어 MERGE 작업은 여러 개의 삽입된 값이 있는 경우에도 완전히 원자적인 특성을 갖습니다.

트랜잭션

Netezza는 구문적으로 ANSI SQL 트랜잭션 격리의 4개 모드를 모두 허용합니다. 그러나 지정된 모드에 관계없이 가능한 한 가장 높은 일관성 수준을 제공하는 SERIALIZABLE 모드만 사용됩니다. 또한 이 모드는 동시 트랜잭션 사이의 반복 불가능한 더티 팬텀 읽기를 방지합니다. Netezza는 일관성 강화를 위한 기존 잠금을 사용하지 않습니다. 대신 2개의 트랜잭션이 동일한 데이터를 수정하려고 시도할 때 최신 트랜잭션을 자동으로 롤백하는 낙관적 동시성 제어 형태의 직렬화 종속성 검사가 사용됩니다.

BigQuery는 트랜잭션도 지원합니다. BigQuery는 쿼리가 시작되기 전 마지막으로 커밋된 데이터를 쿼리가 읽는 스냅샷 격리를 사용하여 최적의 동시 실행 제어(첫 번째 커밋이 우선순위를 가짐)를 보장합니다. 이 접근 방법은 행 및 변형 기준으로 그리고 동일한 DML 문 내의 여러 행에서 동일한 수준의 일관성을 보장하고 교착 상태도 방지합니다. 동일한 테이블에 대해 여러 DML 업데이트가 있는 경우 BigQuery는 최악 동시 실행 제어로 전환됩니다. 로드 작업은 완전히 독립적으로 실행되고 테이블에 추가될 수 있습니다.

롤백

Netezza는 현재 트랜잭션을 중단하고 트랜잭션에 수행된 모든 변경사항을 롤백하는 ROLLBACK을 지원합니다.

BigQuery에서는 ROLLBACK TRANSACTION을 사용할 수 있습니다.

데이터베이스 한도

한도 Netezza BigQuery
데이터베이스당 테이블 32,000 제한 없음
테이블당 열 1600 10000
최대 행 크기  64KB 100MB
열 및 테이블 이름 길이 128바이트 16,384개의 유니코드 문자
테이블당 행 무제한 무제한
최대 SQL 요청 길이 1MB(최대 해결되지 않은 표준 SQL 쿼리 길이)

12MB(해결된 legacy SQL 및 표준 SQL 쿼리 최대 길이)

스트리밍:
10MB(HTTP 요청 크기 한도)
10,000(요청당 최대 행)
최대 요청 및 응답 크기 10MB(요청) 및 10GB(응답), 페이지 나누기 또는 Cloud Storage API를 사용하는 경우에는 거의 무제한입니다.
최대 동시 실행 세션 수 동시 읽기-쓰기 트랜잭션 63개 서버 동시 연결 2,000개 동시 실행 쿼리 100개(슬롯 예약 사용 시 늘어날 수 있음), 사용자당 300개의 동시 실행 API 요청

다음 단계