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 임의의 정밀도 부호가 있는 십진수입니다.

정렬된 비교에 사용할 수 있는 바이트 배열 형식으로 직렬화됩니다. 형식에는 2개의 부분이 있습니다.

1. 기호 및 지수와 단일 숫자를 더한 값입니다. 이 작업은 1-6바이트가 걸리지만 지수가 상당히 큰 경우가 아니면 일반적으로 2입니다
2. 2자리마다 약 1바이트인 값의 맨티사

예:

12.345678은 6바이트 단위로 직렬화됩니다.

1.234E+102는 5바이트 단위로 직렬화됩니다.

참고: 스키마에서 숫자 값을 사용해야 하는 경우 스키마에서 숫자 값을 사용해야 합니다. 아래와 같은 순서로 데이터 유형을 결정하는 것이 좋습니다. INTEGER, LONG, FLOAT, DOUBLE, NUMBER Avoid NUMBER 사용 사례에 실제로 필요한 경우가 아니면 NUMBER를 피하십시오. NUMBER는 사용된 저장 및 처리 능력 측면에서 비용이 많이 듭니다.
TIMESTAMP 정밀도가 있는 시점입니다. 정밀도는 저장 영역 크기 및 사용에 영향을 줍니다. 시간 기록은 UTC(협정 세계시)로 저장 및 관리됩니다. 시간 기록 데이터 유형은 사용된 정밀도에 따라 3바이트에서 9바이트까지 필요합니다.

다음 분석은 이 데이터 유형에서 사용되는 스토리지를 보여줍니다.

- bit[0~13] year - 14bits
- bit[14~17] month - 4bits
- bit[18~22] day - 5bits
- bit[23~27] hour - 5bits [optional]
- bit[28~33] minute - 6bits [optional]
- bit[34~39] second - 6bits [optional]
- bit[40~71] fractional second [optional with variable length]
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에 대한 설명은 다음과 같습니다.

table-state.png 그림에 대한 설명

테이블 상태 설명
CREATING 테이블이 생성되고 있습니다. 사용할 준비가 되지 않았습니다.
UPDATING 테이블 업데이트가 진행 중입니다. 테이블이 이 상태인 동안에는 추가 테이블을 수정할 수 없습니다.

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

- 테이블 제한이 변경되고 있습니다.
- 테이블 스키마가 진화하고 있습니다.
- 테이블 인덱스 추가 또는 삭제
ACTIVE 테이블은 현재 상태에서 사용할 수 있습니다. 테이블이 최근에 생성되거나 수정되었지만 테이블 상태가 안정적입니다.
DROPPING 테이블이 삭제되는 중이므로 어떤 목적으로든 액세스할 수 없습니다.
DROPPED 테이블이 삭제되었으며 읽기, 쓰기 또는 질의 작업에 대해 더 이상 존재하지 않습니다.

참고: 삭제한 후에는 동일한 이름의 테이블을 다시 생성할 수 있습니다.

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

OCI 콘솔을 사용하여 DDL 문을 사용하여 테이블을 생성하거나 DML 문을 사용하여 데이터를 삽입 또는 업데이트하거나 SELECT 질의를 사용하여 데이터를 인출하는 경우 다음과 같은 일반적인 시나리오 중 하나에서 명령문이 불완전하거나 결함이 있음 오류가 발생할 수 있습니다.

OCI 콘솔을 사용하여 데이터를 생성 또는 관리하는 동안 일부 불완전하거나 결함이 있는 오류를 처리하는 방법:

위에서 설명한 것처럼 가능한 상황 중 일부를 제거한 후에도 오류가 계속 발생하면 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 언어 구문에 대한 자세한 내용은 표 데이터 정의 언어 설명서를 참조하십시오. 이 설명서에서는 온프레미스 Oracle NoSQL Database 제품에서 지원하는 DDL 언어를 설명합니다. Oracle NoSQL Database Cloud Service는 이러한 기능의 하위 세트를 지원하며 차이점은 클라우드 섹션의 DDL 차이점에 설명되어 있습니다.

또한 각 NoSQL 언어 드라이버는 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 언어는 다음 방법으로 참조 설명서에 설명된 것과 다릅니다.

테이블 이름

지원되지 않는 개념

질의 언어 참조

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

Oracle NoSQL Database는 SQL 쿼리 언어를 사용하여 NoSQL 테이블의 데이터를 업데이트하고 쿼리합니다. 쿼리 언어 구문에 대한 자세한 내용은 Oracle NoSQL Database용 SQL 참조를 참조하십시오.

일반 Query

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

예:

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>];

예:

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

클라우드의 언어 차이 질의

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

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

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

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

질의 계획 참조

쿼리 실행 계획은 Oracle NoSQL Database가 쿼리를 실행하기 위해 수행하는 일련의 작업입니다.

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

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

테이블 이터레이터: 테이블 이터레이터는 다음 작업을 수행합니다.

주: 인덱스는 연관된 행을 검색할 필요 없이 해당 인덱스의 항목만 사용하여 질의를 평가할 수 있는 경우 질의에 대한 적용 인덱스라고 합니다.

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

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

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

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

RECEIVE iterator: 질의 계획을 두 부분으로 구분하는 특수 내부 이터레이터입니다.

  1. RECEIVE iterator 자체와 iterator 트리에서 그 위에 있는 모든 iterator는 드라이버에서 실행됩니다.

  2. RECEIVE 이터레이터 아래의 모든 이터레이터는 RN(복제 노드)에서 실행됩니다. 이러한 이터레이터는 RECEIVE 이터레이터의 고유한 자식에 루트 지정된 하위 트리를 형성합니다.

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

분배 종류:

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

분배 종류의 다른 선택은 다음과 같습니다.

Query 실행 계획 분석:

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

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