개요

이 문서의 주된 목적은 Couchbase ANSI 조인을 테스트하는 방법을 보여드리는 것입니다. In Couchbase 버전 5.5를 사용하면 이제 ANSI 표준 구문을 사용하여 조인을 실행할 수 있습니다. 이렇게 조인을 추가하면 훨씬 더 유연해지지만 훨씬 더 복잡해집니다. 이러한 복잡성 때문에 일반적인 프레임워크에서는 테스트하기가 어려우며, 자동화를 위해 수동으로 작성하기에는 너무 많은 가능성이 있습니다. 다행히도 테스트 프레임워크 중 하나를 사용하면 쿼리의 매개변수를 설정한 다음 해당 매개변수를 기반으로 임의의 쿼리 집합을 생성할 수 있습니다. 이 프레임워크는 무작위 쿼리 생성기(RQG). 이 문서에서는 구현된 ANSI JOIN 기능을 테스트하기 위해 RQG를 사용하는 방법에 대해 설명합니다. 먼저 ANSI JOIN의 차이점에 대해 간략하게 살펴보겠습니다.

이 글에서는 다음 주제에 대해 설명합니다:

1. ANSI 조인 소개

2. 랜덤 쿼리 생성기(RQG) 개요

3. RQG를 사용하여 ANSI 조인 테스트하기

4. 핵심 포인트

5. 발견된 추가 ANSI JOIN 버그 목록

6. 부록

ANSI 조인 소개

이전에는 카우치베이스에서 조회 조인만 실행할 수 있었고 인덱스 조인. 이것은 조인의 한 쪽에서 다른 쪽의 문서 키를 생성할 수 있는 쿼리에 유용했습니다. 하지만 키 스페이스의 다른 필드에서는 조인을 실행할 수 없다는 문제가 있었습니다. ANSI 조인은 이 문제를 해결하고 한 단계 더 나아가 이제 임의의 필드 또는 필드를 생성하는 표현식 또는 여러 조인 조건에 대해 조인을 실행할 수 있습니다.

이전 조인 구문:

        Lhs-키스페이스 [조인 유형] JOIN rhs-키스페이스

ON KEYS [키 공간 중 하나의 메타().id를 생성하는 표현식]

ANSI JOIN 구문:

lhs-expression [조인 유형] JOIN rhs-키 스페이스 ON [조인 조건]

이전 조인 구문 쿼리:

ANSI JOIN 구문을 사용한 동일한 쿼리:

N1QL에서 지원되는 조인 유형은 INNER JOIN 또는 LEFT/RIGHT OUTER JOIN입니다. 단순히 JOIN을 입력하면 INNER JOIN으로 해석되고, LEFT/RIGHT JOIN은 OUTER JOIN으로 해석됩니다. 새 조인 구문에서 조인의 왼쪽은 키 스페이스, 중첩된 n1ql 쿼리, n1ql 식 또는 조인 자체가 될 수 있습니다. 조인의 오른쪽은 현재 Couchbase 내부의 ANSI JOIN 구현에서 키 스페이스여야 합니다. ON 절에는 조인이 충족해야 하는 조건이 포함되어 있으며, 이러한 조건은 오른쪽 키 공간에 적절한 인덱스가 있는 한 모든 술어 식이 될 수 있습니다. 따라서 동등 비교 및 비동등 비교(b1.field = b2.field 또는 b1.field/=/!=/b2.field 또는 b2.field가 NOT NULL 또는 복합 식 = b2.field) 이것은 새로운 기능에 대해 간략하게 살펴본 것이며, 기능에 대해 더 자세히 알아보려면 이 블로그 게시물(기능을 구현한 개발자 Bingjie Miao가 작성한)을 확인하시기 바랍니다: https://www.couchbase.com/blog/ansi-join-support-n1ql/

이제 ANSI 조인은 이전 조인과 비교하여 제한이 거의 없다는 것을 이해하기 시작했습니다. ANSI 조인의 왼쪽은 매우 복잡할 수 있으며, 조인 자체가 여러 개일 수도 있고, 일부 json 데이터를 가져오는 중첩 쿼리일 수도 있고, 여러 개의 중첩 쿼리일 수도 있습니다. 이러한 수준의 복잡성 때문에 개별 쿼리를 만들어 테스트하는 것보다 RQG라고 하는 것을 사용하는 것이 좋습니다. 다음은 RQG의 작동 방식에 대한 간략한 개요입니다.

랜덤 쿼리 생성기(RQG) 개요

RQG는 Couchbase에서 작성한 프레임워크로, 다음과 같은 다른 프레임워크를 활용합니다. Randgen. 기본적으로 우리는 문법이라는 파일에 매개변수 집합을 지정하고, 이러한 매개변수로부터 Randgen이 SQL 쿼리 템플릿(필드 이름과 테이블 이름에 대한 자리 표시자가 있는 쿼리)을 생성한 다음, 프레임워크가 이러한 템플릿을 처리하여 카우치베이스에 로드된 데이터 집합을 기반으로 N1QL 형식의 쿼리로 변환합니다.

쿼리 템플릿 예시:

이 템플릿은 매개 변수가 포함된 문법 파일에서 생성되며, 기본적으로 문법 파일은 동등 비교에 대한 임의의 두 버킷의 조인에서 숫자 유형의 데이터 목록을 선택하는 쿼리를 생성하도록 randgen에 지시합니다. 이 문법에는 선택할 수 있는 다양한 유형의 필드와 ON/ WHERE 조건에 슬롯으로 넣을 수 있는 다양한 조인 조건이 있습니다. 위와 같이 템플릿이 생성되면, 프레임워크는 이러한 임의의 값을 로드된 데이터에 기반한 값으로 대체합니다. NUMERIC_FIELD_LIST의 경우, 사용 가능한 항목에 따라 정수/빅긴트/부동 소수점/숫자 등의 목록인 필드를 선택합니다. 프레임워크는 서버에 존재하는 버킷의 특정 이름으로 BUCKET_NAME을 대체합니다. 이전_테이블.필드는 첫 번째 버킷의 필드가 되고 현재_테이블.필드는 두 번째 버킷의 동일한 필드가 됩니다. 이 모든 작업이 완료되면 쿼리를 검토하고 N1QL과 SQL 간의 차이점이 정리된 쿼리의 복사본을 생성합니다. 예를 들어, 이전 조인 구문에서는 ON이라는 키워드를 사용할 수 없었기 때문에, 대신 RQG는 n1ql 쿼리에 대해 ON을 ON KEYS로 변환합니다.

변환된 쿼리 예시:

그런 다음 n1ql 쿼리와 SQL 쿼리를 모두 카우치베이스 서버와 동등한 MySQL 서버에 대해 실행합니다. N1QL 쿼리의 결과는 동등한 MySQL 쿼리의 결과와 비교됩니다. N1QL이 기능적으로 SQL과 유사하기를 원하기 때문에 결과가 MySQL 결과와 일치하도록 하는 것이 목표입니다. RQG가 어떻게 배치되는지 또는 템플릿을 생성하여 n1ql로 변환하는 방법에 대해 자세히 알아보려면 5부작으로 구성된 RQG 시리즈를 참조하세요: https://dzone.com/articles/testing-n1ql-sql-for-json

RQG를 사용하여 ANSI 조인 테스트하기

RQG를 설정하는 방식은 우리가 직접 생각하지 못했던 다양한 쿼리를 생성할 수 있게 해줍니다. 다음은 RQG로 생성된 매우 복잡한 템플릿입니다:

이 쿼리의 엄청난 크기에서 알 수 있듯이, 이 쿼리를 자체적으로 생성하는 것은 매우 어려웠을 것이며, 이러한 쿼리의 대부분은 RQG를 통해 생성 및 실행됩니다. 매우 복잡한 쿼리를 생성할 수 있는 이 기능은 ANSI JOIN의 임의적인 복잡성을 처리하는 데 완벽하게 적합합니다. ANSI JOIN을 테스트하기 위해 정의한 문법은 조인 왼쪽의 복잡성과 ON 절의 복잡성을 포착하려고 시도합니다. 우리는 RQG에 왼쪽 를 일반 키 공간, n1ql 하위 쿼리 또는 여러 중첩 조인의 세 가지 중 하나로 지정합니다. 우리는 RQG에 오른쪽 를 키 스페이스로 지정합니다. 그런 다음 RQG에 조인을 생성하도록 지시합니다. ON 절 의 조인을 두 필드 사이의 대부분 동일성 술어로 사용하는 경우 왼손 키 스페이스 또는 왼손 별칭오른쪽 키 공간에서 하나. ON 절에서 생성될 수 있는 다른 것들은 비동등 비교(/=/!=) 또는 단순히 오른쪽 키 공간 필드의 속성 확인(b2.field가 null이 아님, b2.field가 누락되지 않음, b2.field가 목록에 있음 등)일 수 있습니다. ANSI JOIN의 경우, N1QL과 SQL 사이에는 약간의 차이가 있습니다. 그 차이점은 N1QL은 비관계형 데이터 모델 때문에 비교 IS(NOT) MISSING을 지원한다는 것입니다. 일부 버킷에는 해당 버킷의 다른 문서에는 없는 필드가 있는 문서가 있을 수 있습니다. 따라서 IS (NOT) MISSING은 해당 필드가 문서에 표시되지 않음을 의미합니다(또는 IS NOT MISSING의 경우 해당 필드가 문서에 표시됨을 의미합니다). 기술적으로 원한다면 ON 절 내에서 n1ql 하위 쿼리를 생성하고 이를 오른쪽 키 공간 값과 비교하도록 RQG에 지시할 수도 있지만, 이렇게 하면 쿼리 실행 시간이 기하급수적으로 늘어나므로 일반적인 사용 사례는 아닙니다. 다음은 위의 매개 변수 집합에서 생성된 몇 가지 샘플 ANSI JOIN 쿼리입니다:

이 예에서 볼 수 있듯이 ON 절은 AND/OR로 연결된 여러 개의 연쇄 술어가 될 수 있습니다. 또한 하나의 쿼리에서 여러 조인이 실행될 수 있으며 각 조인마다 고유한 ON 절을 가질 수 있다는 것을 관찰할 수 있습니다.

이제 RQG가 템플릿을 생성하는 방법과 이러한 템플릿의 모양을 이해했으니, 다른 방법으로는 발견하지 못했을 ANSI JOIN 기능에서 발견한 버그의 예를 살펴보겠습니다. MB-27483, 이 버그에서는 다음과 같은 쿼리가 발생했습니다:

이 쿼리는 서버 설정 방식에 따라 성공적으로 실행되어야 하지만 실행 대신 오른쪽 키 공간에 적절한 인덱스가 존재하지 않는다는 오류를 발생시켰습니다. 여기서 문제는 WHERE 절이 ON 절의 인덱스 선택을 방해하여 실제로 인덱스가 존재하는데도 쿼리가 필요한 인덱스가 없다고 생각하게 만든다는 것이었습니다. WHERE 절을 살펴보면 매우 복잡하다는 것을 알 수 있는데, 이는 일반적으로 테스트의 기능적인 측면에서 볼 수 있는 수준의 복잡성이 아닙니다. 따라서 RQG를 사용하지 않았다면 이 버그를 발견하지 못했을 것입니다.

핵심 포인트

ANSI JOIN은 조인할 수 있는 항목이 매우 유연하며, 임의의 식을 키스페이스로 조인할 수 있고, ON 절에 임의의 식을 필드와 비교하는 술어가 포함될 수 있습니다. 이러한 수준의 복잡성 때문에 기능 테스트를 통해 모든 시나리오를 직접 테스트하기 위한 구체적인 쿼리를 만드는 것은 비현실적입니다. 다행히도 정의할 수 있는 규칙 집합을 기반으로 쿼리를 생성할 수 있는 RQG라는 프레임워크가 있습니다. 이 기능은 매우 강력하여 만족할 만한 수준으로 ANSI JOIN을 테스트할 수 있었습니다. 예를 들어 많은 수의 복잡한 쿼리가 실행되는 경우 ANSI JOIN 결과가 1씩 틀릴 수 있지만, 개별 쿼리 중 하나만 단독으로 실행하면 결과가 올바르게 나오는 등 다른 방법으로는 찾기 어려운 버그를 발견하는 데도 도움이 되었습니다. 그렇기 때문에 우리는 ANSI JOIN이 양호한 상태이며 고객이 사용할 준비가 되어 있다고 확신합니다.

RQG에서 발견된 추가 ANSI JOIN 버그 목록입니다:

버그 번호 버그 설명
MB-27834 이 쿼리는 LIMIT 쿼리 힌트를 제대로 사용하지 않았으며, LIMIT를 적용하기 전에 전체 쿼리를 실행합니다.
MB-27763 이 쿼리는 위의 버그와 유사하게 LIMIT 쿼리 힌트를 제대로 사용하지 않았습니다.
MB-27483 쿼리에서 적절한 인덱스가 존재하지 않는다고 생각하여 오류를 발생시켰습니다. 그러나 인덱스가 실제로 시스템에 존재했습니다.
MB-27230 쿼리에서 잘못된 오류가 반환되었습니다.
MB-27201 이 쿼리에서 백필이 제대로 작동하지 않는 오류가 발생했습니다.
MB-27109 인덱스가 시스템에 존재함에도 불구하고 필요한 인덱스를 사용할 수 없다고 생각한 또 다른 쿼리
MB-27028 여러 개의 쿼리를 연속으로 실행하면 일부 쿼리 결과가 1씩 틀렸지만, 쿼리를 단독으로 실행하면 모든 결과가 정확했습니다.
MB-26649 쿼리가 간헐적으로 중단됨

부록

  1. 카우치베이스 서버 5.5 GA 블로그 https://www.couchbase.com/blog/announcing-couchbase-server-5-5/
  2. 인덱스 조인 https://dzone.com/articles/join-faster-with-couchbase-index-joins
  3. ANSI 조인스 카우치베이스 블로그 https://www.couchbase.com/blog/ansi-join-support-n1ql/
  4. Randgen https://launchpad.net/randgen
  5. RQG Dzone 기사 시리즈 https://dzone.com/articles/testing-n1ql-sql-for-json

작성자

게시자 Ajay Bhullar

Ajay Bhullar는 2년간 Couchbase에서 소프트웨어 엔지니어 테스터로 일하고 있습니다. Ajay는 Couchbase ANSI 조인을 테스트하는 방법과 Couchbase 버전 5.5에서 ANSI 표준 구문을 사용하여 조인을 실행하는 방법을 연구하고 있습니다.

댓글 남기기