의 출시를 발표하게 되어 기쁘게 생각합니다:
카우치베이스 인덱스 어드바이저 서비스
https://index-advisor.couchbase.com
또 다른 서비스? 왜요?
몇 년 전, SQL을 사용해 JSON 데이터를 검색하고 조작할 수 있도록 N1QL(SQL for JSON)을 출시했습니다. 하지만 좋은 인덱스가 생성되지 않으면 쿼리 성능이 좋지 않습니다! 생성한 인덱스가 쿼리 엔진에 적합한 인덱스인지 어떻게 알 수 있을까요? 그래서 우리는 좋은 인덱스를 만드는 모든 규칙을 공개하기로 결정했습니다. 그러나 그것은 너무 많은 읽기를 필요로 했습니다! 그래서 한 걸음 더 나아가 사용자에게 힘을 실어드리고자 합니다. 이제 서비스를 출시합니다.인덱스 어드바이저-는 쿼리를 수락하고 쿼리 엔진의 기대치를 충족하는 인덱스 추천을 제공하는데, 이 모든 것이 최신 Couchbase 서버를 다운로드하지 않고도 가능합니다.
누구를 위해?
이 서비스는 DBA, 개발자, 아키텍트가 쿼리 성능을 최적화하고 SLA를 충족하는 데 도움이 되는 인덱스 권장 사항을 제공합니다.
Index Advisor는 Couchbase Server 6.5의 일부로 출시되었습니다. 해당 버전을 다운로드했다면 이 서비스가 제공하는 모든 기능(그리고 그 이상)을 사용할 수 있습니다.
이 서비스는 언제 사용해야 하나요?
만약 당신이:
- 읽지 않으려면 인덱스 생성 규칙를 살펴보고, 이를 이해하고, 구현하여 쿼리/질문/워크로드에 적합한 인덱스를 찾아보세요.
- 아직 최신 Couchbase 6.5 서버를 다운로드하고 싶지 않습니다.
- 사용 중입니다. 이전 카우치베이스 버전 쿼리에 적합한 인덱스를 만드는 데 도움이 필요합니다.
- 인덱스에 대한 조언을 생성하고 싶습니다. 버킷을 만들지 않고 또는 스키마 또는 데이터를 업로드합니다.
배경:
N1QL은 JSON 데이터 및 메타데이터용 SQL입니다. N1QL로 작성된 모든 쿼리에는 N1QL 쿼리 엔진에 의해 준비된 쿼리 계획이 있습니다. 쿼리의 성능과 효율성은 쿼리 계획에 따라 달라집니다. 데이터에 적합한 인덱스를 생성하면 가장 효율적인 방식으로 결과 집합을 검색할 수 있는 인덱스를 선택하는 데 도움이 됩니다. JSON 문서 자체에는 스키마가 없더라도 인덱스에는 스키마가 있어야 합니다.
예: 인덱스 ix1(field1,field2) 는 인덱스와 다릅니다. ix2(field2,field1).
따라서 인덱스에 대해 선택하는 필드도 중요하지만, 인덱스에 포함되는 순서도 GSI 인덱스에 중요합니다. (FTS 인덱스에 대해서는 다른 블로그에서 다룰 예정입니다.)
쿼리의 수명:
4단계가 얼마나 잘 수행되느냐에 따라 5단계와 6단계를 최소화하거나 완전히 생략하여 쿼리 성능을 향상시킬 수 있으므로 인덱스의 필드를 결정하는 것은 매우 중요한 부분입니다. 이를 돕기 위해 Index Advisor를 출시합니다.
https://index-advisor.couchbase.com
인덱스 어드바이저 - 서비스!
인덱스 어드바이저를 사용하면 다음을 수행할 수 있습니다.
- 다음에서 쿼리 하나 또는 여러 개의 쿼리를 제공하세요. 6.5 이전 서버도 를 입력하면 서비스가 최상의 성능을 얻기 위해 보유하거나 생성해야 하는 인덱스를 추천해 드립니다.
- 데이터나 스키마가 없기 때문에 현재 해당 인덱스가 있는지 확인할 수 없습니다. 데이터/통계/스키마/추론 연산/현재 인덱스 또는 더 나은 추천을 위해 제공할 수 있는 다른 모든 것을 허용하도록 이 인터페이스를 곧 개선할 예정입니다.
ADVISE 지시어로 쿼리를 입력하면 도구에서 최소 인덱스와 커버링 인덱스에 대한 권장 사항을 제공합니다.
- 인덱스: 이 섹션에는 WHERE/ON 절의 술어를 기반으로 하는 권장 인덱스와 각 인덱스가 따르는 해당 권장 규칙이 나열되어 있습니다.
- 커버링 인덱스: 이 섹션에는 입력 쿼리에 적용 가능한 커버링 인덱스, 즉 데이터 서비스로의 추가 홉을 피하기 위해 쿼리에서 참조된 모든 필드를 포함하는 인덱스가 나열되어 있습니다.
도구의 모양과 느낌은 다음과 같습니다. 아래 GIF를 클릭하면 명확하게 확인할 수 있습니다.
예시:
1.
|
1 |
조언 선택 fname, 나이, 나이/7 AS age_dog_years FROM 시험판 어디 fname = 'Sara' |
|
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 |
{ "결과": [ { "#operator": "조언", "조언": { "#operator": "IndexAdvice", "adviseinfo": [ { "권장_인덱스": { "커버링_인덱스": [ { "index_statement": "`trial`(`fname`,`age`)에 `adv_fname_age` 인덱스 생성", "키스페이스_알리어스": "trial" } ], "인덱스": [ { "index_statement": "`trial`(`fname`)에 인덱스 adv_fname 생성", "키스페이스_알리어스": "trial", "추천_규칙": "인덱스 키는 술어 유형의 순서를 따릅니다: 2. 같음/없음/누락." } ] } } ] }, "query": "SELECT fname, age, age/7 AS age_dog_years FROM trial WHERE fname = 'Sara'" } ] } |
2.
|
1 2 |
조언 선택 (DISTINCT 구매.customerId)FROM 구매 어디 구매.구입처 사이 "2014-03-01" AND "2014-03-31" |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "결과": [ { "#operator": "조언", "조언": { "#operator": "IndexAdvice", "adviseinfo": [ { "권장_인덱스": { "인덱스": [ { "index_statement": "`purchases`(`purchasedAt`) 상에 인덱스 adv_purchasedAt 생성", "키스페이스_알리어스": "구매", "추천_규칙": "인덱스 키는 술어 유형의 순서를 따릅니다: 4. 이하/사이/보다 크지 않음." } ] } } ] }, "query": "SELECT (DISTINCT purchases.customerId) \nFROM purchases\nWHERE purchases.purchasedAt \"2014-03-01\"에서 \"2014-03-31\" 및 \"2014-03-31\"" } ] } |
3.
|
1 2 3 4 |
조언 선택 DISTINCT 항공사.이름,공항.이름 AS 공항,경로.거리 FROM `여행-샘플` 공항 INNER JOIN `여행-샘플` 경로 켜기 공항.faa = 경로.소스공항 AND 경로.유형 = "경로" INNER JOIN `여행-샘플` 항공사 켜기 경로.항공사 = 항공사.iATA AND 항공사.유형 = "항공사" |
|
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 |
{ "결과": [ { "#operator": "조언", "조언": { "#operator": "IndexAdvice", "adviseinfo": [ { "권장_인덱스": { "커버링_인덱스": [ { "index_statement": "`travel-sample`(`유형`,`출발공항`,`항공사`,`거리`) ON `adv_type_sourceairport_airline_distance` 인덱스 생성", "키스페이스_알리어스": "travel-sample_route" }, { "index_statement": "`travel-sample`(`유형`,`iata`,`이름`) 상에 인덱스 adv_type_iata_name 생성", "키스페이스_알리어스": "travel-sample_airline" } ], "인덱스": [ { "index_statement": "`travel-sample`(`유형`,`출발공항`) ON `adv_type_sourceairport` 인덱스 생성", "키스페이스_알리어스": "travel-sample_route", "추천_규칙": "인덱스 키는 술어 유형의 순서를 따릅니다: 2. 같음/없음/누락, 10. 비정적 조인 술어." }, { "index_statement": "`travel-sample`(`유형`,`iata`) ON `adv_type_iata` 인덱스 생성", "키스페이스_알리어스": "travel-sample_airline", "추천_규칙": "인덱스 키는 술어 유형의 순서를 따릅니다: 2. 같음/없음/누락, 10. 비정적 조인 술어." } ] } } ] }, "query": "SELECT DISTINCT airline.name,airport.name AS airport,route.distance FROM `travel-sample` airport INNER JOIN `travel-sample` route ON airport.faa = route.sourceairport AND route.type = \"route\"\nINNER JOIN `travel-sample` airline ON route.airline = airline.iata AND airline.type = \"airline\"\nWHERE airport.type = \"airport\" AND airport.city = \"San Jose\";" } ] } |
4.
|
1 2 3 |
선택 어드바이저(["SELECT * FROM `travel-sample` WHERE type = 'hotel' AND city = 'Paris'", "SELECT * FROM `travel-sample` h JOIN `travel-sample` a ON a.city = h.city WHERE h.type = 'hotel' AND a.type = 'airport'"]) |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "결과": [ { "$1": { "권장_인덱스": [ { "index": "`travel-sample`(`유형`,`도시`) ON `adv_type_city` 인덱스 생성", "진술": [ { "run_count": 1, "진술": "SELECT * FROM `travel-sample` WHERE type = 'hotel' AND city = 'Paris'" }, { "run_count": 1, "진술": "SELECT * FROM `travel-sample` h JOIN `travel-sample` a ON a.city = h.city WHERE h.type = 'hotel' AND a.type = 'airport'" } ] } ] } } ] } |
인덱스 후보가 지정된 디자인 규칙에 따라 생성됩니다. 여기.
남은 과제
1. 이 도구의 UI를 개선합니다. 쉽게 잘라내어 붙여넣을 수 있도록 색인 추천을 텍스트로 제공합니다. 현재 JSON 출력을 제공합니다.
2. 취향 수락 - 부분적인 인덱스 추천을 생성할 수 있도록 합니다.
3. 사용자가 스키마, 기존 인덱스를 입력하고, 출력을 추론하고, 데이터를 테스트할 수 있는 방법을 제공하세요.
이 도구가 어떤 점이 마음에 들었는지, 추가되었으면 하는 기능이 있는지 여러분의 의견을 듣고 싶습니다. 댓글을 통해 의견을 공유해 주세요.
인덱스 어드바이저 기능에 대해 자세히 알아보세요:
https://www.couchbase.com/blog/n1ql-index-advisor-improve-query-performance-and-productivity/
https://www.couchbase.com/blog/index-advisor-for-query-workload/
https://docs.couchbase.com/server/6.5/n1ql/n1ql-language-reference/advise.html
https://docs.couchbase.com/server/6.5/n1ql/n1ql-language-reference/advisor.html
https://docs.couchbase.com/server/6.5/tools/query-workbench.html#index-advisor
요약:
인덱스 어드바이저(ADVISE 문)는 단일 쿼리에 대한 인덱스 권장 사항을 제공합니다. 일반 인덱스, 배열 인덱스, 커버링 인덱스에 대해 조언하고 각 인덱스 키가 따르는 해당 추천 규칙에 대한 정보를 제공합니다.
인덱스 어드바이저(ADVISOR 문)는 여러 쿼리에 대한 인덱스 권장 사항을 제공합니다. 배열의 모든 쿼리에 적합한 인덱스를 가능한 한 적게 추천합니다.
집에서도 시도해 보세요!
https://index-advisor.couchbase.com
