Oracle NoSQL Database Cloud Service 참조

지원되는 데이터 유형, DDL 문, Oracle NoSQL Database Cloud Service 서비스 매개변수 및 측정지표에 대해 알아봅니다.

이 문서에는 다음 항목이 있습니다.

지원되는 데이터 유형

Oracle NoSQL Database Cloud Service는 여러 일반적인 데이터 유형을 지원합니다.

데이터 유형 설명

BINARY

0바이트 이상의 시퀀스입니다. 스토리지 크기는 바이트 수와 바이트 배열 크기의 인코딩으로, 배열 크기에 따라 변수입니다.

FIXED_BINARY 고정 크기 바이트 배열입니다. 이 데이터 유형에 대한 추가 인코딩 오버헤드가 없습니다.

BOOLEAN

두 가지 가능한 값 중 하나인 TRUE 또는 FALSE의 데이터 유형입니다. 부울의 저장 크기는 1바이트입니다.

DOUBLE

인덱스 키에 대해 8바이트의 저장 영역을 사용하여 인코딩된 긴 부동 소수점 수입니다. 기본 키인 경우 10바이트의 스토리지를 사용합니다.

FLOAT

인덱스 키에 대해 4바이트의 저장소를 사용하여 인코딩된 긴 부동 소수점 수입니다. 기본 키인 경우 5바이트의 스토리지를 사용합니다.

LONG

긴 정수에는 값에 따라 1-8바이트의 저장소를 사용하는 가변 길이 인코딩이 있습니다. 기본 키인 경우 10바이트의 스토리지를 사용합니다.

INTEGER

긴 정수에는 값에 따라 1-4바이트의 저장소를 사용하는 가변 길이 인코딩이 있습니다. 기본 키인 경우 5바이트의 스토리지를 사용합니다.

STRING

0개 이상의 유니코드 문자 시퀀스입니다. 문자열 유형은 UTF-8로 인코딩되고 해당 인코딩에 저장됩니다. 저장 영역 크기는 UTF-8바이트 수와 길이를 더한 값으로, 인코딩의 바이트 수에 따라 1-4바이트일 수 있습니다. 인덱스 키에 저장될 때 저장 영역 크기는 UTF-8바이트 수와 단일 널 종료 바이트 수입니다.

NUMBER

임의의 정밀도 부호 있는 십진수입니다.

정렬된 비교에 사용할 수 있는 바이트 배열 형식으로 직렬화됩니다. 형식은 두 부분으로 구성됩니다.
  1. 기호 및 지수에 단일 숫자를 더한 값입니다. 이 작업은 1-6바이트가 걸리지만 지수가 아주 크지 않은 경우 일반적으로 2바이트입니다.
  2. 2자리마다 약 1바이트인 값의 맨티사

예제:

12.345678 직렬화(6바이트)

1.234E+102는 5바이트로 직렬화

주:

스키마에 숫자 값을 사용해야 하는 경우 아래 제공된 순서대로 데이터 유형을 결정하는 것이 좋습니다. INTEGER, LONG, FLOAT, DOUBLE, NUMBER 사용된 저장 영역 및 처리 능력 측면에서 NUMBER가 비싸기 때문에 사용 사례에 대해 NUMBER가 필요하지 않으면 NUMBER를 사용하지 마십시오.
TIMESTAMP

정밀도가 있는 시점입니다. 이 정밀도는 스토리지 크기 및 사용에 영향을 줍니다. 타임스탬프는 UTC(Coordinated Universal Time)로 저장 및 관리됩니다. 시간기록 데이터 유형은 사용된 전체 자릿수에 따라 3-9바이트가 필요합니다.

다음 분석은 이 데이터 유형에 사용되는 저장 영역을 보여줍니다.
  • 비트[0~13] 년 - 14 비트
  • 비트[14~17] 월 - 4비트
  • 비트[18~22]일 - 5비트
  • 비트[23~27] 시간 - 5비트 [선택 사항]
  • 비트[28~33] 분 - 6 비트 [선택 사항]
  • 비트[34~39]초 - 6비트 [선택 사항]
  • bit[40~71] fractional second[변수 길이가 있는 옵션]

UUID

주: UUID 데이터 유형은 STRING 데이터 유형의 하위 유형으로 간주됩니다. 저장 영역 크기는 인덱스 키로 16바이트입니다. 기본 키로 사용되는 경우 스토리지 크기는 19바이트입니다.

ENUM

열거는 문자열 배열로 표시됩니다. ENUM 값은 기호 식별자(토큰)이며 열거에서 정렬된 위치를 나타내는 작은 정수 값으로 저장됩니다.

ARRAY

보다 입력된 항목이 0인 순서가 지정된 모음입니다. JSON으로 정의되지 않은 배열은 NULL 값을 포함할 수 없습니다.

JSON으로 선언된 배열은 JSON과 관련된 특수 값인 null을 포함하여 유효한 JSON을 포함할 수 있습니다.

MAP

모든 키가 문자열이고 모든 항목이 동일한 유형인 0개 이상의 키 항목 쌍으로 구성된 순서가 지정되지 않은 모음입니다. 모든 키는 고유해야 합니다. 키 항목 쌍을 필드라고 하며, 키는 필드 이름이고, 연결된 항목은 필드 값입니다. 필드 값은 다른 유형을 가질 수 있지만 맵은 NULL 필드 값을 포함할 수 없습니다.

RECORD

모든 키가 문자열인 하나 이상의 키 항목 쌍의 고정 모음입니다. 레코드의 모든 키는 고유해야 합니다.

JSON

적합한 JSON 데이터입니다.

테이블 상태 및 수명 주기

다양한 테이블 상태 및 중요도(테이블 수명 주기 프로세스)에 대해 알아봅니다.

각 테이블은 테이블 생성에서 삭제(삭제)까지의 여러 가지 상태를 통과합니다. 예를 들어, DROPPING 상태의 테이블은 ACTIVE 상태로 진행할 수 없고 ACTIVE 상태의 테이블은 UPDATING 상태로 변경될 수 있습니다. 테이블 수명 주기를 모니터하여 여러 테이블 상태를 추적할 수 있습니다. 이 절에서는 다양한 테이블 상태에 대해 설명합니다.

다음은 table-state.png에 대한 설명입니다.
그림 테이블 설명 - state.png

테이블 상태 설명

CREATING

테이블을 생성하는 중입니다. 사용할 준비가 되지 않았습니다.

UPDATING

테이블 업데이트가 진행 중입니다. 테이블이 이 상태인 동안에는 테이블을 추가로 수정할 수 없습니다.

테이블은 다음과 같은 경우 UPDATING 상태입니다.

  • 테이블 제한 변경
  • 테이블 스키마 변경 중
  • 테이블 인덱스 추가 또는 삭제

ACTIVE

테이블은 현재 상태에서 사용할 수 있습니다. 테이블이 최근에 생성되었거나 수정되었을 수 있지만 테이블 상태는 이제 안정적입니다.

DROPPING

테이블이 삭제되고 있으므로 어떠한 목적으로도 액세스할 수 없습니다.

DROPPED

테이블이 삭제되었으며 읽기, 쓰기 또는 질의 작업에 대해 더 이상 존재하지 않습니다.

주:

삭제한 후에는 동일한 이름을 가진 테이블을 다시 생성할 수 있습니다.

OCI 콘솔에서 SQL 문 오류 디버깅

OCI 콘솔을 사용하여 DDL 문을 사용하는 테이블을 생성하거나 DML 문을 사용하여 데이터를 삽입 또는 갱신하거나 SELECT query를 사용하여 데이터를 패치(fetch)하는 경우 다음과 같은 일반적인 시나리오 중 하나에서 명령문이 불완전하거나 고장났음이라는 오류가 발생할 수 있습니다.
  • SQL 문 끝에 세미콜론이 있는 경우
  • SQL 문에 잘못된 쉼표 사용, 명령문에서 불필요한 문자 사용 등과 같은 구문 오류가 있는 경우
  • SQL 문에 SQL 키워드 또는 데이터 유형 정의의 철자 오류가 있는 경우
  • 열을 NOT NULL로 정의했지만 이 열에 DEFAULT 값이 할당되지 않은 경우
  • 열을 NOT NULL로 정의했지만 이 열에 DEFAULT 값이 할당되지 않은 경우
OCI 콘솔을 사용하여 데이터를 생성 또는 관리하는 동안 일부 불완전하거나 결함이 있는 오류를 처리하는 방법:
  • SQL 문 끝에서 세미콜론(있는 경우)을 제거합니다.
  • SQL 문에 원치 않는 문자가 있는지 또는 잘못된 구두점이 있는지 확인합니다.
  • SQL 문에 철자 오류가 있는지 확인합니다.
  • 모든 열 정의가 완전하고 올바른지 확인합니다.
  • 테이블에 대한 primary key를 정의했는지 확인합니다.

위에서 설명한 것처럼 일부 가능한 상황을 제거한 후에도 오류가 계속 발생하면 Cloud Shell을 사용하여 질의를 실행하고 아래 예제와 같이 정확한 오류를 캡처할 수 있습니다.

예: 클라우드 셸에서 SELECT 문에 대한 오류 메시지 가져오기

summarize 명령은 구문을 검사하고 SQL 문에 대한 간략한 요약을 반환합니다.
  1. OCI 콘솔의 오른쪽 상단 메뉴에서 Cloud Shell을 엽니다.
  2. SQL SELECT 문(예: query1.sql)을 변수(SQL_SELECTSTMT)로 복사합니다.
    예제:
    SQL_SELECTSTMT=$(cat ~/query1.sql | tr '\n' ' ')
  3. 아래의 oci 명령을 호출하여 SQL SELECT 문의 구문을 확인하십시오.

    주:

    이 SELECT 문에 대해 compartment_id를 제공해야 합니다.
    oci raw-request --http-method GET --target-uri 
    https://nosql.${OCI_REGION}.oci.oraclecloud.com/20190828/query/summarize?compartmentId=$NOSQL_COMPID\
    &statement="$SQL_SELECTSTMT" | jq '.data'

그러면 SQL 문에 정확한 오류가 표시됩니다.

데이터 정의어 참조

Oracle NoSQL Database Cloud Service에서 DDL을 사용하는 방법을 알아봅니다.

Oracle NoSQL Database Cloud Service DDL을 사용하여 테이블 및 인덱스를 생성, 변경 및 삭제합니다.

DDL 언어 구문에 대한 자세한 내용은 Table Data Definition Language Guide를 참조하십시오. 이 가이드에서는 온프레미스 Oracle NoSQL Database 제품에서 지원하는 DDL 언어를 설명합니다. Oracle NoSQL Database Cloud Service는 이 기능의 하위 세트를 지원하며 차이점은 클라우드에서의 DDL 차이 섹션에 문서화되어 있습니다.

또한 각 NoSQL <language> 드라이버는 DDL 문을 실행하는 API를 제공합니다. 애플리케이션을 작성하려면 Oracle NoSQL Database Cloud Service에서 API를 사용하여 테이블 및 인덱스 생성을 참조하십시오.

일반적인 DDL 문

일반적인 DDL 문의 샘플은 거의 없습니다.

테이블 생성
CREATE TABLE [IF NOT EXISTS] (
    field-definition, field-definition-2 ...,
    PRIMARY KEY (field-name, field-name-2...),
) [USING TTL ttl]
예:
CREATE TABLE IF NOT EXISTS audience_info (
    cookie_id LONG,
    ipaddr STRING,
    audience_segment JSON,
    PRIMARY KEY(cookie_id))
테이블 변경
ALTER TABLE table-name (ADD field-definition)
ALTER TABLE table-name (DROP field-name)
ALTER TABLE table-name USING TTL ttl 
예:
ALTER TABLE audience_info USING TTL 7 days
인덱스 생성:
CREATE INDEX [IF NOT EXISTS] index-name ON table-name (path_list)
예:
CREATE INDEX segmentIdx ON audience_info
       (audience_segment.sports_lover AS STRING)
테이블 삭제
DROP TABLE [IF EXISTS] table-name
예:
DROP TABLE audience_info

자세한 내용은 참조 가이드를 참조하십시오.

클라우드의 DDL 차이점

클라우드 서비스 DDL 언어는 다음 방법으로 참조 설명서에 설명된 것과 다릅니다.

테이블 이름

  • 256자로 제한되며 영숫자와 밑줄로 제한됩니다.
  • 문자로 시작해야 합니다
  • 특수 문자를 포함할 수 없습니다.
  • 하위 테이블은 지원되지 않습니다.

지원되지 않는 개념

  • DESCRIBESHOW TABLE 문.
  • 전체 텍스트 인덱스
  • 사용자 및 롤 관리
  • 온프레미스 리전

질의 언어 참조

Oracle NoSQL Database Cloud Service에서 SQL 문을 사용하여 데이터를 업데이트하고 쿼리하는 방법을 알아봅니다.

Oracle NoSQL Database는 SQL 쿼리 언어를 사용하여 NoSQL 테이블의 데이터를 업데이트하고 쿼리합니다. 질의 언어 구문을 알아보려면 Oracle NoSQL Database용 SQL 참조를 참조하십시오.

일반 쿼리

SELECT <expression>
FROM <table name>
[WHERE <expression>]
[GROUP BY <expression>]
[ORDER BY <expression> [<sort order>]]
[LIMIT <number>]
[OFFSET <number>]; 

For example:
SELECT * FROM Users;
SELECT id, firstname, lastname FROM Users WHERE firstname = "Taylor";
UPDATE <table_name> [AS <table_alias>]
    <update_clause>[, <update_clause>]*
WHERE <expr>[<returning_clause>];

For example:
UPDATE JSONPersons $j
  SET TTL 1 DAYS
  WHERE id = 6
  RETURNING remaining_days($j) AS Expires;

클라우드의 쿼리 언어 차이점

클라우드 서비스 질의 지원은 다음 방법으로 질의 언어 참조 설명서에 설명된 것과 다릅니다.

SELECT 절에 사용되는 표현식에 대한 제한 사항

Oracle NoSQL Database Cloud Service는 집계 함수 간에 표현식 또는 산술 표현식을 그룹화할 수 있도록 지원합니다. SELECT 절에는 다른 종류의 표현식이 허용되지 않습니다. 예를 들어, CASE 식은 SELECT 절에서 허용되지 않습니다.

각 NoSQL 데이터베이스 드라이버는 질의문을 실행하는 API를 제공합니다.

질의 계획 참조

질의 실행 계획은 Oracle NoSQL Database가 질의 실행을 위해 수행하는 작업 순서입니다.

질의 실행 계획은 계획 이터레이터의 트리입니다. 각 종류의 반복기는 질의에 나타날 수 있는 다른 종류의 표현식을 평가합니다. 일반적으로 인덱스 선택과 연관된 인덱스 술어 종류는 질의 성능에 큰 영향을 줄 수 있습니다. 따라서 유저는 query에 사용되는 인덱스와 이 인덱스에 푸시(Push)된 술어를 자주 확인할 수 있습니다. 이 정보를 기반으로 인덱스 힌트를 통해 다른 인덱스를 강제로 사용할 수 있습니다. 이 정보는 query 실행 계획에 포함되어 있습니다. 모든 Oracle NoSQL 드라이버는 질의 실행 계획을 표시하는 API를 제공합니다.

질의에 사용되는 가장 일반적이고 중요한 이터레이터는 다음과 같습니다.

TABLE iterator: 테이블 이터레이터는 다음을 수행합니다.
  • query에 사용되는 인덱스(primary 인덱스일 수 있음)를 스캔합니다.
  • 인덱스에 푸시된 필터링 술어 적용
  • 필요한 경우 적격 인덱스 항목이 가리키는 행을 검색합니다. 인덱스가 적용될 경우 TABLE 이터레이터의 결과 집합은 인덱스 항목 집합이고, 그렇지 않을 경우 테이블 행 집합입니다.

주:

인덱스는 연관된 행을 검색할 필요 없이 해당 인덱스의 항목만 사용하여 query를 평가할 수 있는 경우 query와 관련된 피복 인덱스라고 합니다.

SELECT iterator: SELECT 표현식을 실행합니다.

모든 query에는 SELECT 절이 있습니다. 따라서 모든 query 계획에는 SELECT 이터레이터가 있습니다. SELECT 이터레이터의 구조는 다음과 같습니다.

"iterator kind" : "SELECT",
"FROM" :
  {
  },
"FROM variable" : "...",
"SELECT expressions" : 
[
  {
  }
]

SELECT 반복기에는 "FROM", "WHERE", "FROM 변수", "SELECT 표현식"과 같은 필드가 있습니다. "FROM" 및 "FROM 변수"는 SELECT 표현식의 FROM 절을 나타내고, WHERE는 필터 절을 나타내고, "SELECT expression"은 SELECT 절을 나타냅니다.

RECEIVE 이터레이터: query 계획을 두 부분으로 분리하는 특수한 내부 이터레이터입니다.
  1. RECEIVE 이터레이터 자체와 이터레이터 트리에서 이터레이터 위에 있는 모든 이터레이터가 드라이버에서 실행됩니다.
  2. RECEIVE 이터레이터 아래의 모든 이터레이터는 복제 노드(RN)에서 실행됩니다. 이러한 이터레이터는 RECEIVE 이터레이터의 고유한 자식에 루트 지정된 하위 트리를 형성합니다.

일반적으로 RECEIVE 이터레이터는 쿼리 조정자 역할을 합니다. 실행을 위해 해당 서브 계획을 적절한 RN으로 보내고 결과를 수집합니다. 추가 처리를 위해 정렬 및 중복 제거와 같은 추가 작업을 수행하고 결과를 상위 이터레이터(있는 경우)에 전달할 수 있습니다.

배급 종류:

배포 종류는 Oracle NoSQL 데이터베이스(저장소)에 참여하는 RN 간에 질의를 실행하기 위해 배포되는 방법을 지정합니다. 배포 종류는 RECEIVE iterator의 등록 정보입니다.

분배 종류의 다른 선택은 다음과 같습니다.
  • SINGLE_PARTITION: SINGLE_PARTITION 질의는 WHERE 절에 전체 샤드 키를 지정합니다. 결과적으로 전체 결과 집합은 단일 분할 영역에 포함되고 RECEIVE 이터레이터는 해당 분할 영역을 저장하는 단일 RN에 하위 계획을 전송합니다. SINGLE_PARTITION 질의는 기본 키 인덱스 또는 보조 인덱스를 사용할 수 있습니다.
  • ALL_PARTITIONS: 질의는 여기에 기본 키 인덱스를 사용하며 전체 샤드 키를 지정하지 않습니다. 따라서 저장소에 M 분할 영역이 있는 경우 RECEIVE 이터레이터는 해당 하위 계획의 M 복사본을 각 M 분할 영역 중 하나에 대해 실행되도록 보냅니다.
  • ALL_SHARDS: 질의는 여기서 보조 인덱스를 사용하며 전체 샤드 키를 지정하지 않습니다. 따라서 저장소에 N개의 샤드가 있는 경우 RECEIVE 이터레이터는 N개의 샤드 중 하나에 대해 실행될 하위 계획의 N개 복사본을 전송합니다.

query 실행 계획 분석:

질의 실행은 일괄 처리로 수행됩니다. query 하위 계획은 실행을 위해 분할 영역이나 샤드로 보내질 때 일괄 처리 제한에 도달할 때까지 실행됩니다. 일괄 처리 제한은 질의에서 로컬로 소비되는 읽기 단위 수입니다. 기본값은 2000 읽기 단위(약 2MB의 데이터)이며 쿼리 수준 옵션을 통해서만 줄일 수 있습니다.

일괄 처리 제한에 도달하면 생성된 로컬 결과가 더 많은 로컬 결과를 사용할 수 있는지 여부를 나타내는 부울 플래그와 함께 추가 처리를 위해 RECEIVE 이터레이터로 다시 전송됩니다. 플래그가 true이면 응답에 재개 정보가 포함됩니다. RECEIVE 이터레이터가 동일한 분할 영역/샤드로 질의를 재전송하기로 결정하면 이 재개 정보가 요청에 포함되므로 이전 일괄 처리 중 정지된 지점에서 질의 실행이 재시작됩니다. 이는 일괄 처리가 완료된 후 RN에서 query 상태가 유지되지 않기 때문입니다. 동일한 파티션/샤드의 다음 배치는 이전 배치와 동일한 RN 또는 동일한 파티션/샤드를 저장하는 다른 RN에서 발생할 수 있습니다.