공동 저자: 틸 웨스트만, 엔지니어링 부문 선임 이사
그리고 비트 를 곧 출시될 Couchbase Server 6.5에서 사용할 수 있습니다. 효율적인 병렬 쿼리 처리를 지원하는 Analytics 서비스에서 정의된 창 함수에 대한 지원이 추가되었습니다. SQL:2003 표준.
여러분을 포함한 많은 사람들에게 창 함수는 거의 사용하지 않는 마법의 기능입니다. 하지만 창 함수는 SQL 쿼리를 더 간결하게 만들어 가독성을 높여주므로 실제 애플리케이션에서 쿼리를 쉽게 유지 관리할 수 있습니다. 창 함수로 표현되는 쿼리는 최적화하기 어려운 고비용의 자체 조인과 하위 쿼리를 포함하므로 쿼리 실행 속도가 느려질 수 있습니다. 윈도우 함수를 사용하는 가장 실용적인 예제인 누계 계산을 통해 요점을 설명하겠습니다.SQL에서 누계를 계산하는 방법에는 여러 가지가 있습니다. 이 블로그 게시물에서는 INNER JOIN을 사용하는 구식 방법과 Couchbase 6.5에서 새롭게 제공되는 창 함수를 사용하는 두 가지 방법으로 누계를 계산해 보겠습니다.
러닝 합계란 무엇인가요?
A 실행 합계 는 추가되는 항목을 고려하여 지속적으로 조정되는 합계입니다. 다른 용어로 부분 합계라고도 합니다. 아래 예에서 거래 날짜의 누계는 InvoiceID의 누계액에 현재 TransactionAmount를 더한 값입니다.
위에서 계산된 RunningTotal이 있지만 처음 세 필드는 소스 데이터이며 SQL 쿼리를 사용하여 RunningTotal을 계산해야 한다는 점에 유의하세요.
사전 요구 사항
다운로드 카우치베이스 서버 6.5 를 클릭하고 이 블로그 게시물에서 쿼리를 실행할 샘플 데이터에 대한 Couchbase 버킷을 설정합니다.
아래 데이터를 사용하여 "송장"이라는 Couchbase 버킷을 만듭니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[ { "인보이스": { "InvoiceID": 1, "트랜잭션 날짜": "2019-08-11", "TransactionAmount": 100 } }, { "인보이스": { "InvoiceID": 2, "트랜잭션 날짜": "2019-08-11", "TransactionAmount": 200 } }, ... ... { "인보이스": { "InvoiceID": 3, "트랜잭션 날짜": "2019-08-11", "TransactionAmount": 800 } } ] |
Analytics 워크벤치에서 다음 문을 실행하여 데이터 집합을 만듭니다.
1 2 |
만들기 데이터 세트 송장 on 송장; 연결 링크 로컬; |
특정 날짜의 누계에 대한 내부 조인 쿼리
각 인보이스 ID에 대해 거래 금액과 그 이전의 모든 거래 금액을 검색해야 합니다. 이 작업은 각 송장 및 그 이전 송장을 가져오는 조건이 포함된 Inner 조인을 사용하여 수행합니다.
1 2 3 4 5 |
선택 inv1.InvoiceID , inv1.트랜잭션 날짜, inv1.거래 금액, SUM(inv2.거래 금액) AS 러닝 토탈 FROM 송장 inv1 JOIN 송장 inv2 켜기 inv1.InvoiceID >= inv2.InvoiceID 어디 inv1.트랜잭션 날짜 = "2019-08-11" 그룹 BY inv1.InvoiceID, inv1.트랜잭션 날짜, inv1.거래 금액 주문 BY inv1.InvoiceID |
JOIN과 NoSQL이 항상 잘 어울리는 것은 아닙니다. 사실, 기존의 통념에 따르면 NoSQL 환경의 데이터는 JOIN을 피하기 위해 비정규화됩니다. 하지만 Couchbase Analytics는 복잡한 조인 및 집계를 포함하는 데이터 탐색 및 임시 분석을 위해 만들어졌습니다. 분석 쿼리 엔진은 다른 NoSQL 공급업체에서 지원하지 않는 조인을 처리할 수 있습니다.
- Cassandra - JOIN 지원 없음 CQL에서
- MongoDB - 샤드된 컬렉션에 참여할 수 없습니다.
카우치베이스 애널리틱스가 어떻게 JSON 데이터를 조인할 수 있는지 궁금하다면, 이 문서에서 자세히 알아보는 것을 추천합니다. 비디오 프레젠테이션 마이크 캐리 교수와 함께, 컨설팅 수석 아키텍트 카우치베이스.
특정 날짜의 누계에 대한 창 함수 쿼리
창 기능에 익숙하지 않다면 다음을 읽어보는 것이 좋습니다. PostgresSQL의 문서 를 소개합니다:
"A 창 기능 는 현재 행과 어떤 식으로든 관련된 테이블 행 집합에 대해 계산을 수행합니다. 이는 집계 함수로 수행할 수 있는 계산 유형과 비슷합니다. 그러나 일반 집계 함수와 달리 창 함수를 사용하면 행이 하나의 출력 행으로 그룹화되지 않고 행이 개별적인 신원을 유지합니다. 윈도우 함수는 쿼리 결과의 현재 행뿐만 아니라 그 이상의 행에 액세스할 수 있습니다."
실제 쿼리는 다음과 같습니다.
1 2 3 4 |
선택 InvoiceID, 트랜잭션 날짜, 거래 금액, SUM(거래 금액) OVER (주문 BY InvoiceID) as 러닝 토탈 FROM 송장 어디 트랜잭션 날짜 = "2019-08-11" 주문 BY InvoiceID |
위의 문구에는 단순함과 간결함 외에도 몇 가지 흥미로운 점이 있습니다.
- 집계 함수는 있지만 그룹화 절은 없습니다. 일반적으로 집계 함수에는 그룹화 절이 필요하지만 여기서는 OVER 절을 사용하므로 SUM은 창 함수로 간주됩니다.
- OVER 절은 현재 행을 기준으로 특정 행 집합을 검색하고 특정 필드에 대해 연산을 수행합니다.
- ORDER BY는 창 함수가 평가되는 논리적 순서를 정의합니다.
참고: 카우치베이스는 쿼리 및 분석 서비스 모두에 대한 창 기능을 지원하며, 동일한 쿼리를 쿼리 및 분석 워크벤치 모두에서 실행할 수 있습니다. 쿼리 서비스에서 실행하려면 다음 인덱스를 만들어야 합니다.
1 2 |
만들기 기본 INDEX 켜기 송장; 만들기 INDEX 인보이스_ID 켜기 송장(InvoiceID); |
이 블로그 포스팅의 목적은 Couchbase Analytics의 창 함수를 소개하는 것입니다. 창 함수는 SQL 표준의 일부이며 모든 주요 관계형 데이터베이스와 Hive 및 Spark와 같은 빅 데이터 도구에서 사용할 수 있습니다. 6.5 릴리스에서는 이러한 기능을 문서 데이터베이스에 제공합니다. 이를 직접 경험해보고 싶으시다면 다음을 참조하세요. 비트 다운로드 에 접속하여 포럼.