Oracle SQL 변환 가이드
이 문서에서는 마이그레이션을 계획하는 데 도움이 되도록 Oracle과 BigQuery 간 SQL 문법 유사점과 차이점을 자세히 설명합니다. 일괄 SQL 변환을 사용하여 SQL 스크립트를 일괄적으로 마이그레이션하거나 대화형 SQL 변환을 사용하여 임시 쿼리를 변환합니다.
데이터 유형
이 섹션에서는 Oracle과 BigQuery의 데이터 유형 간의 유사점을 보여줍니다.
Oracle | BigQuery | 참고 |
---|---|---|
VARCHAR2
|
STRING
|
|
NVARCHAR2
|
STRING
|
|
CHAR
|
STRING
|
|
NCHAR
|
STRING
|
|
CLOB
|
STRING
|
|
NCLOB
|
STRING
|
|
INTEGER
|
INT64
|
|
SHORTINTEGER
|
INT64
|
|
LONGINTEGER
|
INT64
|
|
NUMBER
|
NUMERIC
|
BigQuery에서는 정밀도나 규모에 대한 커스텀 값을 사용자가 지정할 수 없습니다. 따라서 Oracle의 열이 정의되어 BigQuery에서 지원하는 것보다 더 큰 규모를 갖게 될 수 있습니다.
또한 10진수를 저장하기 전에 Oracle은 해당 숫자의 소수점 이하 자릿수가 해당 열에 지정된 것보다 많은 경우 반올림합니다. BigQuery에서는 |
NUMBER(*, x)
|
NUMERIC
|
BigQuery에서는 정밀도나 규모에 대한 커스텀 값을 사용자가 지정할 수 없습니다. 따라서 Oracle의 열이 정의되어 BigQuery에서 지원하는 것보다 더 큰 규모를 갖게 될 수 있습니다.
또한 10진수를 저장하기 전에 Oracle은 해당 숫자의 소수점 이하 자릿수가 해당 열에 지정된 것보다 많은 경우 반올림합니다. BigQuery에서는 |
NUMBER(x, -y)
|
INT64
|
사용자가 10진수를 저장하려고 하면 Oracle이 정수로 반올림합니다. BigQuery의 경우 INT64 로 정의된 열에 소수점을 저장하려고 하면 오류가 발생합니다. 이 경우 ROUND() 함수를 적용해야 합니다.
BigQuery |
NUMBER(x)
|
INT64
|
사용자가 10진수를 저장하려고 하면 Oracle이 정수로 반올림합니다. BigQuery의 경우 INT64 로 정의된 열에 소수점을 저장하려고 하면 오류가 발생합니다. 이 경우 ROUND() 함수를 적용해야 합니다.
BigQuery |
FLOAT
|
FLOAT64 /NUMERIC
|
FLOAT 는 정확한 데이터 유형이며 Oracle의 NUMBER 하위유형입니다. BigQuery에서 FLOAT64 는 대략적인 데이터 유형입니다. NUMERIC 가 BigQuery의 FLOAT 유형에 더 적합할 수 있습니다.
|
BINARY_DOUBLE
|
FLOAT64 /NUMERIC
|
FLOAT 는 정확한 데이터 유형이며 Oracle의 NUMBER 하위유형입니다. BigQuery에서 FLOAT64 는 대략적인 데이터 유형입니다. NUMERIC 가 BigQuery의 FLOAT 유형에 더 적합할 수 있습니다.
|
BINARY_FLOAT
|
FLOAT64 /NUMERIC
|
FLOAT 는 정확한 데이터 유형이며 Oracle의 NUMBER 하위유형입니다. BigQuery에서 FLOAT64 는 대략적인 데이터 유형입니다. NUMERIC 가 BigQuery의 FLOAT 유형에 더 적합할 수 있습니다.
|
LONG
|
BYTES
|
LONG 데이터 유형은 이전 버전에서 사용되며 새 버전의 Oracle Database에서는 권장되지 않습니다.
BigQuery에 |
BLOB
|
BYTES
|
BYTES 데이터 유형은 가변 길이 바이너리 데이터를 저장하는 데 사용할 수 있습니다. 이 필드가 쿼리되지 않고 분석에 사용되지 않는 경우 Cloud Storage에 바이너리 데이터를 저장하는 것이 좋습니다.
|
BFILE
|
STRING
|
바이너리 파일은 Cloud Storage에 저장할 수 있으며 STRING 데이터 유형은 BigQuery 테이블에서 파일을 참조하는 데 사용할 수 있습니다.
|
DATE
|
DATETIME
|
|
TIMESTAMP
|
TIMESTAMP
|
BigQuery는 0~9 범위의 정밀도를 지원하는 Oracle과 비교하여 마이크로초 정밀도(10-6)를 지원합니다.
BigQuery는 TZ 데이터베이스의 시간대 지역 이름과 UTC의 시간대 오프셋을 지원합니다.
BigQuery에서는 Oracle의 |
TIMESTAMP(x)
|
TIMESTAMP
|
BigQuery는 0~9 범위의 정밀도를 지원하는 Oracle과 비교하여 마이크로초 정밀도(10-6)를 지원합니다.
BigQuery는 TZ 데이터베이스의 시간대 지역 이름과 UTC의 시간대 오프셋을 지원합니다.
BigQuery에서는 Oracle의 |
TIMESTAMP WITH TIME ZONE
|
TIMESTAMP
|
BigQuery는 0~9 범위의 정밀도를 지원하는 Oracle과 비교하여 마이크로초 정밀도(10-6)를 지원합니다.
BigQuery는 TZ 데이터베이스의 시간대 지역 이름과 UTC의 시간대 오프셋을 지원합니다.
BigQuery에서는 Oracle의 |
TIMESTAMP WITH LOCAL TIME ZONE
|
TIMESTAMP
|
BigQuery는 0~9 범위의 정밀도를 지원하는 Oracle과 비교하여 마이크로초 정밀도(10-6)를 지원합니다.
BigQuery는 TZ 데이터베이스의 시간대 지역 이름과 UTC의 시간대 오프셋을 지원합니다.
BigQuery에서는 Oracle의 |
INTERVAL YEAR TO MONTH
|
STRING
|
간격 값은 BigQuery에 STRING 데이터 유형으로 저장할 수 있습니다.
|
INTERVAL DAY TO SECOND
|
STRING
|
간격 값은 BigQuery에 STRING 데이터 유형으로 저장할 수 있습니다.
|
RAW
|
BYTES
|
BYTES 데이터 유형은 가변 길이 바이너리 데이터를 저장하는 데 사용할 수 있습니다. 이 필드가 분석에서 쿼리되고 사용되지 않는 경우 Cloud Storage에 바이너리 데이터를 저장하는 것이 좋습니다.
|
LONG RAW
|
BYTES
|
BYTES 데이터 유형은 가변 길이 바이너리 데이터를 저장하는 데 사용할 수 있습니다. 이 필드가 분석에서 쿼리되고 사용되지 않는 경우 Cloud Storage에 바이너리 데이터를 저장하는 것이 좋습니다.
|
ROWID
|
STRING
|
이러한 데이터 유형은 Oracle 내부에서 테이블의 행에 대한 고유한 주소를 지정하는 데 사용됩니다. 일반적으로 ROWID 또는 UROWID 필드는 애플리케이션에서 사용하면 안 됩니다. 하지만 이 경우 STRING 데이터 유형을 사용하여 이 데이터를 보관할 수 있습니다.
|
유형 형식 지정
Oracle SQL은 표현식과 열 데이터를 표시하고 데이터 유형 간 변환을 위해 매개변수로 설정된 기본 형식 집합을 사용합니다. 예를 들어 NLS_DATE_FORMAT
을 YYYY/MM/DD
형식으로 설정하면 기본적으로 YYYY/MM/DD
로 날짜가 지정됩니다. Oracle 온라인 문서에서 NLS 설정에 관해 자세히 알아보세요.
BigQuery에는 초기화 매개변수가 없습니다.
기본적으로 BigQuery는 로드할 때 모든 소스 데이터가 UTF-8로 인코딩되는 것으로 예상합니다. CSV 파일에 ISO-8859-1 형식으로 인코딩된 데이터가 있는 경우 데이터를 가져올 때 인코딩을 명시적으로 지정할 수 있습니다. 그래야 BigQuery에서 가져오기 프로세스 중에 데이터를 UTF-8로 올바르게 변환할 수 있습니다.
ISO-8859-1 또는 UTF-8로 인코딩된 데이터만 가져올 수 있습니다. BigQuery는 데이터를 UTF-8로 인코딩하여 저장하고 반환합니다.
원하는 날짜 형식 또는 시간대는 DATE
및 TIMESTAMP
함수에서 설정할 수 있습니다.
타임스탬프 및 날짜 유형 형식 지정
타임스탬프 및 날짜 형식 지정 요소를 Oracle에서 BigQuery로 변환할 때는 다음 표에 요약된 것과 같이 TIMESTAMP
와 DATETIME
간의 시간대 차이에 주의해야 합니다.
형식(CURRENT_*
)은 함수가 아닌 키워드이므로 Oracle 형식에는 괄호를 사용하지 않습니다.
Oracle | BigQuery | 참고 | |
---|---|---|---|
CURRENT_TIMESTAMP
|
Oracle의 TIMESTAMP 정보에는 열 정의 또는 설정 TIME_ZONE 변수의 WITH TIME ZONE 에 따라 정의되는 여러 시간대 정보가 있을 수 있습니다.
|
가능한 경우 ISO 형식으로 지정된 CURRENT_TIMESTAMP() 함수를 사용하세요. 그러나 출력 형식은 항상 UTC 시간대로 표시됩니다. 내부적으로 BigQuery에는 시간대가 없습니다.
ISO 형식과의 차이점에 대한 다음 사항에 유의하세요.
명시적 형식을 사용하려면 문자열을 명시적으로 변환하는 |
|
CURRENT_DATE
|
Oracle은 날짜에 2가지 유형을 사용합니다.
SYSDATE or CURRENT_DATE 에서 반환할 때 유형 13을 사용합니다.
|
BigQuery에는 항상 ISO 8601 형식으로 날짜를 반환하는 별도의 DATE 형식이 사용됩니다.
|
|
CURRENT_DATE-3
|
날짜 값은 정수로 표시됩니다. Oracle은 날짜 유형의 산술 연산자를 지원합니다. | 날짜 유형의 경우 DATE_ADD () 또는 DATE_SUB ()를 사용하세요.
BigQuery는 INT64 , NUMERIC , FLOAT64 데이터 유형에 산술 연산자를 사용합니다.
|
|
NLS_DATE_FORMAT
|
세션 또는 시스템 날짜 형식을 설정하세여요. | BigQuery는 항상 ISO 8601을 사용하므로 Oracle 날짜와 시간을 변환해야 합니다. |
쿼리 구문
이 섹션에서는 Oracle과 BigQuery 간 쿼리 문법의 차이점을 설명합니다.
SELECT
문
대부분의 Oracle SELECT
문은 BigQuery와 호환됩니다.
함수, 연산자, 표현식
다음 섹션에는 Oracle 함수와 그에 해당하는 BigQuery 함수 간의 매핑이 나와 있습니다.
비교 연산자
Oracle 및 BigQuery 비교 연산자는 ANSI SQL:2011을 준수합니다. 아래 표의 비교 연산자는 BigQuery와 Oracle에서 동일합니다. BigQuery에서는 REGEXP_LIKE
대신 REGEXP_CONTAINS
를 사용할 수 있습니다.
연산자 | 설명 |
---|---|
"="
|
같음 |
<>
|
같지 않음 |
!=
|
같지 않음 |
>
|
보다 큼 |
>=
|
이상 |
<
|
보다 작음 |
<=
|
작거나 같음 |
IN ( )
|
목록의 값과 일치 |
NOT
|
조건을 부정함 |
BETWEEN
|
범위 내(경계 포함) |
IS NULL
|
NULL 값
|
IS NOT NULL
|
NULL 값이 아님
|
LIKE
|
%를 사용한 패턴 일치 |
EXISTS
|
서브 쿼리가 하나 이상의 행을 반환하면 조건이 충족됨 |
테이블의 연산자는 BigQuery와 Oracle에서 동일합니다.
논리 표현식 및 함수
집계 함수
다음 표에서는 일반적인 Oracle 집계, 통계 집계, 근사치 집계 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
Oracle | BigQuery |
---|---|
ANY_VALUE (Oracle 19c부터) |
ANY_VALUE |
APPROX_COUNT
|
HLL_COUNT set of functions with specified precision
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT_AGG
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT_DETAIL
|
APPROX_COUNT_DISTINCT
|
APPROX_PERCENTILE(percentile) WITHIN GROUP (ORDER BY expression)
|
APPROX_QUANTILES(expression, 100)[ BigQuery는 Oracle이 정의하는 나머지 인수를 지원하지 않습니다. |
<codeAPPROX_PERCENTILE_AGG | APPROX_QUANTILES(expression, 100)[
|
APPROX_PERCENTILE_DETAIL
|
APPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
|
APPROX_SUM
|
APPROX_TOP_SUM(expression, weight, number)
|
AVG
|
AVG
|
BIT_COMPLEMENT
|
비트 NOT 연산자: ~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
CARDINALITY
|
COUNT
|
COLLECT
|
BigQuery는 TYPE AS TABLE OF 를 지원하지 않습니다.
BigQuery에서 STRING_AGG() 또는 ARRAY_AGG() 를 사용해 보세요.
|
CORR/CORR_K/
CORR_S
|
CORR
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
FIRST
|
BigQuery에 암시적으로 존재하지 않습니다. 사용자 정의 함수(UDF)를 사용해 보세요. |
GROUP_ID
|
BigQuery에는 사용되지 않습니다. |
GROUPING
|
BigQuery에는 사용되지 않습니다. |
GROUPING_ID
|
BigQuery에는 사용되지 않습니다. |
LAST
|
BigQuery에 암시적으로 존재하지 않습니다. UDF를 사용해 보세요. |
LISTAGG
|
STRING_AGG, ARRAY_CONCAT_AGG(expression [ORDER BY key [{ASC|DESC}] [, ... ]] [LIMIT n])
|
MAX
|
MAX
|
MIN
|
MIN
|
OLAP_CONDITION
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
OLAP_EXPRESSION
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
OLAP_EXPRESSION_BOOL
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
OLAP_EXPRESSION_DATE
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
OLAP_EXPRESSION_TEXT
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
OLAP_TABLE
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
POWERMULTISET
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
POWERMULTISET_BY_CARDINALITY
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
QUALIFY
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
REGR_AVGX
|
AVG( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, ind_var_expr) )
|
REGR_AVGY
|
AVG( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, dep_var_expr) )
|
REGR_COUNT
|
SUM( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, 1) )
|
REGR_INTERCEPT
|
AVG(dep_var_expr)
|
REGR_R2
|
(COUNT(dep_var_expr) *
|
REGR_SLOPE
|
COVAR_SAMP(ind_var_expr,
|
REGR_SXX
|
SUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
|
REGR_SXY
|
SUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
|
REGR_SYY
|
SUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
|
ROLLUP
|
ROLLUP
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
WM_CONCAT
|
STRING_AGG
|
BigQuery는 다음과 같은 집계 함수를 추가로 제공합니다.
분석 함수
다음 표는 일반적인 Oracle 분석 함수와 집계 분석 함수 간의 매핑과 그에 해당하는 BigQuery 항목을 보여줍니다.
Oracle | BigQuery |
---|---|
AVG
|
AVG
|
BIT_COMPLEMENT
|
비트 NOT 연산자: ~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
BOOL_TO_INT
|
CAST(X AS INT64)
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
CUBE_TABLE
|
BigQuery에서 지원되지 않습니다. BI 도구 또는 커스텀 UDF를 사용해 보세요. |
CUME_DIST
|
CUME_DIST
|
DENSE_RANK(ANSI)
|
DENSE_RANK
|
FEATURE_COMPARE
|
BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요. |
FEATURE_DETAILS
|
BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요. |
FEATURE_ID
|
BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요. |
FEATURE_SET
|
BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요. |
FEATURE_VALUE
|
BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요. |
FIRST_VALUE
|
FIRST_VALUE
|
HIER_CAPTION
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_CHILD_COUNT
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_COLUMN
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_DEPTH
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_DESCRIPTION
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_HAS_CHILDREN
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_LEVEL
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_MEMBER_NAME
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_ORDER
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
HIER_UNIQUE_MEMBER_NAME
|
BigQuery에서는 계층적 쿼리가 지원되지 않습니다. |
LAST_VALUE
|
LAST_VALUE
|
LAG
|
LAG
|
LEAD
|
LEAD
|
LISTAGG
|
ARRAY_AGG
|
MATCH_NUMBER
|
BigQuery에서 정규식과 UDF를 사용하여 패턴 인식 및 계산을 실행할 수 있습니다. |
MATCH_RECOGNIZE
|
BigQuery에서 정규식과 UDF를 사용하여 패턴 인식 및 계산을 실행할 수 있습니다. |
MAX
|
MAX
|
MEDIAN
|
PERCENTILE_CONT(x, 0.5 RESPECT NULLS) OVER()
|
MIN
|
MIN
|
NTH_VALUE
|
NTH_VALUE (value_expression, constant_integer_expression [{RESPECT | IGNORE} NULLS])
|
NTILE
|
NTILE(constant_integer_expression)
|
PERCENT_RANK
|
PERCENT_RANK
|
PERCENTILE_CONT
|
PERCENTILE_CONT
|
PERCENTILE_CONT
|
PERCENTILE_DISC
|
PRESENTNNV
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
PRESENTV
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
PREVIOUS
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
RANK (ANSI)
|
RANK
|
RATIO_TO_REPORT(expr) OVER (partition clause)
|
expr / SUM(expr) OVER (partition clause)
|
ROW_NUMBER
|
ROW_NUMBER
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
VARIANCE
|
VARIANCE()
|
WIDTH_BUCKET
|
UDF를 사용할 수 있습니다. |
날짜/시간 함수
다음 표는 일반적인 Oracle 날짜/시간 함수와 그에 해당하는 BigQuery 함수 간의 매핑을 보여줍니다.
Oracle | BigQuery |
---|---|
ADD_MONTHS(date, integer)
|
DATE_ADD(date, INTERVAL integer MONTH), 날짜가 TIMESTAMP 인 경우 다음을 사용할 수 있습니다.
|
CURRENT_DATE
|
CURRENT_DATE
|
CURRENT_TIME
|
CURRENT_TIME
|
CURRENT_TIMESTAMP
|
CURRENT_TIMESTAMP
|
DATE - k
|
DATE_SUB(date_expression, INTERVAL k DAY)
|
DATE + k
|
DATE_ADD(date_expression, INTERVAL k DAY)
|
DBTIMEZONE
|
BigQuery는 데이터베이스 시간대를 지원하지 않습니다. |
EXTRACT
|
EXTRACT(DATE), EXTRACT(TIMESTAMP)
|
LAST_DAY
|
DATE_SUB(
|
LOCALTIMESTAMP
|
BigQuery는 시간대 설정을 지원하지 않습니다. |
MONTHS_BETWEEN
|
DATE_DIFF(date_expression, date_expression, MONTH)
|
NEW_TIME
|
DATE(timestamp_expression, time zone)
|
NEXT_DAY
|
DATE_ADD(
|
SYS_AT_TIME_ZONE
|
CURRENT_DATE([time_zone])
|
SYSDATE
|
CURRENT_DATE()
|
SYSTIMESTAMP
|
CURRENT_TIMESTAMP()
|
TO_DATE
|
PARSE_DATE
|
TO_TIMESTAMP
|
PARSE_TIMESTAMP
|
TO_TIMESTAMP_TZ
|
PARSE_TIMESTAMP
|
TZ_OFFSET
|
BigQuery에서 지원되지 않습니다. 커스텀 UDF를 사용해 보세요. |
WM_CONTAINS WM_EQUALS WM_GREATERTHAN WM_INTERSECTION WM_LDIFF WM_LESSTHAN WM_MEETS WM_OVERLAPS WM_RDIFF |
BigQuery에서는 마침표가 사용되지 않습니다. UDF를 사용하여 두 기간을 비교할 수 있습니다. |
BigQuery는 다음과 같은 날짜/시간 함수를 추가로 제공합니다.
CURRENT_DATETIME
DATE_FROM_UNIX_DATE
DATE_TRUNC
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
FORMAT_DATE
FORMAT_DATETIME
문자열 함수
다음 표에서는 Oracle 문자열 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
Oracle | BigQuery |
---|---|
ASCII
|
TO_CODE_POINTS(string_expr)[OFFSET(0)]
|
ASCIISTR
|
BigQuery에서 UTF-16을 지원하지 않음 |
RAWTOHEX
|
TO_HEX
|
LENGTH
|
CHAR_LENGTH
|
LENGTH
|
CHARACTER_LENGTH
|
CHR
|
CODE_POINTS_TO_STRING(
|
COLLATION
|
BigQuery에 존재하지 않습니다. BigQuery는 DML에서 COLLATE를 지원하지 않음 |
COMPOSE
|
커스텀 사용자 정의 함수입니다. |
CONCAT, (|| operator)
|
CONCAT
|
DECOMPOSE
|
커스텀 사용자 정의 함수입니다. |
ESCAPE_REFERENCE (UTL_I18N)
|
BigQuery에서는 지원되지 않습니다. 사용자 정의 함수를 사용해 보세요. |
INITCAP
|
INITCAP
|
INSTR/INSTR2/INSTR4/INSTRB/INSTRC
|
커스텀 사용자 정의 함수입니다. |
LENGTH/LENGTH2/LENGTH4/LENGTHB/LENGTHC
|
LENGTH
|
LOWER
|
LOWER
|
LPAD
|
LPAD
|
LTRIM
|
LTRIM
|
NLS_INITCAP
|
커스텀 사용자 정의 함수입니다. |
NLS_LOWER
|
LOWER
|
NLS_UPPER
|
UPPER
|
NLSSORT
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
POSITION
|
STRPOS(string, substring)
|
PRINTBLOBTOCLOB
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. |
REGEXP_COUNT
|
ARRAY_LENGTH(REGEXP_EXTRACT_ALL(value, regex))
|
REGEXP_INSTR
|
STRPOS(source_string, REGEXP_EXTRACT(source_string, regexp_string))
참고: 첫 번째 어커런스를 반환합니다. |
REGEXP_REPLACE
|
REGEXP_REPLACE
|
REGEXP_LIKE
|
IF(REGEXP_CONTAINS,1,0)
|
REGEXP_SUBSTR
|
REGEXP_EXTRACT, REGEXP_EXTRACT_ALL
|
REPLACE
|
REPLACE
|
REVERSE
|
REVERSE
|
RIGHT
|
SUBSTR(source_string, -1, length)
|
RPAD
|
RPAD
|
RTRIM
|
RTRIM
|
SOUNDEX
|
BigQuery에서 지원되지 않습니다. 커스텀 UDF를 사용해 보세요. |
STRTOK
|
SPLIT(instring, delimiter)[ORDINAL(tokennum)]
|
SUBSTR/SUBSTRB/SUBSTRC/SUBSTR2/SUBSTR4
|
SUBSTR
|
TRANSLATE
|
REPLACE
|
TRANSLATE USING
|
REPLACE
|
TRIM
|
TRIM
|
UNISTR
|
CODE_POINTS_TO_STRING
|
UPPER
|
UPPER
|
|| (수직 막대)
|
CONCAT
|
BigQuery는 다음과 같은 문자열 함수를 추가로 제공합니다.
BYTE_LENGTH
CODE_POINTS_TO_BYTES
ENDS_WITH
FROM_BASE32
FROM_BASE64
FROM_HEX
NORMALIZE
NORMALIZE_AND_CASEFOLD
REPEAT
SAFE_CONVERT_BYTES_TO_STRING
SPLIT
STARTS_WITH
STRPOS
TO_BASE32
TO_BASE64
TO_CODE_POINTS
수학 함수
다음 표에서는 Oracle 수학 함수와 이에 상응하는 BigQuery 함수 간의 매핑을 확인할 수 있습니다.
Oracle | BigQuery |
---|---|
ABS
|
ABS
|
ACOS
|
ACOS
|
ACOSH
|
ACOSH
|
ASIN
|
ASIN
|
ASINH
|
ASINH
|
ATAN
|
ATAN
|
ATAN2
|
ATAN2
|
ATANH
|
ATANH
|
CEIL
|
CEIL
|
CEILING
|
CEILING
|
COS
|
COS
|
COSH
|
COSH
|
EXP
|
EXP
|
FLOOR
|
FLOOR
|
GREATEST
|
GREATEST
|
LEAST
|
LEAST
|
LN
|
LN
|
LNNVL
|
ISNULL 과 함께 사용합니다. |
LOG
|
LOG
|
MOD (% operator)
|
MOD
|
POWER (** operator)
|
POWER, POW
|
DBMS_RANDOM.VALUE
|
RAND
|
RANDOMBYTES
|
BigQuery에서 지원되지 않습니다. 커스텀 UDF 및 RAND 함수를 사용해 보세요. |
RANDOMINTEGER
|
CAST(FLOOR(10*RAND()) AS INT64)
|
RANDOMNUMBER
|
BigQuery에서 지원되지 않습니다. 커스텀 UDF 및 RAND 함수를 사용해 보세요. |
REMAINDER
|
MOD
|
ROUND
|
ROUND
|
ROUND_TIES_TO_EVEN
|
ROUND()
|
SIGN
|
SIGN
|
SIN
|
SIN
|
SINH
|
SINH
|
SQRT
|
SQRT
|
STANDARD_HASH
|
FARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
|
STDDEV
|
STDDEV |
TAN
|
TAN
|
TANH
|
TANH
|
TRUNC
|
TRUNC
|
NVL
|
IFNULL(expr, 0), COALESCE(exp, 0)
|
BigQuery는 다음과 같은 수학 함수를 추가로 제공합니다.
유형 변환 함수
다음 표에서는 Oracle 유형 변환 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
Oracle | BigQuery | |
---|---|---|
BIN_TO_NUM
|
SAFE_CONVERT_BYTES_TO_STRING(value)
|
|
BINARY2VARCHAR
|
SAFE_CONVERT_BYTES_TO_STRING(value)
|
|
CAST
|
CAST(expr AS typename)
|
|
CHARTOROWID
|
Oracle 관련은 필요하지 않습니다. | |
CONVERT
|
BigQuery는 문자 집합을 지원하지 않습니다. 커스텀 사용자 정의 함수를 사용해 보세요. | |
EMPTY_BLOB
|
BLOB 는 BigQuery에서 사용되지 않습니다.
|
|
EMPTY_CLOB
|
CLOB 는 BigQuery에서 사용되지 않습니다.
|
|
FROM_TZ
|
시간대가 있는 유형은 BigQuery에서 지원되지 않습니다. 사용자 정의 함수 및 FORMAT_TIMESTAMP를 사용해 보세요. | |
INT_TO_BOOL
|
CAST
|
|
IS_BIT_SET
|
BigQuery에 암시적으로 존재하지 않습니다. UDF를 사용해 보세요. | |
NCHR
|
UDF를 사용하여 바이너리의 char 등가 항목을 가져올 수 있습니다. | |
NUMTODSINTERVAL
|
BigQuery에서 INTERVAL 데이터 유형이 지원되지 않음
|
|
NUMTOHEX
|
BigQuery에서 지원되지 않습니다. 커스텀 UDF 및 TO_HEX 함수를 사용해 보세요.
|
|
NUMTOHEX2
|
||
NUMTOYMINTERVAL
|
BigQuery에서는 INTERVAL 데이터 유형이 지원되지 않습니다.
|
|
RAW_TO_CHAR
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
RAW_TO_NCHAR
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
RAW_TO_VARCHAR2
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
RAWTOHEX
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
RAWTONHEX
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
RAWTONUM
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
RAWTONUM2
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
RAWTOREF
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
REFTOHEX
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
REFTORAW
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
ROWIDTOCHAR
|
ROWID 는 Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. 이 값은 문자열로 표시해야 합니다.
|
|
ROWIDTONCHAR
|
ROWID 는 Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. 이 값은 문자열로 표시해야 합니다.
|
|
SCN_TO_TIMESTAMP
|
SCN 은 Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. 이 값은 타임스탬프로 표시되어야 합니다.
|
|
TO_ACLID TO_TIMESTAMP TO_TIMESTAMP_TZ TO_TIME_TZ TO_UTC_TIMEZONE_TZ TO_YMINTERVAL |
CAST(expr AS typename) PARSE_DATE PARSE_TIMESTAMP 쿼리에서 사용되는 Cast 문법은 표현식의 결과 유형이 다른 유형으로 변환되어야 함을 나타냅니다. |
|
TREAT
|
Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. | |
VALIDATE_CONVERSION
|
BigQuery에서 지원되지 않습니다. 커스텀 UDF를 사용해 보세요. | |
VSIZE
|
BigQuery에서 지원되지 않습니다. 커스텀 UDF를 사용해 보세요. |
JSON 함수
다음 표에서는 Oracle JSON 함수와 그에 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.
Oracle | BigQuery |
---|---|
AS_JSON
|
TO_JSON_STRING(value[, pretty_print])
|
JSON_ARRAY
|
UDF 및 TO_JSON_STRING 함수를 사용해 보세요.
|
JSON_ARRAYAGG
|
UDF 및 TO_JSON_STRING 함수를 사용해 보세요.
|
JSON_DATAGUIDE
|
커스텀 사용자 정의 함수입니다. |
JSON_EQUAL
|
커스텀 사용자 정의 함수입니다. |
JSON_EXIST
|
UDF 및 JSON_EXTRACT 또는 JSON_EXTRACT_SCALAR 를 사용해 보세요.
|
JSON_MERGEPATCH
|
커스텀 사용자 정의 함수입니다. |
JSON_OBJECT
|
BigQuery에서 지원되지 않습니다. |
JSON_OBJECTAGG
|
BigQuery에서 지원되지 않습니다. |
JSON_QUERY
|
UDF와 JSON_EXTRACT 또는 JSON_EXTRACT_SCALAR 를 사용해 보세요.
|
JSON_TABLE
|
커스텀 사용자 정의 함수입니다. |
JSON_TEXTCONTAINS
|
UDF와 JSON_EXTRACT 또는 JSON_EXTRACT_SCALAR 를 사용해 보세요.
|
JSON_VALUE
|
JSON_EXTRACT_SCALAR
|
XML 함수
BigQuery는 암시적 XML 함수를 제공하지 않습니다. XML은 문자열로 BigQuery에 로드할 수 있으며 UDF를 사용하여 XML을 파싱할 수 있습니다. 또는 Dataflow와 같은 ETL/ELT 도구로 XML 처리를 실행할 수 있습니다. 다음 목록에는 Oracle XML 함수가 나와 있습니다.
Oracle | BigQuery |
---|---|
DELETEXML
|
Dataflow와 같은 BigQuery UDF 또는 ETL 도구를 사용하여 XML을 처리할 수 있습니다. |
ENCODE_SQL_XML | |
EXISTSNODE | |
EXTRACTCLOBXML | |
EXTRACTVALUE | |
INSERTCHILDXML | |
INSERTCHILDXMLAFTER | |
INSERTCHILDXMLBEFORE | |
INSERTXMLAFTER | |
INSERTXMLBEFORE | |
SYS_XMLAGG | |
SYS_XMLANALYZE | |
SYS_XMLCONTAINS | |
SYS_XMLCONV | |
SYS_XMLEXNSURI | |
SYS_XMLGEN | |
SYS_XMLI_LOC_ISNODE | |
SYS_XMLI_LOC_ISTEXT | |
SYS_XMLINSTR | |
SYS_XMLLOCATOR_GETSVAL | |
SYS_XMLNODEID | |
SYS_XMLNODEID_GETLOCATOR | |
SYS_XMLNODEID_GETOKEY | |
SYS_XMLNODEID_GETPATHID | |
SYS_XMLNODEID_GETPTRID | |
SYS_XMLNODEID_GETRID | |
SYS_XMLNODEID_GETSVAL | |
SYS_XMLT_2_SC | |
SYS_XMLTRANSLATE | |
SYS_XMLTYPE2SQL | |
UPDATEXML | |
XML2OBJECT | |
XMLCAST | |
XMLCDATA | |
XMLCOLLATVAL | |
XMLCOMMENT | |
XMLCONCAT | |
XMLDIFF | |
XMLELEMENT | |
XMLEXISTS | |
XMLEXISTS2 | |
XMLFOREST | |
XMLISNODE | |
XMLISVALID | |
XMLPARSE | |
XMLPATCH | |
XMLPI | |
XMLQUERY | |
XMLQUERYVAL | |
XMLSERIALIZE | |
XMLTABLE | |
XMLTOJSON | |
XMLTRANSFORM | |
XMLTRANSFORMBLOB | |
XMLTYPE |
머신러닝 함수
Oracle과 BigQuery의 머신러닝(ML) 함수는 서로 다릅니다.
Oracle에서는 데이터베이스에서 ML을 실행하려면 고급 분석 팩과 라이선스가 필요합니다.
Oracle은 ML에 DBMS_DATA_MINING
패키지를 사용합니다. Oracle 데이터 마이너 작업을 변환하려면 코드를 다시 작성해야 하며 BigQuery ML,
AI API(Speech-to-Text, Text-to-Speech 포함), Dialogflow, Cloud Translation, NLP,
Cloud Vision, Timeseries Insights API, AutoML, AutoML Tables 또는 AI Platform 등의 포괄적인 Google AI 제품군에서 선택할 수 있습니다. Google 사용자 관리 노트북을 데이터 과학자의 개발 환경으로 사용할 수 있으며 Google AI Platform Training을 사용하여 대규모로 워크로드 학습 및 스코어링을 실행할 수 있습니다. 다음 표에는 Oracle ML 함수가 나와 있습니다.
Oracle | BigQuery |
---|---|
CLASSIFIER
|
머신러닝 분류기 및 회귀 옵션은 BigQuery ML을 참고하세요. |
CLUSTER_DETAILS
|
|
CLUSTER_DISTANCE
|
|
CLUSTER_ID
|
|
CLUSTER_PROBABILITY
|
|
CLUSTER_SET
|
|
PREDICTION
|
|
PREDICTION_BOUNDS
|
|
PREDICTION_COST
|
|
PREDICTION_DETAILS
|
|
PREDICTION_PROBABILITY
|
|
PREDICTION_SET
|
보안 함수
다음 표에는 Oracle과 BigQuery에서 사용자를 식별하는 함수가 나와 있습니다.
Oracle | BigQuery |
---|---|
UID
|
SESSION_USER
|
USER/SESSION_USER/CURRENT_USER
|
SESSION_USER()
|
설정 또는 배열 함수
다음 표에서는 Oracle의 설정 또는 배열 함수와 BigQuery의 해당 함수를 보여줍니다.
Oracle | BigQuery |
---|---|
MULTISET
|
ARRAY_AGG
|
MULTISET EXCEPT
|
ARRAY_AGG([DISTINCT] expression)
|
MULTISET INTERSECT
|
ARRAY_AGG([DISTINCT])
|
MULTISET UNION
|
ARRAY_AGG
|
윈도우 함수
다음 표에서는 Oracle의 윈도우 함수와 BigQuery의 해당 함수를 보여줍니다.
Oracle | BigQuery |
---|---|
LAG
|
LAG (value_expression[, offset [, default_expression]])
|
LEAD
|
LEAD (value_expression[, offset [, default_expression]])
|
계층적 또는 재귀 쿼리
계층적 또는 재귀 쿼리는 BigQuery에 사용되지 않습니다. 계층의 깊이가 알려진 경우 다음 예시에서 설명하는 것처럼 조인을 사용하면 비슷한 기능을 구현할 수 있습니다. BigQueryStorage API 및 Spark를 활용하는 것도 또 다른 해결 방법입니다.
select
array(
select e.update.element
union all
select c1 from e.update.element.child as c1
union all
select c2 from e.update.element.child as c1, c1.child as c2
union all
select c3 from e.update.element.child as c1, c1.child as c2, c2.child as c3
union all
select c4 from e.update.element.child as c1, c1.child as c2, c2.child as c3, c3.child as c4
union all
select c5 from e.update.element.child as c1, c1.child as c2, c2.child as c3, c3.child as c4, c4.child as c5
) as flattened,
e as event
from t, t.events as e
다음 표에서는 Oracle의 계층적 함수를 보여줍니다.
Oracle | BigQuery |
---|---|
DEPTH
|
계층적 쿼리는 BigQuery에 사용되지 않습니다. |
PATH
|
|
SYS_CONNECT_BY_PATH (hierarchical)
|
UTL 함수
UTL_File
패키지는 주로 PL/SQL에서 운영체제 파일을 읽고 쓰는 데 사용됩니다. Cloud Storage는 모든 종류의 원시 파일 스테이징에 사용할 수 있습니다.
Cloud Storage에서 파일을 읽고 쓰려면 외부 테이블과 BigQuery 로드 및 내보내기를 사용해야 합니다. 자세한 내용은 외부 데이터 소스 소개를 참조하세요.
공간 함수
BigQuery 지리정보 분석을 사용하여 공간 함수를 대체할 수 있습니다. Oracle에는 SDO_GEOM_KEY
, SDO_GEOM_MBR
, SDO_GEOM_MMB
와 같은 SDO_*
함수 및 유형이 있습니다. 이러한 함수는 공간 분석에 사용됩니다. 지리정보 분석을 사용하여 공간 분석을 실행할 수 있습니다.
DML 구문
이 섹션에서는 Oracle과 BigQuery 간 데이터 관리 언어 문법의 차이점을 설명합니다.
INSERT
문
대부분의 Oracle INSERT
문은 BigQuery와 호환됩니다. 다음 표에는 예외 사항이 나와 있습니다.
BigQuery의 DML 스크립트와 그에 해당하는 Oracle의 문 간에는 시맨틱스의 일관성 측면에 약간의 차이점이 있습니다. 스냅샷 격리와 세션 및 트랙잭션 처리에 관한 개요는 이 문서의 CREATE [UNIQUE] INDEX
section
을 참조하세요.
Oracle | BigQuery |
---|---|
INSERT INTO table VALUES (...);
|
INSERT INTO table (...) VALUES (...);
Oracle은 null 비허용 열에
참고: BigQuery에서는 대상 테이블의 모든 열 값이 서수 위치에 따라 오름차순으로 포함된 경우에만 |
INSERT INTO table VALUES (1,2,3);
|
INSERT INTO table VALUES (1,2,3),
(4,5,6),
BigQuery에는 매일 실행 가능한 DML 문 수를 제한하는 DML 할당량이 적용됩니다. 할당량을 최대한 활용하려면 다음 방법을 사용해 보세요.
|
UPDATE
문
Oracle UPDATE
문은 대부분 BigQuery와 호환되지만 BigQuery에서는 UPDATE
문에 WHERE
절이 있어야 합니다.
가능하다면 UPDATE
와 INSERT
문을 여러 개 사용하기 보다 일괄 DML 문을 사용하는 것이 좋습니다. BigQuery의 DML 스크립트와 그에 해당하는 Oracle의 문 간에는 시맨틱스의 일관성 측면에 약간의 차이점이 있습니다.
스냅샷 격리와 세션 및 트랙잭션 처리에 관한 개요는 이 문서의 CREATE INDEX
섹션을 참조하세요.
다음 표에서는 동일한 작업을 수행하는 Oracle UPDATE
문과 BigQuery 문을 보여줍니다.
BigQuery의 UPDATE
문에는 WHERE
절이 있어야 합니다.
BigQuery의 UPDATE
에 대한 자세한 내용은 DML 문서에서 BigQuery UPDATE 예시를 참고하세요.
DELETE
및 TRUNCATE
문
테이블 스키마에 영향을 주지 않고 테이블에서 행을 삭제하려면 DELETE
및 TRUNCATE
문을 사용합니다. TRUNCATE
는 BigQuery에서 사용되지 않습니다.
하지만 DELETE
문을 사용하면 동일한 효과를 얻을 수 있습니다.
BigQuery의 DELETE
문에는 WHERE
절이 있어야 합니다.
BigQuery의 DELETE
에 대한 자세한 내용은 DML 문서에서 BigQuery DELETE
예시를 참조하세요.
Oracle | BigQuery |
---|---|
DELETE database.table;
|
DELETE FROM table WHERE TRUE;
|
MERGE
문
MERGE
문은 INSERT
, UPDATE
, DELETE
작업을 단일 UPSERT
문으로 결합하여 원자적으로 작업을 수행할 수 있습니다. MERGE
작업은 각 대상 행에 대해 최대 1개의 소스 행과 일치해야 합니다.
BigQuery와 Oracle은 모두 ANSI 문법을 따릅니다.
그러나 BigQuery의 DML 스크립트와 그에 해당하는 Oracle의 문 간에는 시맨틱스의 일관성 측면에 약간의 차이점이 있습니다.
DDL 구문
이 섹션에서는 Oracle과 BigQuery 간 데이터 정의 언어 문법의 차이점을 설명합니다.
CREATE TABLE
문
대부분의 Oracle CREATE TABLE
문은 BigQuery에서 사용되지 않는 다음 제약 조건과 문법 요소를 제외하고 BigQuery와 호환됩니다.
STORAGE
TABLESPACE
DEFAULT
GENERATED ALWAYS AS
ENCRYPT
PRIMARY KEY (col, ...)
. 자세한 내용은CREATE INDEX
를 참조하세요.UNIQUE INDEX
. 자세한 내용은CREATE INDEX
를 참조하세요.CONSTRAINT..REFERENCES
DEFAULT
PARALLEL
COMPRESS
BigQuery의 CREATE TABLE
에 대한 자세한 내용은 BigQuery CREATE TABLE
예시를 참고하세요.
열 옵션 및 속성
ID 열은 열에 자동 증가를 사용 설정하는 Oracle 12c 버전과 함께 도입되었습니다. BigQuery에서는 이를 사용하지 않으며 다음과 같은 일괄 처리 방식으로 수행할 수 있습니다. 서로게이트 키 및 지연 변경 측정기준(SCD)에 대한 자세한 내용은 다음 가이드를 참조하세요.
Oracle | BigQuery |
---|---|
CREATE TABLE table (
|
INSERT INTO dataset.table SELECT
|
열 주석
Oracle은 Comment
문법을 사용하여 열에 주석을 추가합니다. 다음 표와 같이 이 기능은 열 설명을 사용하여 BigQuery에서 유사하게 구현할 수 있습니다.
Oracle | BigQuery |
---|---|
Comment on column table is 'column desc';
|
CREATE TABLE dataset.table (
|
임시 테이블
Oracle은 스크립트에 중간 결과를 저장하는 데 종종 사용되는 임시 테이블을 지원합니다. BigQuery에서는 임시 테이블이 지원됩니다.
Oracle | BigQuery |
---|---|
CREATE GLOBAL TEMPORARY TABLE
|
CREATE TEMP TABLE temp_tab
|
다음 Oracle 요소는 BigQuery에서 사용되지 않습니다.
ON COMMIT DELETE ROWS;
ON COMMIT PRESERVE ROWS;
BigQuery에서 임시 테이블을 에뮬레이션하는 다른 방법도 있습니다.
- 데이터 세트 TTL: 데이터 세트에서 생성된 모든 테이블의 수명이 데이터 세트의 수명보다 오래 지속되지 않으므로 테이블을 임시로 사용할 수 있도록 수명이 짧은(예: 1시간) 데이터 세트를 만듭니다. 이 데이터 세트의 모든 테이블 이름 앞에
temp
를 추가하여 임시 테이블임을 명확하게 나타낼 수 있습니다. 테이블 TTL: 다음과 유사한 DDL 문을 사용하여 테이블별로 단기 테이블을 만듭니다.
CREATE TABLE temp.name (col1, col2, ...)
OPTIONS(expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));WITH
절:WITH
문 또는 서브 쿼리를 사용하여 임시 결과를 사용합니다.
CREATE SEQUENCE
문
BigQuery에서는 시퀀스를 사용하지 않으며 다음과 같은 일괄 처리 방식으로 수행할 수 있습니다. 서로게이트 키 및 지연 변경 측정기준(SCD)에 대한 자세한 내용은 다음 가이드를 참조하세요.
INSERT INTO dataset.table
SELECT *,
ROW_NUMBER() OVER () AS id
FROM dataset.table
CREATE VIEW
문
다음 표에서는 CREATE VIEW
문에 대해 Oracle과 BigQuery 간 유사점을 보여줍니다.
Oracle | BigQuery | 참고 |
---|---|---|
CREATE VIEW view_name AS SELECT ...
|
CREATE VIEW view_name AS SELECT ...
|
|
CREATE OR REPLACE VIEW view_name AS SELECT ...
|
CREATE OR REPLACE VIEW
view_name AS
SELECT ...
|
|
지원되지 않음 | CREATE VIEW IF NOT EXISTS
view_name
OPTIONS(view_option_list)
AS SELECT ...
|
지정된 데이터 세트에 현재 뷰가 없는 경우에만 새 뷰를 만듭니다. |
CREATE MATERIALIZED VIEW
문
BigQuery에서는 구체화된 뷰 새로고침 작업이 자동으로 실행됩니다. BigQuery에서는 새로고침 옵션(예: 커밋 또는 일정)을 지정할 필요가 없습니다. 자세한 내용은 구체화된 뷰 소개를 참고하세요.
기본 테이블이 추가만으로 계속 변경되는 경우 구체화된 뷰를 사용하는 쿼리(뷰가 명시적으로 참조되거나 쿼리 최적화 도구에서 선택되었는지 여부)는 마지막 뷰가 새로고침된 이후 모든 구체화된 뷰와 기본 테이블의 델타를 스캔합니다. 즉, 쿼리를 더 빠르고 합리적인 비용으로 처리할 수 있습니다.
반대로 마지막 뷰가 새로고침된 이후 기본 테이블에 업데이트(DML UPDATE / MERGE) 또는 삭제(DML DELETE, 자르기, 파티션 만료 시간)가 있으면 구체화된 뷰는 스캔되지 않고 따라서 쿼리가 다음 뷰를 새로고침할 때까지 비용이 절약되지 않습니다. 기본적으로 기본 테이블에서 업데이트 또는 삭제가 발생하면 구체화된 뷰 상태가 무효화됩니다.
또한 기본 테이블의 스트리밍 버퍼의 데이터는 구체화된 뷰에 저장되지 않습니다. 스트리밍 버퍼는 구체화된 뷰의 사용 여부와 관계없이 계속 철저히 스캔됩니다.
다음 표에서는 CREATE MATERIALIZED VIEW
문에 대해 Oracle과 BigQuery 간 유사점을 보여줍니다.
Oracle | BigQuery | 참고 |
---|---|---|
CREATE MATERIALIZED VIEW view_name
|
CREATE MATERIALIZED VIEW
|
CREATE [UNIQUE] INDEX
문
이 섹션에서는 Oracle의 색인과 유사한 기능을 만드는 방법에 대한 BigQuery 접근 방법을 설명합니다.
성능 색인 생성
BigQuery는 쿼리 및 스토리지 최적화를 사용하는 열 중심 데이터베이스이므로 명시적 색인이 필요하지 않습니다. BigQuery는 파티션 나누기 및 클러스터링과 같은 기능 외에 중첩된 필드도 제공하므로 데이터 저장 방식을 최적화하여 쿼리 효율성과 성능을 높일 수 있습니다.
일관성 색인 생성(UNIQUE, PRIMARY INDEX)
Oracle에서 고유 색인은 테이블에 고유하지 않은 키가 있는 행을 차단하는 데 사용할 수 있습니다. 프로세스에서 이미 색인에 포함된 값이 있는 데이터를 삽입하거나 업데이트하려고 하면 작업이 색인 위반 오류와 함께 실패합니다.
BigQuery는 명시적 색인을 제공하지 않으므로, 중복 레코드를 삭제하는 동안 MERGE
문을 사용하여 스테이징 테이블의 대상 테이블에만 고유 레코드를 삽입할 수 있습니다. 하지만 수정 권한이 있는 사용자가 중복 레코드를 삽입하는 것을 방지할 방법은 없습니다.
BigQuery에서 중복 레코드에 대한 오류를 생성하려면 다음 예시와 같이 스테이징 테이블에서 MERGE
문을 사용하면 됩니다.
Oracle | BigQuery | |
---|---|---|
CREATE [UNIQUE] INDEX name;
|
MERGE `prototype.FIN_MERGE` t \
|
사용자는 다운스트림 시스템에서 오류를 찾기 위해 중복 항목을 독립적으로 제거하는 것을 선호하는 경우가 더 많습니다.
BigQuery는 DEFAULT
및 IDENTITY
(시퀀스) 열을 지원하지 않습니다.
잠금
BigQuery에는 Oracle과 같은 잠금 메커니즘이 없으며 동시 쿼리(최대 할당량)를 실행할 수 있습니다. DML 문에만 특정 동시 제한이 있으며 경우에 따라 실행 중에 테이블 잠금이 필요할 수 있습니다.
절차적 SQL 문
이 섹션에서는 저장 프로시져, 함수, 트리거에 사용된 절차적 SQL 문을 Oracle에서 BigQuery로 변환하는 방법을 설명합니다.
CREATE PROCEDURE
문
저장 프로시저는 BigQuery 스크립팅 베타의 일부로 지원됩니다.
Oracle | BigQuery | 참고 |
---|---|---|
CREATE PROCEDURE
|
CREATE PROCEDURE
|
Oracle과 마찬가지로 BigQuery는 IN, OUT, INOUT 인수 모드를 지원합니다. 다른 문법 사양은 BigQuery에서 지원되지 않습니다.
|
CREATE OR REPLACE PROCEDURE
|
CREATE OR REPLACE PROCEDURE
|
|
CALL
|
CALL
|
다음 섹션에서는 기존의 Oracle의 절차적 문을 기능이 유사한 BigQuery 스크립팅 문으로 변환하는 방법을 설명합니다.
CREATE TRIGGER
문
트리거는 BigQuery에서 사용되지 않습니다. 행 기반 애플리케이션 로직은 애플리케이션 계층에서 처리해야 합니다. 트리거 기능은 수집 기간 중 수집 도구, Pub/Sub 또는 Cloud Run Functions를 활용하거나 일반 스캔을 활용하여 수행할 수 있습니다.
변수 선언 및 할당
다음 표에서는 Oracle DECLARE
문과 그에 해당하는 BigQuery 문을 보여줍니다.
Oracle | BigQuery |
---|---|
DECLARE
|
DECLARE L_VAR int64;
|
SET var = value;
|
SET var = value;
|
커서 선언 및 작업
BigQuery는 커서를 지원하지 않으므로 다음 문은 BigQuery에서 사용되지 않습니다.
DECLARE cursor_name CURSOR [FOR | WITH] ...
OPEN CUR_VAR FOR sql_str;
OPEN cursor_name [USING var, ...];
FETCH cursor_name INTO var, ...;
CLOSE cursor_name;
동적 SQL 문
다음 Oracle 동적 SQL 문과 그에 해당하는 BigQuery 문
Oracle | BigQuery |
---|---|
EXECUTE IMMEDIATE
sql_str
|
EXECUTE IMMEDIATE
|
제어 흐름 문
다음 표에서는 Oracle 제어 흐름 문이 BigQuery에 어떻게 매핑되는지 보여줍니다.
Oracle | BigQuery |
---|---|
IF condition THEN
|
IF condition THEN
|
SET SERVEROUTPUT ON;
|
DECLARE x INT64 DEFAULT 0;
|
LOOP
|
LOOP
|
WHILE boolean_expression DO
|
WHILE boolean_expression DO
|
FOR LOOP
|
FOR LOOP 는 BigQuery에서 사용되지 않습니다. 다른 LOOP 문을 사용하세요.
|
BREAK
|
BREAK
|
CONTINUE
|
CONTINUE
|
CONTINUE/EXIT WHEN
|
IF 조건과 함께 CONTINUE 를 사용하세요.
|
GOTO
|
BigQuery에는 GOTO 문이 없습니다. IF 조건을 사용하세요.
|
메타데이터 및 트랜잭션 SQL 문
Oracle | BigQuery |
---|---|
GATHER_STATS_JOB
|
아직 BigQuery에서는 사용되지 않습니다. |
LOCK TABLE table_name IN [SHARE/EXCLUSIVE] MODE NOWAIT;
|
아직 BigQuery에서는 사용되지 않습니다. |
Alter session set isolation_level=serializable; /
|
BigQuery는 항상 스냅샷 격리를 사용합니다. 자세한 내용은 이 문서의 일관성 보장 및 트랜잭션 격리를 참고하세요. |
EXPLAIN PLAN ...
|
BigQuery에는 사용되지 않습니다.
유사한 기능으로는 BigQuery 웹 UI에서의 쿼리 계획 설명 및 슬롯 할당, 그리고 Stackdriver의 감사 로깅이 있습니다. |
SELECT * FROM DBA_[*];
(Oracle DBA_/ALL_/V$ 뷰) |
SELECT * FROM mydataset.INFORMATION_SCHEMA.TABLES;
자세한 내용은 BigQuery INFORMATION_SCHEMA 소개를 참조하세요. |
SELECT * FROM GV$SESSION;
|
BigQuery에는 기존 세션 개념이 없습니다. UI에서 쿼리 작업을 보거나 Stackdriver 감사 로그를 BigQuery로 내보내고 BigQuery 로그를 분석하여 작업을 분석할 수 있습니다. 자세한 내용은 작업 세부정보 보기를 참조하세요. |
START TRANSACTION;
|
테이블의 콘텐츠를 쿼리 출력으로 바꾸는 것은 트랜잭션과 같은 개념입니다. 이 작업은 쿼리 작업 또는 복사 작업으로도 수행할 수 있습니다.
쿼리 사용:
복사 사용:
|
다중 문 및 여러 줄로 구성된 SQL 문
Oracle과 BigQuery는 모두 트랜잭션(세션)을 지원하므로 일관되게 함께 실행되는 세미콜론으로 구분된 문을 지원합니다. 자세한 내용은 멀티 문 트랜잭션을 참조하세요.
오류 코드 및 메시지
Oracle 오류 코드와 BigQuery 오류 코드는 서로 다릅니다. 애플리케이션 로직이 현재 오류를 포착한다면 BigQuery가 동일한 오류 코드를 반환하지 않으므로 오류의 원인 제거를 시도해 보세요.
일관성 보장 및 트랜잭션 격리
Oracle 및 BigQuery 모두 원자적인 특성을 갖습니다. 즉, 여러 행에 걸쳐 변형당 수준에서 ACID와 호환됩니다. 예를 들어 MERGE
작업은 여러 개의 삽입 및 업데이트된 값이 있는 경우에도 원자적인 특성을 갖습니다.
거래
Oracle은 커밋된 읽기 또는 직렬화 가능한 트랜잭션 격리 수준을 제공합니다. 교착 상태가 발생할 수 있습니다. Oracle 삽입 추가 작업은 독립적으로 실행됩니다.
BigQuery는 트랜잭션도 지원합니다.
BigQuery는 쿼리가 시작되기 전에 마지막으로 커밋된 데이터를 쿼리가 읽는 스냅샷 격리를 사용하여 최적의 동시 실행 제어(첫 번째 성공 커밋)를 실행할 수 있습니다. 이 접근 방법은 행 및 변형 기준으로 그리고 동일한 DML 문 내의 여러 행에서 동일한 수준의 일관성을 보장하고 교착 상태도 방지합니다. 동일한 테이블에 대해 여러 UPDATE
문이 있으면 BigQuery는 비관적 동시 실행 제어로 전환하여 다중 UPDATE
문을 큐에 넣고 충돌이 일어나는 경우 자동으로 재시도합니다. INSERT
DML 문과 로드 작업이 동시에 독립적으로 실행되어 테이블에 추가될 수 있습니다.
롤백
Oracle은 롤백을 지원합니다. BigQuery에는 명시적 트랜잭션 경계가 없으므로 명시적 롤백 개념도 없습니다. 해결 방법은 테이블 데코레이터를 사용하거나 FOR SYSTEM_TIME AS OF
를 사용하는 것입니다.
데이터베이스 한도
BigQuery 최신 할당량 및 한도를 확인하세요. 대규모 사용자를 위한 대량의 할당량은 Cloud Customer Care에 문의하여 늘릴 수 있습니다. 다음 표에서는 Oracle과 BigQuery의 데이터베이스 한도를 비교합니다.
한도 | Oracle | BigQuery |
---|---|---|
데이터베이스당 테이블 | 무제한 | 무제한 |
테이블당 열 | 1000 | 10,000 |
최대 행 크기 | 무제한(열 유형에 따라 다름) | 100MB |
열 및 테이블 이름 길이 | v12.2가 128바이트 이상인 경우
그 외 30바이트 |
16,384개의 유니코드 문자 |
테이블당 행 | 무제한 | 무제한 |
최대 SQL 요청 길이 | 무제한 | 1MB(해결되지 않은 GoogleSQL 쿼리 최대 길이)
12MB(해결된 기존 쿼리 및 GoogleSQL 쿼리 최대 길이) 스트리밍:
|
최대 요청 및 응답 크기 | 무제한 | 10MB(요청) 및 10GB(응답), 페이지 나누기 또는 Cloud Storage API를 사용하는 경우에는 거의 무제한입니다. |
최대 동시 실행 세션 수 | 세션 또는 프로세스 매개변수로 제한됨 | 동시 실행 쿼리 100개(슬롯 예약 사용 시 늘어날 수 있음), 사용자당 300개의 동시 실행 API 요청 |
최대 동시 실행(고속) 로드 수 | 세션 또는 프로세스 매개변수로 제한됨 | 동시 실행 한도 없음, 작업이 큐에 추가됨. 일일 프로젝트당 100,000개 로드 작업 |
다른 Oracle 데이터베이스 한도에는 데이터 유형 한도, 물리적 데이터베이스 한도, 논리적 데이터베이스 한도, 프로세스 및 런타임 한도가 포함됩니다.