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 CHARACTER 및 VARCHAR 유형에 필요한 것처럼 최대 문자 길이를 수동으로 설정할 필요가 없습니다. CHAR(n) 에서 n 의 기본값은 1입니다. 최대 문자열 크기는 64,000입니다. |
VARCHAR
|
STRING
|
BigQuery의 STRING 유형은 가변 길이이며 Netezza CHARACTER 및 VARCHAR 유형에 필요한 것처럼 최대 문자 길이를 수동으로 설정할 필요가 없습니다. 최대 문자열 크기는 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로 데이터 유형 형식 요소를 변환할 때는 다음 표에 요약된 대로 TIMESTAMP
와 DATETIME
사이의 시간대 차이에 특히 주의해야 합니다.
Netezza | BigQuery |
---|---|
CURRENT_TIMESTAMP CURRENT_TIME 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 (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 |
---|---|
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 할당량이 적용됩니다. 할당량을 최대한 활용하려면 다음 방법을 사용해 보세요.
|
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에서 지원되지 않습니다. 그러나 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 \ bq cp \ |
테이블의 콘텐츠를 쿼리 결과로 바꿉니다. |
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에서 임시 테이블을 빌드하려면 다음을 수행합니다.
- 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 정보 스키마 |
데이터베이스의 객체 쿼리 |
일관성 보장 및 트랜잭션 격리
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 쿼리 최대 길이) 스트리밍: 10MB(HTTP 요청 크기 한도) 10,000(요청당 최대 행) |
|
최대 요청 및 응답 크기 | 10MB(요청) 및 10GB(응답), 페이지 나누기 또는 Cloud Storage API를 사용하는 경우에는 거의 무제한입니다. | |
최대 동시 실행 세션 수 | 동시 읽기-쓰기 트랜잭션 63개 서버 동시 연결 2,000개 | 동시 실행 쿼리 100개(슬롯 예약 사용 시 늘어날 수 있음), 사용자당 300개의 동시 실행 API 요청 |
다음 단계
- IBM Netezza에서 BigQuery로 마이그레이션 단계별 안내 보기