이 페이지에서는 Spanner를 사용할 때 JSONB
데이터 유형으로 작업하는 방법을 설명합니다.
JSONB
는 Spanner PostgreSQL 언어의 반구조화된 데이터를 보관하는 데 사용되는 PostgreSQL 데이터 유형입니다. JSONB
에는 RFC 7159에 설명된 사양을 따르는 JSON(JavaScript 객체 표기법) 형식의 데이터가 저장됩니다.
사양
Spanner JSONB
데이터 유형은 입력 문서의 정규화된 표현을 저장합니다. 이는 다음을 의미합니다.
- 따옴표와 공백 문자는 유지되지 않습니다.
- 주석은 지원되지 않습니다. 주석이 있는 트랜잭션이나 쿼리는 실패합니다.
- 객체 키는 먼저 키 길이별로 정렬된 후 해당 객체 키 길이에 따라 사전순으로 정렬됩니다. 중복된 객체 키가 있으면 마지막 객체 키만 보존됩니다.
- 기본 유형(
string
,boolean
,number
,null
)에는 유형과 값이 보존됩니다.string
유형 값은 정확하게 보존됩니다.- 후행 0은 유지됩니다.
number
유형 값의 출력 형식에서는 과학적 표기법을 사용하지 않습니다.
JSONB
null
값은NULL
이 아닌 SQL로 처리됩니다. 예를 들면 다음과 같습니다.SELECT null::jsonb IS NULL; -- Returns true SELECT 'null'::jsonb IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'a' IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'b' IS NULL; -- Returns true SELECT '{"a":null}'::jsonb -> 'a'; -- Returns a JSONB 'null' SELECT '{"a":null}'::jsonb -> 'b'; -- Returns a SQL NULL
JSONB 배열 요소 순서는 유지됩니다.
제한사항
Spanner JSONB
에는 다음 제한사항이 적용됩니다.
- Spanner에서 지원하는 PostgreSQL 데이터 유형에서만
to_jsonb
함수의 인수를 가져올 수 있습니다. - 숫자 유형 값은 소수점 이하 4,932자리, 소수점 이후 16,383자리를 가질 수 있습니다.
- 정규화된 스토리지 형식의 최대 허용 크기는 10MB입니다.
JSONB
문서는 UTF-8로 인코딩되어야 합니다. 다른 형식으로 인코딩된JSONB
문서를 사용하는 트랜잭션이나 쿼리는 오류를 반환합니다.
JSONB 열이 있는 테이블 만들기
테이블을 만들 때 테이블에 JSONB
열을 추가할 수 있습니다.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
샘플 VenueFeatures
JSONB
객체는 다음과 같습니다.
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
기존 테이블에서 JSONB 열 추가 및 삭제
다음과 같이 ALTER
문을 사용하여 JSONB
열을 추가하고 삭제할 수 있습니다.
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 Venues
테이블에 VenueDetails
라는 JSONB
열을 추가하는 방법을 보여줍니다.
C++
C#
Go
자바
Node.js
PHP
Python
Ruby
JSONB 데이터 수정
다른 열과 마찬가지로 JSONB
열을 수정할 수 있습니다.
예시는 다음과 같습니다.
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 JSONB
데이터를 업데이트하는 방법을 보여줍니다.
C++
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
C#
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
JSON 데이터 색인 생성
JSONB 데이터에 보조 색인 및 검색 색인을 사용하여 JSONB 데이터 쿼리 속도를 높일 수 있습니다. Spanner는 JSONB 유형 열을 보조 색인의 키로 사용하는 것을 지원하지 않습니다.
보조 색인 사용
보조 색인은 JSONB 문서 내에서 스칼라 값을 기준으로 필터링할 때 유용합니다. JSONB와 함께 보조 색인을 사용하려면 관련 스칼라 데이터를 추출하고 적절한 SQL 데이터 유형으로 변환하는 생성된 열을 만듭니다. 그런 다음 이 생성된 열에 보조 색인을 만들 수 있습니다. 색인은 생성된 열에 대해 실행되는 요건을 충족하는 쿼리의 속도를 높입니다.
다음 예에서는 데이터베이스에서 용량이 1, 000을 초과하는 장소를 찾는 데 사용하는 VenuesByCapacity
색인을 만듭니다. Spanner는 모든 행을 확인하는 대신 색인을 사용하여 관련 행을 찾습니다. 따라서 특히 대규모 테이블의 쿼리 성능이 개선됩니다.
ALTER TABLE Venues (
ADD COLUMN VenueCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) VIRTUAL,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(TotalCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
검색 색인 사용
검색 색인은 동적 또는 다양한 JSONB 문서에 대해 쿼리할 때 유용합니다. 보조 색인과 달리 JSONB 열에 저장된 모든 JSONB 문서에 대해 검색 색인을 만들 수 있습니다. 검색 색인은 JSON 문서, 행 간의 차이, 시간 경과에 따라 자동으로 조정됩니다.
다음 예에서는 데이터베이스에서 크기 및 운영 일정과 같은 특정 세부정보가 포함된 장소를 찾는 데 사용하는 VenuesByVenueDetails
검색 색인을 만듭니다. Spanner는 모든 행을 확인하는 대신 색인을 사용하여 관련 행을 찾습니다. 따라서 특히 대규모 테이블의 쿼리 성능이 개선됩니다.
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_jsonb(VenueDetails)) VIRTUAL HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venues (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE VenueDetails @> '{"labels": ["large"], "open": {"Friday": true}}'::jsonb;
자세한 내용은 JSON 검색 색인을 참고하세요.
JSONB 데이터 쿼리
기본 필드 값을 기준으로 JSONB
열을 쿼리할 수 있습니다. 다음 예시에서는 Venues
에서 VenueId
및 VenueName
을 추출합니다. 여기에서 VenueFeatures
에는 3.5
보다 큰 rating
값이 있습니다.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 JSONB
데이터를 쿼리하는 방법을 보여줍니다.
C++
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
C#
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
지원되지 않는 PostgreSQL JSONB 기능
Spanner JSONB
에서는 다음과 같은 오픈소스 PostgreSQL JSONB
기능이 지원되지 않습니다.
- 정렬, 비교, 집계
- PrimaryKey 및 ForeignKey
- GIN 색인을 포함한 색인 생성 대신 GIN 색인과 동일한 JSONB 작업을 가속화하는 Spanner 검색 색인을 사용할 수 있습니다. 자세한 내용은 JSON 데이터 색인 생성을 참고하세요.
JSONB
열을 다른 데이터 유형과 변경- PostgreSQL 유선 프로토콜을 사용하는 도구에서 형식화되지 않은 JSONB 매개변수로 매개변수화된 쿼리 사용
쿼리 엔진에서 강제 변환 사용 오픈소스 PostgreSQL과 달리
JSONB
에서 텍스트로의 암시적 변환은 지원되지 않습니다. 함수 서명을 일치시키려면JSONB
유형의 명시적 변환을 사용해야 합니다. 예를 들면 다음과 같습니다.SELECT concat('abc'::text, '{"key1":1}'::jsonb); -- Returns error SELECT concat('abc'::text, CAST('{"key1":1}'::jsonb AS TEXT)); -- This works SELECT 3 + CAST('5'::jsonb AS INTEGER); -- This works