Google Cloud에서 “Legacy SQL will no longer be available in BigQuery”라는 Product Update를 보냈다. Legacy SQL을 아직 사용하고 있다면 Standard SQL로 전환해야 한다.
Table of contents
Open Table of contents
Legacy SQL vs Standard SQL
BigQuery는 초기에 독자적인 SQL 방언(Legacy SQL)을 사용했고, 이후 ANSI SQL 호환(Standard SQL)을 도입했다:
| 항목 | Legacy SQL | Standard SQL |
|---|---|---|
| 테이블 참조 | [project:dataset.table] | `project.dataset.table` |
| 서브쿼리 | 제한적 | 완전 지원 |
| WITH 절 (CTE) | 미지원 | 지원 |
| ARRAY/STRUCT | 미지원 | 지원 |
| JOIN 문법 | 비표준 | ANSI 표준 |
| UDF | JavaScript만 | SQL + JavaScript |
| 접두사 | #legacySQL | #standardSQL (기본값) |
영향 확인
1. Legacy SQL 쿼리 찾기
BigQuery 콘솔이나 쿼리 로그에서 Legacy SQL 사용을 확인한다:
-- BigQuery INFORMATION_SCHEMA에서 최근 쿼리 중 Legacy SQL 사용 확인
SELECT
user_email,
query,
creation_time,
statement_type
FROM `region-ap-northeast3`.INFORMATION_SCHEMA.JOBS
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
AND configuration.query.useLegacySql = true
ORDER BY creation_time DESC;
2. 저장된 쿼리/뷰 확인
Legacy SQL로 정의된 뷰(View)가 있으면 전환이 필요하다:
# bq 명령으로 뷰 목록 확인
bq ls --format=pretty dataset_name
bq show --format=prettyjson dataset_name.view_name
# "useLegacySql": true → 전환 대상
3. 외부 연동 확인
BI 도구, 스크립트, 스케줄 쿼리에서 Legacy SQL을 사용하는지 확인:
- Looker/Data Studio 리포트
- Cloud Scheduler로 예약된 쿼리
- Python/Node.js 스크립트의 BigQuery 클라이언트 설정
전환 방법
테이블 참조 변경
-- Legacy SQL
SELECT * FROM [project:dataset.table]
-- Standard SQL
SELECT * FROM `project.dataset.table`
JOIN 문법
-- Legacy SQL
SELECT a.id, b.name
FROM [dataset.table_a] a
JOIN EACH [dataset.table_b] b ON a.id = b.id
-- Standard SQL
SELECT a.id, b.name
FROM `dataset.table_a` a
JOIN `dataset.table_b` b ON a.id = b.id
JOIN EACH는 Standard SQL에서 그냥 JOIN으로 변경한다.
날짜 함수
-- Legacy SQL
SELECT STRFTIME_UTC_USEC(timestamp, '%Y-%m-%d')
-- Standard SQL
SELECT FORMAT_TIMESTAMP('%Y-%m-%d', timestamp)
GROUP BY
-- Legacy SQL (위치 기반)
SELECT name, COUNT(*) FROM [dataset.table] GROUP BY 1
-- Standard SQL (동일하게 위치 기반 가능, 명시적 권장)
SELECT name, COUNT(*) FROM `dataset.table` GROUP BY name
뷰 재생성
Legacy SQL 뷰는 삭제 후 Standard SQL로 재생성한다:
# 기존 뷰 정의 백업
bq show --format=prettyjson dataset.my_view > my_view_backup.json
# Standard SQL로 뷰 재생성
bq mk --use_legacy_sql=false --view \
'SELECT * FROM `project.dataset.table` WHERE active = true' \
dataset.my_view
자동 변환 도구
BigQuery 콘솔에서 Legacy SQL 쿼리를 입력하면 Standard SQL로 자동 변환을 제안하는 경우가 있다. 하지만 복잡한 쿼리는 수동 확인이 필요하다.
정리
BigQuery Legacy SQL 종료는 오래전부터 예고된 변경이다. INFORMATION_SCHEMA.JOBS에서 Legacy SQL 사용 쿼리를 찾고, 뷰 정의를 확인하고, 외부 연동의 useLegacySql 플래그를 false로 변경한다.