소개

ANSI JOIN에 대한 N1QL 지원은 버전 5.5에서 처음 도입되었습니다. 현재 ANSI JOIN(버전 5.5 및 6.0)에는 ANSI JOIN의 오른쪽이 키 스페이스여야 한다는 제한이 있습니다. 이 제한은 버전 6.5에서 해제됩니다.

MERGE 문에 대한 N1QL 지원은 현재 조회 조인과 유사하게 ON KEYS 절을 사용합니다. 버전 6.5에서는 ANSI MERGE 구문이 지원될 예정입니다.

 

ANSI JOIN 개선 사항

Couchbase Server 버전 6.5에서 N1QL은 표현식 및 하위 쿼리를 ANSI JOIN의 오른쪽으로 지원합니다. 이전 버전 5.5 및 6.0에서는 ANSI JOIN의 오른쪽이 키 스페이스여야 했습니다. ANSI JOIN의 오른쪽이 키 스페이스가 아닌 경우 오류가 반환됩니다.

키 공간에 대한 제한은 버전 5.5 및 6.0에만 존재하며, ANSI JOIN의 오른쪽에만 적용됩니다. ANSI JOIN의 왼쪽은 키 공간, 식, 하위 쿼리 또는 다른 조인/중첩/언네스트 연산이 될 수 있으며, ANSI JOIN이 비ANSI 조인/중첩 연산과 혼합되지 않는 한 다른 조인/중첩/언네스트 연산이 될 수 있습니다.

ANSI JOIN의 오른쪽으로 표현하기

이제 ANSI JOIN의 오른쪽에 표현식을 사용할 수 있습니다. 예를 들어

이 예에서는 명시적 객체 배열이 ANSI JOIN의 오른쪽에 표현식으로 지정되어 있습니다. ANSI JOIN의 오른쪽에 표현식을 사용하는 경우 표현식에는 별칭(위 예에서는 "route")이 있어야 합니다(AS 키워드는 선택 사항이지만). 

표현식이 ANSI JOIN의 오른쪽에 사용되는 경우 ExpressionScan 연산자는 설명 계획에서 표현식의 결과 집합을 반복하는 데 사용됩니다:

 

ANSI 조인의 오른쪽에 있는 하위 쿼리

ANSI JOIN의 오른쪽에서 하위 쿼리를 사용할 수도 있습니다. 예를 들어

이 예에서는 ANSI JOIN의 오른쪽에 하위 쿼리가 사용됩니다. 표현식과 마찬가지로 하위 쿼리가 ANSI JOIN의 오른쪽에 사용되는 경우 하위 쿼리에는 별칭(위 예에서는 "route")도 있어야 합니다(AS 키워드는 선택 사항이지만).

ANSI JOIN의 오른쪽에 하위 쿼리가 사용되는 경우 설명에 하위 쿼리 자체에 대한 계획이 표시됩니다:

하위 쿼리가 ANSI JOIN의 오른쪽으로 사용되는 경우 상관된 하위 쿼리가 될 수 없습니다. 상관된 하위 쿼리가 ANSI JOIN의 오른쪽에 사용되는 경우 오류가 반환됩니다.

표현식 또는 하위 쿼리가 ANSI JOIN의 오른쪽에 있을 때 사용되는 해시 조인

키 스페이스가 ANSI JOIN의 오른쪽에 사용되는 경우 중첩 루프 조인이 기본 조인 방법이며, 오른쪽 키 스페이스에 USE HASH 힌트가 지정되면 해시 조인이 고려됩니다. 또한 중첩 루프 조인을 사용할 때는 키 공간에 적절한 보조 인덱스가 필요합니다. 반대로, 표현식 또는 하위 쿼리가 ANSI JOIN의 오른쪽에 사용되는 경우 표현식 또는 하위 쿼리에 인덱스가 없으므로 해시 조인을 사용하여 조인을 수행하는 것이 더 효율적입니다. 이 경우 중첩 루프 조인은 표현식 또는 하위 쿼리의 결과 집합을 각 외부 문서에 대해 반복적으로 스캔해야 하므로 사실상 데카르트 조인입니다. 따라서 표현식 또는 하위 쿼리가 ANSI JOIN의 오른쪽에 있는 경우 USE HASH 힌트가 지정되지 않은 경우에도 해시 조인이 기본 조인 방법입니다. 해시 조인을 사용할 수 없는 경우(예: 동일성 조인 조건이 없는 경우, USE NL 힌트가 사용된 경우, 커뮤니티 에디션이 사용 중인 경우(해시 조인은 엔터프라이즈 에디션에서만 사용 가능)) 중첩 루프 조인이 고려됩니다. 위의 설명 파일에서 표현식과 하위 쿼리가 모두 ANSI JOIN의 오른쪽에 있는 경우를 보면 두 설명 파일 모두에서 해시 조인 연산자가 사용되는 것을 확인할 수 있습니다.

키 스페이스가 ANSI JOIN의 오른쪽에 사용되는 경우, 키 스페이스에 USE INDEX 또는 USE KEYS 힌트를 지정할 수 있습니다. 표현식 또는 하위 쿼리가 ANSI JOIN의 오른쪽에 사용되는 경우, 명백한 이유로 표현식 또는 하위 쿼리에 USE INDEX 또는 USE KEYS 힌트를 지정할 수 없습니다. 이 경우 사용할 수 있는 유일한 힌트는 조인 힌트(USE HASH 또는 USE NL)입니다.

ANSI NEST 지원

이제 표현식이나 하위 쿼리를 ANSI NEST의 오른쪽으로 사용할 수 있습니다. 즉, ANSI NEST에도 동일한 개선 사항이 적용됩니다.

 

ANSI 병합

MERGE 문을 사용하면 '소스'의 문서를 '대상'에 병합할 수 있습니다. 즉, 일치하는 문서가 발견되면 대상 문서를 업데이트하고 일치하는 문서가 발견되지 않으면 대상에 문서를 삽입할 수 있습니다.

"일치"의 개념은 일치 조건에 의해 결정됩니다. 이전 버전의 Couchbase N1QL에서는 문서 키에 기반한 "일치", 즉 소스가 대상에 대한 문서 키를 생성해야 일치 항목이 있는지(해당 문서 키를 가진 문서가 대상에 이미 있는지) 확인할 수 있습니다. 이는 MERGE 문 구문의 ON KEYS 절을 통해 이루어집니다.

ON KEYS 절이 있는 MERGE 문을 조회 병합이라고 합니다. 이는 문서 키에 대한 조인이 필요하고 ON KEYS 절을 사용하는 ANSI JOIN 지원 이전의 조인 구문, 즉 조회 조인과 유사합니다. 따라서 MERGE 문의 자연스러운 확장은 ANSI MERGE 구문, 즉 ON 절을 사용하여 병합 조건을 지정하여 임의의 표현식을 사용하여 일치 여부가 있는지 여부를 판단할 수 있도록 하는 것입니다. ANSI MERGE는 Couchbase 서버 버전 6.5의 N1QL에서 지원됩니다.

다음은 ANSI MERGE 문의 예입니다:

이 예에서 병합 조건은 ON 절을 사용하여 지정됩니다. 이것은 ANSI JOIN의 ON 절과 매우 유사합니다. 실제로 내부적으로 ANSI MERGE 문은 동일한 ON 절이 있는 ANSI JOIN을 사용하여 소스 문서에 일치하는 항목이 있는지 여부를 확인합니다.

위의 병합 문에 대한 설명입니다:

설명에서 원본과 대상 간의 (내부적으로 변환된) ANSI JOIN 연산에 사용되는 NestedLoopJoin 연산자를 볼 수 있습니다.

조인 힌트는 소스에서 지정할 수 있습니다:

이 예제에서는 공항에 해시 힌트를 사용하도록 지정되어 있습니다.

ANSI MERGE에서 여러 일치 항목 처리하기

조회 병합에서는 병합 조건이 문서 키에 있기 때문에 각 소스 문서에 대해 하나의 잠재적 대상 문서 일치만 있습니다. 이제 병합 조건이 임의의 표현식이므로 ANSI MERGE에서는 각 소스 문서에 대해 잠재적으로 여러 개의 대상 문서가 일치할 수 있습니다. 지정된 각 병합 작업에 대해 병합 작업은 각 소스 문서에 대해 최대 한 번만 실행할 수 있습니다. 일치하는 문서가 여러 개 있는 경우 동일한 소스 문서에 대해 병합 작업을 두 번 시도하면 오류가 반환됩니다(오류 코드 5320 또는 5330). 이러한 오류가 발생하면 동일한 소스 문서에 대해 여러 개의 일치 항목이 발생하지 않도록 병합 조건(ON 절)을 세분화해야 합니다.

ANSI MERGE에 대한 삽입 작업

조회 병합에서 INSERT 작업을 지정하면 삽입되는 문서만 제공됩니다. 조회 병합에는 문서 키가 일치해야 하고, 일치하는 문서가 없는 경우(즉, 해당 문서 키를 가진 문서가 대상에 없는 경우)에만 INSERT 작업이 트리거되므로 새로 삽입된 문서는 동일한 문서 키를 사용하기만 하면 됩니다. 문서 키가 더 이상 일치 조건이 될 필요가 없기 때문에 ANSI MERGE의 경우 더 이상 그렇지 않습니다. 따라서 INSERT 작업을 지정할 때 문서 키도 INSERT 작업의 일부로 지정해야 합니다. 예를 들어

이에 비해 조회 병합을 위한 INSERT 작업의 구문은 다음과 같습니다:

여기서 은 삽입할 문서입니다.

다음은 ANSI MERGE에 대한 INSERT 작업의 구문입니다:

여기서 은 새로 삽입된 문서의 문서 키를 지정하고 은 새 문서를 지정합니다. 이 둘은 쉼표로 구분합니다.

사용할 수 있는 형식은 두 가지가 있으며, KEY 및 VALUE 키워드는 선택 사항입니다. 새로운 괄호 쌍도 필요합니다.

다른 병합 작업(업데이트 작업, 삭제 작업)은 조회 병합과 ANSI 병합 간에 동일하게 유지됩니다.

 

요약

Couchbase 6.5의 ANSI JOIN 개선 사항 및 ANSI MERGE 지원으로 N1QL의 ANSI 규정 준수가 향상되었으며, 특히 관계형 데이터베이스에서 마이그레이션할 때 N1QL을 더욱 사용자 친화적으로 만들 수 있습니다.

작성자

게시자 빙지에 미아오, 수석 소프트웨어 엔지니어 Couchbase

빙지에 미아오는 Couchbase의 수석 소프트웨어 엔지니어입니다. Bingjie는 관계형 및 NoSQL 데이터베이스 분야에서 20년의 경력을 보유하고 있습니다. 그의 주요 전문 분야는 쿼리 최적화 및 쿼리 실행입니다.

댓글 남기기