SQL(구조화된 쿼리 언어)은 원래 관계형 데이터 저장소를 위한 직관적인 쿼리 언어로 설계되었습니다. 이에 비해 상대적으로 초기 단계인 NoSQL은 많은 BI 도구 및 응용 프로그램에서 SQL을 이해하므로 여전히 SQL과의 호환성이 필요합니다. Couchbase는 자체 쿼리 언어를 지원합니다, N1QL에 저장된 JSON 문서를 쿼리하기 위한 SQL을 확장한 것입니다. 카우치베이스 서버. Simba Couchbase ODBC 및 JDBC 드라이버는 사용자가 SQL과 N1QL을 모두 활용할 수 있게 함으로써 "일석이조"를 누릴 수 있게 해줍니다. 이를 달성하는 방법 중 하나는 협업 쿼리 실행(CQE) 이 문서에서는 심바 카우치베이스 드라이버가 SQL과 N1QL의 유사성을 활용하여 최적의 성능을 보장하기 위해 CQE를 사용하는 방법을 설명합니다.
조인 작업
N1QL 지원 조회 조인로 변환할 수 있으며, 이는 SQL에서 유사한 JOIN으로 대략적으로 변환할 수 있습니다. 여기서는 Simba Couchbase 드라이버가 어떻게 CQE 기능을 활용하여 JOIN 작업을 Couchbase Server에 전달하는지에 대해 설명하겠습니다.
맥주와 양조장 문서가 포함된 맥주 샘플 데이터 세트를 예로 들어보겠습니다. 심바 카우치베이스 드라이버를 사용하면 이러한 문서를 맥주와 양조장이라는 두 개의 서로 다른 테이블에 매핑할 수 있으며, 사용자는 이 두 테이블에서 JOIN 쿼리를 실행할 수 있습니다.
사용자가 캘리포니아 주에서 양조되는 모든 맥주를 찾고자 하는 경우 다음과 같은 SQL 문을 실행한다고 가정해 보겠습니다:
|
1 |
선택 맥주.이름, 양조장.이름 FROM 맥주 JOIN 양조장 켜기 맥주.brewery_id=양조장.PK 어디 양조장.상태='캘리포니아' |
이 SQL 쿼리에 대한 결과를 생성하려면 다음을 수행해야 합니다:
- 카우치베이스 서버에서 클라이언트로 모든 맥주 문서 가져오기
- 카우치베이스 서버에서 클라이언트로 모든 브루어 문서 가져오기
- 조인 실행
- 주(州)가 캘리포니아인 결과를 필터링합니다.
조인 테이블이 매우 큰 경우 클라이언트 측에 많은 부하를 줄 수 있으므로 효율적이지 않습니다. 또한 N1QL에서는 JOIN 및 WHERE 작업이 지원됩니다. 부하를 서버 측으로 이전하면 성능이 향상될 수 있습니다.
Simba Couchbase 드라이버가 바로 그 역할을 합니다. CQE를 사용하면 Simba Couchbase 드라이버는 주어진 SQL을 유사한 N1QL로 변환하고, 이를 실행을 위해 Couchbase Server로 전달할 수 있습니다. 위의 SQL 문은 다음과 같이 N1QL로 변환할 수 있습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
선택 `$sb_c5_name`,`$sb_c6_name` FROM `맥주-샘플` `$sb_t0_beer` JOIN `맥주-샘플` `$sb_t1_brewery` 켜기 키 토스트링(IFMISSING(`$sb_t0_beer`.`brewery_id`,NULL)) LET `$sb_c0_PK` = 메타(`$sb_t0_beer`).id, `$sb_c1_TableType` = 토스트링(IFMISSING(`$sb_t0_beer`.`유형`,NULL)), `$sb_c2_PK` = 메타(`$sb_t1_brewery`).id, `$sb_c3_TableType` = 토스트링(IFMISSING(`$sb_t1_brewery`.`유형`,NULL)), `$sb_c4_state` = 토스트링(IFMISSING(`$sb_t1_brewery`.`상태`,NULL)), `$sb_c5_name` = 토스트링(IFMISSING(`$sb_t0_beer`.`이름`,NULL)), `$sb_c6_name` = 토스트링(IFMISSING(`$sb_t1_brewery`.`이름`,NULL)) 어디 (`$sb_c0_PK`!='~~~스키마맵') AND(`$sb_c1_TableType` = '맥주') AND(`$sb_c2_PK`!='~~~스키마맵') AND(`$sb_c3_TableType` = '양조장') AND(`$sb_c4_state` = "캘리포니아"); |
내부적으로 Simba 카우치베이스 드라이버는 쿼리 구문 분석, 준비 및 실행을 위해 Simba SQL 엔진을 사용합니다. 쿼리를 실행하기 전에 드라이버는 대수 표현 트리(AE-Tree) 표현을 생성합니다. SQL 문은 Simba SQL 엔진이 실행 계획으로 변환하여 실행하기 직전에 이 형식을 취합니다. 실행 전에 드라이버는 계획을 검토하고 실행할 수 있는 부분이 있는지 확인할 수 있습니다. 이를 전달 단계라고 합니다.
전달 단계 바로 직전( AETree 최적화 기사), AE-Tree는 다음과 같이 보입니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
AEQuery AEProject AEJoin: AE_INNER_JOIN AETable: 도심 기본값.맥주-샘플.맥주 AESelect AETable: 도심 기본값.맥주-샘플.양조장 AEComparison: EQ AEValueList AEC칼럼: "cbdefault"."맥주 샘플"."양조장"."state" AEValueList AELiteral: 캘리포니아; 캐릭터 문자열 리터럴 AEComparison: EQ AEValueList AEC칼럼: "cbdefault"."맥주 샘플"."맥주"."brewery_id" AEValueList AEC칼럼: "cbdefault"."맥주 샘플"."양조장"."PK" AEValueList AEC칼럼: "cbdefault"."맥주 샘플"."맥주"."name" AEC칼럼: "cbdefault"."맥주 샘플"."양조장"."name" |
그리고 계승 후 AETree는 이렇게 생겼습니다:
|
1 2 |
AEQuery AETable: 맥주_조인_브루어리 |
보시다시피 AE-Tree에는 조인된 테이블을 나타내는 노드가 하나만 포함되어 있으므로 조인 및 필터링을 포함한 다른 모든 작업은 Couchbase Server로 전달됩니다. Couchbase Server에서 드라이버로 전송되는 데이터가 적고 클라이언트 측에서 수행되는 작업 수가 적으면 성능이 향상됩니다!
UNNEST 작업
N1QL은 개념적으로 중첩된 배열과 상위 개체의 조인을 수행하는 UNNEST 절을 지원합니다.
심바 카우치베이스 드라이버에서 중첩 배열은 가상 테이블에 매핑되며, 사용자는 부모 테이블과 가상 테이블을 조인할 수 있습니다. 이 역시 SimbaEngine X의 CQE 기능을 사용하며 N1QL UNNEST 절을 활용합니다.
예를 들어, 맥주 샘플 데이터 세트의 모든 양조장 문서에는 brewery_address라는 중첩 배열이 포함되어 있습니다. Simba Couchbase 드라이버에서 이러한 문서는 brewery 테이블과 brewery_address 가상 테이블에 매핑됩니다. 사용자가 brewery와 brewery_address를 조인한 후 모든 양조장 이름을 얻으려면 다음과 같이 SQL 문을 실행한다고 가정해 보겠습니다:
|
1 |
선택 양조장.이름 FROM 양조장 JOIN 브루어리_주소 켜기 양조장.PK=브루어리_주소.PK; |
Simba 카우치베이스 드라이버는 위의 SQL 문을 다음과 같이 N1QL로 변환합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
선택 `$sb_c4_name` FROM `맥주-샘플` `$sb_t0_brewery` UNNEST `$sb_t0_brewery`.`주소` `$SB_T1_브루어리_주소` LET `$sb_c0_PK` = 메타(`$sb_t0_brewery`).id, `$sb_c1_TableType` = 토스트링(IFMISSING(`$sb_t0_brewery`.`유형`,NULL)), `$sb_c2_PK` = 메타(`$sb_t0_brewery`).id, `$sb_c3_TableType` = 토스트링(IFMISSING(`$sb_t0_brewery`.`유형`,NULL)), `$sb_c4_name` = 토스트링(IFMISSING(`$sb_t0_brewery`.`이름`,NULL)) 어디 (`$sb_c0_PK`!='~~~스키마맵') AND(`$sb_c1_TableType` = '양조장') AND(`$sb_c2_PK`!='~~~스키마맵') AND(`$sb_c3_TableType` = '양조장'); |
전달 전의 AE-Tree는 다음과 같은 모습입니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
AEQuery AEProject AEJoin: AE_INNER_JOIN AETable: 도심 기본값.맥주-샘플.양조장 AETable: 도심 기본값.맥주-샘플.브루어리_주소 AEComparison: EQ AEValueList AEC칼럼: "cbdefault"."맥주 샘플"."양조장"."PK" AEValueList AEC칼럼: "cbdefault"."맥주 샘플"."brewery_address"."PK" AEValueList AEC칼럼: "cbdefault"."맥주 샘플"."양조장"."name" |
전달 후 AE-Tree는 다음과 같은 모습입니다:
|
1 2 |
AEQuery AETable: 브루어리_조인_브루어리_주소 |
보시다시피 AE-Tree에는 다시 조인된 테이블을 나타내는 노드 하나만 포함되어 있으며, 이는 다른 모든 것이 실행을 위해 Couchbase Server로 전달된다는 것을 의미합니다. 다시 말하지만, 서버 측에서 발생하는 연산이 많을수록, 그리고 유선을 통해 드라이버로 돌아오는 데이터가 적을수록 쿼리 성능이 향상됩니다.
이 두 가지 예는 지원되는 N1QL 연산을 서버로 전달하여 실행하도록 함으로써 Simba Couchbase 드라이버가 Couchbase Server의 잠재력을 최대한 활용하는 방법을 강조합니다. N1QL에서 지원되지 않는 SQL 기능의 경우 드라이버가 작업을 실행합니다(클라이언트 측). 이러한 방식으로 드라이버는 SQL 및 N1QL에 대한 폭넓은 지원과 고성능을 보장합니다.
이제 당신의 차례입니다
무료 평가판 다운로드 카우치베이스 ODBC/JDBC 드라이버 새로운 Couchbase Server 4.5에서 사용해 보세요!