SQL은 오랫동안 사용되어 왔습니다. 구조화된 데이터를 처리하는 매우 직관적이고 효율적인 방법이며 수년 동안 데이터베이스를 위해 선택되어 왔습니다. 그러나 빅 데이터의 세계에서 데이터는 다음과 같은 특징을 가지고 있습니다. 속도, 다양성 그리고 볼륨. SQL은 2 "v"는 최적화에 문제가 없다: "속도" 및 "볼륨". 실제로 많은 새로운 SQL(N1QL, Spark, U-SQL, Impala, Drill 등)이 정확히 그렇게 하고 있습니다. 하지만 "다양성'는 다른 차원의 문제입니다! 빅 데이터는 예측할 수 없고 끊임없이 진화하며 들쭉날쭉한 체계, 희박한 값, 깊게 중첩된 구조 등 새로운 세계에서 복잡합니다. 이를 위해서는 SQL을 확장해야 합니다!
이러한 문제를 정확히 해결하기 위해 Couchbase Server 4에 N1QL을 구축했다는 소식을 전하게 되어 매우 기쁩니다! N1QL은 복잡한 데이터에 대한 사실상의 직렬화 표준인 JSON의 복잡한 구조를 쉽게 통과할 수 있습니다. N1QL을 사용하면 NULL뿐만 아니라 다음과 같은 속성으로 작업할 수 있습니다. 누락 을 다양한 형태의 JSON으로 처리할 수 있습니다. 또는 다음과 같은 연산자를 사용할 수 있습니다. 모든/모든 를 사용하여 JSON 문서에 포함된 배열을 쿼리할 수 있습니다. 또는 다음과 같은 명령을 사용할 수 있습니다. 언네스트 & 네스트 중첩 배열을 평평하게 하거나 평평하게 해제할 수 있습니다. 이러한 강력한 확장 기능이 너무 많아서 여기서는 언급하지 않겠습니다. 대신 원래 게시되었던 숨겨진 보석 하나를 보여드리겠습니다. 여기 에 의해 작성되었습니다. 이 보석은 N1QL을 사용하는 경우 집계에 매우 유용합니다. SQL Server와 같은 관계형 데이터베이스와 비교합니다.
N1QL의 가장 큰 장점 중 하나는 배열 유형을 이해하는 능력입니다. MAX()와 같은 집계 함수는 혁신적인 것은 아니지만 중첩과 배열을 추가하면 MAX()처럼 간단한 함수도 매우 강력해질 수 있습니다. 본격적으로 시작하기 전에 한 가지 주의할 점은 제가 과거 Microsoft에서 TSQL에 기여한 바가 있기 때문에 TSQL과 SQL Server에 대해 언급할 것입니다. 그러나 이것은 Oracle, Postgres, Mysql, Informix 또는 DB2 등에도 동일하게 적용됩니다: 최대 가격이 있는 제품의 속성을 찾으려고 한다고 상상해 보세요. SQL Server에서는 TSQL을 사용하여 작성하기 매우 간단한 쿼리입니다;
|
1 2 3 |
선택 productID, 이름 FROM t1 어디 가격 = (선택 MAX(가격) FROM t1) GO |
좋습니다. 결과는 다음과 같습니다. 가장 가격이 높은 제품은 ID가 3인 "c"라는 제품입니다.
|
1 2 3 4 |
productID 이름 ----------- ----------------------------------------------------------------- 3 c |
실행 계획은 다음과 같습니다. 기본적으로 실행 계획은 최대 가격 값을 검색합니다. 값을 찾으면 중첩 루프 조인을 사용하여 테이블에서 제품ID 및 이름과 같은 제품의 다른 속성을 검색합니다.
|
1 2 3 4 5 6 7 8 |
Stmt 텍스트 --------------------------------------------------------------------------------------------- 선택 productID, 이름 에서 t1 어디 가격 = (선택 최대(가격) 에서 t1) |--중첩 루프(내부 가입, 어디:([Expr1004]=[테스트].[dbo].[t1].[가격])) |--스트림 집계(정의:([Expr1004]=MAX([테스트].[dbo].[t1].[가격]))) | |--클러스터링 색인 스캔(객체:([테스트].[dbo].[t1].[PK__t1__2D10D14A7FD17868])) |--클러스터링 색인 스캔(객체:([테스트].[dbo].[t1].[PK__t1__2D10D14A7FD17868])) |
하지만 N1QL은 여기서 큰 장점이 있습니다. MAX()를 배열로 처리할 수 있기 때문에 추가 스캔 없이 문서의 모든 속성을 반환할 수 있습니다.
|
1 |
선택 MAX([가격, {productID, 이름]) FROM 테스트; |
또는 다음 쿼리를 사용하여 전체 문서를 간단히 반환할 수 있습니다;
|
1 |
선택 MAX([가격, 테스트]) FROM 테스트; |
N1QL 쿼리의 실행 계획을 살펴보겠습니다. 스포일러를 드리자면, MAX를 수행할 수 있는 단일 FETCH 연산이 표시되고 두 번째 FETCH 없이 투영이 수행됩니다.
|
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
cbq>설명 선택 MAX([가격,테스트])에서 테스트; { "요청ID":"b735ce5f-700c-4740-a065-6d4ba681129f", "서명":"json", "결과":[ { "#operator":"시퀀스", "~어린이":[ { "#operator":"PrimaryScan", "index":"#primary", "키스페이스":"test", "네임스페이스":"default", "사용":"gsi" }, { "#operator":"Parallel", "~어린이":{ "#operator":"시퀀스", "~어린이":[ { "#operator":"Fetch", "키스페이스":"test", "네임스페이스":"default" }, { "#operator":"InitialGroup", "집계":[ "max([(`테스트`.`가격`), `테스트`])" ], "group_keys":[] } ] } }, { "#operator":"IntermediateGroup", "집계":[ "max([(`테스트`.`가격`), `테스트`])" ], "group_keys":[] }, { "#operator":"FinalGroup", "집계":[ "max([(`테스트`.`가격`), `테스트`])" ], "group_keys":[] }, { "#operator":"Parallel", "~어린이":{ "#operator":"시퀀스", "~어린이":[ { "#operator":"InitialProject", "결과_기간":[ { "expr":"max([(`테스트`.`가격`), `테스트`])" } ] }, { "#operator":"FinalProject" } ] } } ] } ], "status":"성공", "metrics":{ "elapsedTime":"1.8224ms", "실행 시간":"1.7614ms", "resultCount":1, "결과 크기":2347 } } |
이것은 꽤 멋진 트릭이고 성능 향상에 큰 도움이 되지만, N1QL의 기능은 이제 막 표면을 드러낸 것일 뿐입니다. N1QL을 통해 발견할 수 있는 것이 훨씬 더 많습니다. 여기에서 Couchbase Server 및 N1QL을 시작할 수 있습니다. 시작하기 가이드.
———————————————————
SQL Server 2016 및 Couchbase 4에서 이 기능을 직접 사용해 보고 싶으시다면 다음 스크립트를 통해 직접 확인해 보세요;
SQL Server 스크립트
참고: "test"라는 데이터베이스에서 실행합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
create 테이블 t1(productID int 기본 키, 가격 int, 이름 varchar(128)); go 삽입 에 t1(productID,가격,이름) 값(1,10,'a'); 삽입 에 t1(productID,가격,이름) 값(2,9,'b'); 삽입 에 t1(productID,가격,이름) 값(3,12,'c'); 삽입 에 t1(productID,가격,이름) 값(4,11,'d'); 삽입 에 t1(productID,가격,이름) 값(5,1,'e'); go set 통계 프로필 on go 선택 최대(가격),productID,이름 에서 t1 go --Msg 8120, 레벨 16, 상태 1, 라인 10 --칼럼 't1.productID' 는 유효하지 않음 in 의 선택 목록 왜냐하면 it 는 not 포함 in 중 하나 an 집계 함수 또는 의 그룹 BY 절. 선택 productID, 이름 에서 t1 어디 가격 = (선택 최대(가격) 에서 t1) go |
다음은 Couchbase 서버 스크립트입니다.
참고: "test"라는 버킷을 만듭니다.
insert into test(key,value) values("1",{productID:1, price:10, name:'a'});
|
1 2 3 4 5 6 7 8 9 |
삽입 에 테스트(키,값) 값("1",{productID:1, 가격:10, 이름:'a'}); 삽입 에 테스트(키,값) 값("2",{"productID":2, "가격":9, "name":"b"}); 삽입 에 테스트(키,값) 값("3",{"productID":3, "가격":12, "name":"c"}); 삽입 에 테스트(키,값) 값("4",{"productID":4, "가격":11, "name":"d"}); 삽입 에 테스트(키,값) 값("5",{"productID":5, "가격":1, "name":"e"}); create 기본 색인 on 테스트; 선택 최대(가격, productID, 이름) 에서 t1; 선택 최대([가격, 테스트]) 에서 테스트; 설명 선택 최대([가격, 테스트]) 에서 테스트; |