비즈니스 애플리케이션에는 고객 주문 접수, 고객 주문 배송, 배송 추적, 재고 보고서 생성, 일별/월별/분기별 비즈니스 보고서, 비즈니스 대시보드 생성 등의 요구사항이 있습니다. 이러한 요구사항은 천천히 진화합니다. 이러한 요구 사항은 NoSQL 데이터베이스.

NoSQL 데이터베이스에서는 다양한 기술과 해결 방법을 통해 문제를 해결할 수 있습니다. 다음은 그 중 몇 가지입니다:

  1. 다른 키로 데이터를 복사하면 스캔이 더 쉬워집니다.
  2. 애플리케이션에 필요한 모든 데이터를 가져온 다음 보고서를 생성합니다.
  3. 관계형 데이터베이스에 데이터를 로드하여 보고서를 생성합니다.
  4. 제품에서 다음과 같은 해결 방법을 제공합니다. 지도 축소 보기, API
  5. 마지막으로, SQL 자체는 비합리적으로 효과적이지 않음 를 사용하여 정형 및 반정형 데이터를 모두 지원합니다. 다음과 같은 NoSQL 데이터베이스 카우치베이스, 카산드라, 코스모스DB JSON 및 와이드 컬럼 데이터 모델용 확장 SQL이 있습니다.

NoSQL은 "NO SQL"에서 Not Only SQL로 진화해 왔습니다. 반정형 데이터를 지원하기 위한 SQL의 진화 역사와 함께 진화 배경에 관심이 있으시다면 다음 인터뷰를 참고하시기 바랍니다.

  1. 라비 마유람과 돈 체임벌린의 인터뷰[2017]:  https://youtu.be/-U_UjqnhMBI?t=3492
  2. 라비 마유람, 돈 체임벌린, 마이크 캐리 교수의 패널 토론 [2018]:  https://www.youtube.com/watch?v=LAlDe1w7wxc

많은 NoSQL 데이터베이스가 "SQL 지원"을 주장합니다. 하지만 SQL 표준 는 넓고 깊으며 아홉 권의 방대한 책. 아무도 Oracle nor SQL Server는 수십 년의 작업에도 불구하고 표준의 모든 것을 지원합니다. 따라서 NoSQL 데이터베이스는 따라잡기에는 아직 갈 길이 멀었습니다. 따라서 SQL 지원에 대한 자세한 평가를 해볼 가치가 있습니다. 

다음은 NoSQL 데이터베이스의 SQL 지원을 평가하는 데 사용해야 하는 기준입니다.

  1. 언어 지원: 지원되는 문, 데이터 유형, 작업(조인, 그룹화, 집계, 윈도우, 페이지 매김 등)
  2. 인덱싱 지원: 인덱스는 특히 대화형 애플리케이션의 워크로드에서 성능의 핵심입니다.
  3. 최적화 도구: 쿼리 재작성, 올바른 액세스 경로 선택, 최적의 쿼리 실행 경로 생성은 SQL을 성공적인 4GL로 만드는 요소입니다. 어떤 것은 규칙 기반 최적화 도구, 어떤 것은 비용 기반 최적화 도구, 어떤 것은 두 가지를 모두 사용합니다. 최적화 도구의 품질을 평가하는 것이 중요합니다. 일반적인 벤치마크(TPC-C, TPC-DS, YCSB, YCSB-JSON)는 여기서 도움이 되지 않습니다.
  4. 속담에 이런 말이 있습니다: "데이터베이스에는 성능, 성능, 성능이라는 세 가지 중요한 요소가 있습니다." 워크로드의 성능을 측정하는 것이 중요합니다.  YCSB 및 확장 YCSB-JSON 를 사용하면 이 평가가 더 쉬워집니다.
  5. SDK: 풍부한 SDK와 언어 지원으로 개발 속도를 높일 수 있습니다.
  6.  BI 도구 지원: 대용량 데이터 분석의 경우 일반적으로 표준 데이터베이스 연결 드라이버를 통한 BI 도구의 지원이 중요합니다.

이 글에서는 각 구현을 통해 Cassandra, CosmosDB, Couchbase 및 MongoDB의 SQL 언어 지원을 비교하고 대조해 보겠습니다. 확실히, MongoDB는 SQL을 지원하지는 않지만 비교 명령.

분석을 여러 섹션으로 나누었습니다. 워드프레스 서식 때문에 표가 너무 큽니다. 다음은 간결하고 읽기 쉬운 PDF 버전입니다. [PDF를 보려면 이미지를 클릭하세요.]

Cassandra, CosmosDB, Couchbase 및 MongoDB의 SQL 지원 요약.

 

 

 

 

 

SQL 지원 접근 방식:  

SQL SQL은 선언적 언어이며, 선택-조인-프로젝트 연산이 기본이 됩니다.
카산드라 CQL: 카산드라의 SQL에서 영감을 받은 언어입니다.
코스모스DB MongoDB API, 그렘린(그래프용) 등과 함께 SQL을 지원합니다. 간단한 순서별 선택 기능을 지원합니다.  
카우치베이스 N1QL: JSON용 SQL. 

Couchbase에는 쿼리 서비스와 분석 서비스의 두 가지 N1QL 구현이 있습니다.

MongoDB 자바스크립트 기반의 간소화된 SQL 명령어 기반 쿼리.

입력 및 출력

SQL 입력: 행 집합(튜플)

출력: 행 집합(튜플)

카산드라 입력: 행 세트

출력: 행 집합

코스모스DB INPUT: JSON 세트

OUTPUT: JSON 집합

카우치베이스 INPUT: JSON 세트

OUTPUT: JSON 집합

MongoDB INPUT: JSON 세트

OUTPUT: JSON 집합

SELECT: FROM 절

SQL 데이터 소스 테이블(관계)을 지정합니다.
카산드라 FROM 절에 하나의 테이블만 허용됩니다. 이제 조인, 하위 쿼리 또는 표현식이 허용됩니다. FROM 절 해석은 SQL과 동일합니다.
코스모스DB FROM 절은 단일 컬렉션과 자체 조인을 지원합니다(카우치베이스의 UNNEST와 동일).   
카우치베이스 FROM 절에서 여러 키 공간(버킷의 하위 집합), 하위 쿼리, 표현식을 사용할 수 있습니다. SQL과 동일
MongoDB 단일 테이블의 경우 db.t1.find() SELECT.

db.t1.aggregate()는 일반화된 쿼리 프레임워크로 사용됩니다. aggregate()는 $lookup 연산자를 사용하여 추가 컬렉션과 조인할 수 있습니다. 집계 파이프라인 프레임워크에는 여러 개의 $lookup 연산자가 있을 수 있으며, 이는 SQL FROM 절의 가장 가까운 사촌입니다.

SELECT: WHERE 절

SQL 행 선택 기준
카산드라 표준 부울 표현식. 하위 쿼리가 없습니다.
코스모스DB SQL과 동일
카우치베이스 표준 부울 표현식 및 하위 쿼리.
MongoDB db.t1.find({x:10});

aggregate()에는 $match 절이 있습니다.

SELECT: SELECT 절

SQL 투영 조항
카산드라 SELECT 절은 SQL과 동일합니다.
코스모스DB SELECT 절은 SQL과 동일합니다.
카우치베이스 SELECT 절은 SQL과 동일합니다.
MongoDB db.t1.find({x:10}, {a:1, b:1})

$집계 파이프라인의 프로젝트 운영자

SELECT: CTE - 공통 테이블 표현식

SQL 동적으로 정의된 데이터 원본(테이블, 결과 집합)
카산드라 지원되지 않음
코스모스DB 지원되지 않음
카우치베이스 WITH 절; SQL과 동일합니다(v6.5에서). 재귀적 CTE는 지원되지 않습니다.
MongoDB 지원되지 않음

SELECT: 하위 쿼리

SQL 하위 쿼리: 하위 쿼리: 표현식이 허용되는 모든 곳에서 FROM 절, WHERE 절의 하위 쿼리입니다.
카산드라 지원되지 않음
코스모스DB 지원되지 않음
카우치베이스 상관관계가 있는 하위 쿼리와 상관관계가 없는 하위 쿼리를 모두 지원합니다.
MongoDB find()에서 지원되지 않습니다. 파이프라인에 $match를 추가할 수 있지만 정확히 하위 쿼리와 동등하지는 않습니다.

SELECT: GROUP BY

SQL 하나 이상의 표현식을 기준으로 행을 그룹화합니다. 그룹에 대한 보고 및 집계에 매우 유용합니다.
카산드라 지원됨; SQL과 동일합니다.
코스모스DB 지원되지 않습니다. 전체 결과 집합에 대해서만 집계를 수행할 수 있습니다.
카우치베이스 지원됨; SQL과 유사합니다.
MongoDB aggregate() 파이프라인의 $group 연산자

SELECT: HAVING 절

SQL 집계 후 필터링.
카산드라 지원되지 않음
코스모스DB 지원되지 않음
카우치베이스 HAVING 절; SQL과 동일합니다.
MongoDB 그룹화 및 집계 후 $매치.

SELECT: ORDER BY 절

SQL 쿼리 블록에서 생성된 결과의 최종 순서
카산드라 ORDER BY 절; SQL과 동일합니다.
코스모스DB ORDER BY 절; SQL과 동일합니다.
카우치베이스 ORDER BY 절; SQL과 동일합니다.
MongoDB db.t1.find().sort({a:1, b:-1});

aggregate()에는 결과 순서를 지정하는 $sort가 있습니다.

SELECT: 제한, 오프셋 절

SQL 결과 집합의 페이지 매김에 사용
카산드라 "LIMIT가 지원됩니다.

오프셋은 지원되지 않습니다."

코스모스DB LIMIT(TOP) 및 OFFSET 절; SQL과 유사합니다.
카우치베이스 제한 및 오프셋 절; SQL과 동일합니다.
MongoDB skip(), limit() 메서드와 find(). $offset, $limit 메서드를 aggregate()와 함께 사용합니다.

SELECT: JOIN 절

SQL 내부 조인, 왼쪽/오른쪽/전체 외부 조인.
카산드라 조인은 지원되지 않습니다. 애플리케이션은 조인을 피하기 위해 데이터를 모델링하거나 애플리케이션 계층에서 조인을 수행해야 합니다.
코스모스DB 자체 조인만 가능합니다. INNER/LEFT/RIGHT/등 조인이 없습니다.
카우치베이스 내부, 왼쪽 바깥쪽, 중첩, 중첩 해제 및 제한된 오른쪽 바깥쪽을 지원합니다. SQL과 동일한 구문입니다. FULL OUTER 조인은 지원되지 않습니다.
MongoDB $lookup 연산자를 통해서만 제한된 왼쪽 외부 조인. 배열 요소 또는 표현식에 대한 조인은 사용할 수 없습니다.

SELECT: 집계

SQL 집계
카산드라 전체 결과에 대한 단순 집계가 지원됩니다. GROUP BY를 사용한 집계는 지원되지 않습니다.
코스모스DB 전체 결과에 대한 단순 집계가 지원됩니다. GROUP BY를 사용한 집계는 지원되지 않습니다.
카우치베이스 합계, 평균, 카운트, 최대, 최소, 차이: SQL과 동일합니다.
MongoDB 그룹화가 지원되는 $sum, $count, $avg

SELECT: 집계 함수

SQL 전체 결과에 대한 단순 집계가 지원됩니다. GROUP BY를 사용한 집계는 지원되지 않습니다.
카산드라 지원되지 않음
코스모스DB 지원되지 않음
카우치베이스 6.5에서 SQL 표준 창 분석 기능을 지원합니다.
MongoDB 지원되지 않음

SELECT: 창(분석/집계) 함수

SQL OVER() 절을 사용하여 합계를 실행하기 위한 윈도우 함수
카산드라 지원되지 않음
코스모스DB 지원되지 않음
카우치베이스 6.5에서 SQL 표준 창 분석 기능을 지원합니다.

자세한 내용을 확인하세요: https://www.couchbase.com/blog/json-to-insights-fast-and-easy/

https://www.couchbase.com/blog/get-a-bigger-picture-with-n1ql-window-functions-and-cte/

MongoDB 지원되지 않음

삽입: 단일 행/문서 삽입.

SQL 단일 행 삽입
카산드라 INSERT 문
코스모스DB API 삽입
카우치베이스 INSERT 문
MongoDB db.t1.save()

삽입: 여러 행/문서 삽입.

SQL INSERT 문
카산드라 지원되지 않음
코스모스DB 지원되지 않음
카우치베이스 여러 문서로 삽입
MongoDB db.t1.insert()

문 삭제

SQL 하나 이상의 문서 삭제
카산드라 DELETE 문; SQL과 동일
코스모스DB API 삭제
카우치베이스 DELETE 문; SQL과 동일
MongoDB db.t1.delete()

UPSERT 문

SQL INSERT. 존재하면 업데이트합니다.
카산드라 지원되지 않음
코스모스DB 지원되지 않음
카우치베이스 UPSERT 문.
MongoDB 지원되지 않음

업데이트 성명서

SQL
카산드라 UPDATE; SQL과 동일
코스모스DB API 업데이트
카우치베이스 UPDATE; SQL과 동일
MongoDB db.t1.update()

병합: 한 관계(행 집합)를 다른 관계에 병합합니다.

SQL 행(문서) 집합을 다른 행으로 병합합니다.
카산드라 지원되지 않음
코스모스DB 지원되지 않음
카우치베이스 MERGE 문과 동일합니다.
MongoDB 지원되지 않음

준비 문

SQL 실행 계획을 파싱, 분석 및 생성합니다.
카산드라 지원됩니다. Java SDK.dd에 준비된Statement()의 예가 표시됩니다.
코스모스DB 지원되지 않음
카우치베이스 지원됨; 준비
MongoDB 지원되지 않음

실행

SQL 임시 또는 준비된 명세서를 실행합니다.
카산드라 Java에서 지원됩니다.
코스모스DB 지원되지 않음
카우치베이스 SQL과 유사하게 지원됩니다.
MongoDB 지원되지 않음

부여/취소

SQL 데이터 집합에 대한 특정 작업에 대한 권한 부여/취소
카산드라 부여, 취소
코스모스DB API 지원
카우치베이스 역할 부여, 역할 취소
MongoDB 미정?

설명 문

SQL 테이블의 스키마를 설명합니다.
카산드라 설명
코스모스DB 지원되지 않음
카우치베이스 INFER는 문서의 스키마를 설명합니다.
MongoDB 나침반 도구 - 그래픽 전용.

TRUNCATE 문

SQL 보안 또는 물리적 스키마를 변경하지 않고 테이블의 데이터를 잘라냅니다.
카산드라 잘라내기
코스모스DB 지원되지 않음
카우치베이스 플러시 작업
MongoDB 지원되지 않습니다. 컬렉션 제거를 통해 해결하고 동일한 보안 설정으로 다시 생성하세요.

값 논리(부울 값)

SQL 참, 거짓, NULL(알 수 없음)
카산드라 참, 거짓, NULL(알 수 없음)
코스모스DB 참, 거짓, NULL(알 수 없음)
카우치베이스 참, 거짓, NULL(알 수 없음), 누락됨

https://docs.couchbase.com/server/4.0/n1ql/n1ql-language-reference/booleanlogic.html

MongoDB 참, 거짓, NULL(알 수 없음)

쿼리 최적화 도구: 최적화 도구 유형

SQL 규칙 기반 및 비용 기반 최적화 도구. 쿼리 재작성, 인덱스 선택, 조인 순서, 조인 유형 선택 및 테이블러의 위치(내부/외부, 해시 테이블 빌드/프로브)를 수행합니다.
카산드라 규칙 기반 최적화 도구. 조인이 없으므로 단일 테이블에 대한 인덱스 선택이 수행됩니다.
코스모스DB 규칙 기반 최적화 도구는 주로 인덱스 선택을 수행합니다.
카우치베이스 규칙 기반 옵티마이저, 인덱스 선택. 기본적으로 중첩 루프 조인을 차단하지만 쿼리에서 사용자 힌트를 통해 해시 조인을 지원합니다.
MongoDB 문서에 따르면 "모양 기반" 최적화 프로그램입니다. 각각의 새로운 쿼리는 '모양'을 기반으로 하는 쿼리와 일치합니다. 쿼리가 처음 실행될 때 최적화 도구는 인덱스 선택을 수행하지만 후보가 여러 개 있는 경우 여러 쿼리를 동시에 실행하여 누가 먼저 결과를 반환하는지 확인합니다.

쿼리 최적화 도구: 인덱스 선택

SQL
카산드라
코스모스DB
카우치베이스
MongoDB

쿼리 최적화 도구: 쿼리 재작성

SQL 쿼리의 일부를 논리적으로 동등한 수준으로 재작성하여 성능을 개선합니다. 예: 하위 쿼리 재작성, 뷰 폴딩, 조인 유형 변환, 상수 식 평가 등.
카산드라 없음
코스모스DB 알려진 재작성 없음
카우치베이스 기본 쿼리 재작성. 해당되는 경우 좌측 외부에서 내부로, 상수 표현식 평가.
MongoDB 없음

쿼리 최적화: 조인 유형

SQL 사용 가능한 조인 유형 중에서 가장 효율적인 인덱스를 선택합니다.
카산드라 조인은 지원되지 않으므로 적용되지 않습니다.
코스모스DB 명확하게 문서화되어 있지 않습니다.
카우치베이스 기본적으로 중첩 루프입니다. 사용자 힌트로 해시 조인.
MongoDB 중첩 루프만 지원됩니다.

트랜잭션 지원.  

SQL 다중 행 및 다중 명세서 지원으로 ACID를 지원합니다.
카산드라 아니요
코스모스DB
카우치베이스 아니요
MongoDB 예, 4.0에서는

색인

SQL 쿼리 성능 속도를 높이기 위해 데이터 구조가 유지됩니다. 인덱스는 다음과 같습니다.
카산드라 기본, 보조, 배열 인덱스를 지원합니다. 검색 인덱스를 위해 SOLR에 데이터를 설치하고 색인을 생성해야 합니다.
코스모스DB 기본적으로 스칼라, 배열 등 모든 것을 색인화합니다. 검색 인덱스는 지원하지 않습니다.
카우치베이스 기본, 보조, 복합, 기능, 적응형, 검색, 공간, 분할 및 복제 인덱스를 지원합니다. 인덱스는 결국 일관성을 유지합니다.
MongoDB 기본, 보조, 복합, 검색, 공간, 파티션 및 복제 인덱스를 지원합니다. 검색 인덱스는 B-Tree에서 간단하게 생성됩니다.

SQL: 데이터 유형 지원.

SQL 광범위한 숫자, 문자, 날짜/시간 데이터 유형을 지원합니다.
카산드라 숫자, 십진수, 이중. 정수, 부동 소수점, varint, 타임스탬프, 컬렉션(집합, 목록)
코스모스DB JSON 데이터 유형: 숫자, 문자열, 부울, 객체, 배열
카우치베이스 JSON 데이터 유형: 숫자, 문자열, 부울, 객체, 배열
MongoDB JSON 데이터 유형: 타임스탬프 데이터 유형에 대한 숫자, 문자열, 부울, 객체, 배열 및 사용자 지정 확장자.

결론:

널리 사용되는 NoSQL 데이터베이스는 각 데이터 모델과 아키텍처를 위해 선언적 SQL을 확장하고 지원하려고 노력해 왔습니다. 따라서 평가 시 기능 및 아키텍처의 기능과 한계를 이해하는 것이 중요합니다.

참조:

  1. SQL의 불합리한 효율성

작성자

게시자 케샤브 머시

케샤브 머시는 Couchbase R&D의 부사장입니다. 이전에는 MapR, IBM, Informix, Sybase에서 근무했으며 데이터베이스 설계 및 개발 분야에서 20년 이상의 경력을 쌓았습니다. IBM Informix에서 SQL 및 NoSQL R&D 팀을 이끌었습니다. Couchbase에서 두 번의 President's Club 상을, IBM에서 두 번의 우수 기술 업적상을 수상했습니다. 인도 마이소르 대학교에서 컴퓨터 과학 및 공학 학사 학위를 받았으며, 10개의 미국 특허를 보유하고 있고 3개의 미국 특허를 출원 중입니다.

댓글 하나

  1. [...] 트랜잭션과 그 의미론. 쿼리 언어로서의 SQL은 NoSQL 데이터베이스 시스템에서도 비합리적으로 효과적이었습니다. 그러나 트랜잭션을 지원하는 NoSQL 데이터베이스 시스템은 거의 없습니다. 지원하는 시스템은 [...] 긴 [...] 트랜잭션을 지원합니다.

댓글 남기기