이제 Cosmos DB는 Cosmos DB 쿼리 언어를 사용하여 더 빠르고 효율적인 쿼리를 작성할 수 있도록 설계된 쿼리 관리자를 제공합니다. 성능, 비용 또는 확장성을 최적화하든 관계없이 Query Advisor는 Azure 및 Microsoft Fabric에서 데이터를 최대한 활용할 수 있도록 실행 가능한 권장 사항을 제공합니다.
쿼리 최적화가 중요한 이유
Cosmos DB(Azure 및 패브릭)에 대한 쿼리 언어는 유연하므로 개발자는 친숙한 SQL과 유사한 구문을 사용하여 JSON 데이터를 쿼리할 수 있습니다. 애플리케이션의 복잡성이 증가함에 따라 쿼리 구조의 작은 차이는 성능 및 RU(요청 단위)에 큰 영향을 미칠 수 있습니다.
예를 들어 동일한 결과를 반환하는 두 쿼리는 조건자가 작성되는 방법과 인덱스가 적용되는 방식에 따라 효율성이 크게 다를 수 있습니다.
Query Advisor는 쿼리를 분석하고 대상 권장 사항을 제공하여 다음을 지원합니다.
- 비효율적인 식 또는 불필요한 필터를 식별하여 RU 비용을 줄입니다.
- 최적의 쿼리 구조를 통해 쿼리 성능을 향상시킵니다.
- 명확하고 개발자 친화적인 언어로 작성된 설명과 함께 각 제안 뒤에 있는 "이유"를 이해합니다.
작동 방식
쿼리를 실행하면 쿼리 관리자가 쿼리 계획을 실행하여 높은 RU 사용량, 과도한 검사 또는 잠재적으로 불필요한 처리를 유발할 수 있는 패턴을 평가합니다. 그런 다음 쿼리의 어느 부분이 성능을 제한할 수 있음을 나타내는 권장 사항 집합을 반환하고 도움이 될 수 있는 잠재적인 변경 내용을 제안합니다.
쿼리 관리자 사용
속성을 QueryRequestOptionstrue로 설정하여 쿼리 관리자 기능을 사용하도록 설정할 PopulateQueryAdvice 수 있습니다. 지정하지 않으면 기본값은 PopulateQueryAdvice .입니다 false. 조언에 액세스하려면 문자열 속성을 FeedResponse.QueryAdvice사용합니다.
중요합니다
Query Advisor는 Cosmos DB용 .NET SDK에서만 작동합니다. 쿼리 조언은 첫 번째 왕복에서만 반환됩니다. 후속 연속 호출에서는 조언을 사용할 수 없습니다.
다음 예제 쿼리를 고려합니다.
SELECT VALUE
r.id
FROM
root r
WHERE
CONTAINS(r.name, 'Abc')
다음은 이 쿼리를 수행하고 쿼리 관리자를 사용하는 SDK 요청의 예입니다.
using Microsoft.Azure.Cosmos;
CosmosClient client = new("<connection-string>");
Container container = client.GetContainer("<database-name>", "<container-name>");
string query = """
SELECT VALUE
r.id
FROM
root r
WHERE
CONTAINS(r.name, 'Abc')
""";
QueryRequestOptions requestOptions = new()
{
PopulateQueryAdvice = true
};
using FeedIterator<dynamic> itemQuery = container.GetItemQueryIterator<dynamic>(
query,
requestOptions: requestOptions);
string? queryAdvice = null;
while (itemQuery.HasMoreResults)
{
if (queryAdvice is not null)
{
break;
}
FeedResponse<dynamic> page = await itemQuery.ReadNextAsync();
queryAdvice = page.QueryAdvice;
}
Console.WriteLine(queryAdvice);
이 요청은 다음의 단일 조언 문을 반환합니다.QA1002
QA1002: If you are matching on a string prefix, consider using STARTSWITH. [...]
쿼리 조언에는 세 가지 중요한 정보가 포함되어 있습니다.
-
쿼리 조언 ID:
QA1002 -
조언 설명: 이 예제에서는
If you are matching on a string prefix, consider using STARTSWITH. - 설명서에 대한 링크: 자세한 지침에 대한 URL
비고
설명서에 대한 링크는 이 예제에서 생략되었습니다.
예시
쿼리 관리자를 사용할 수 있는 시나리오의 다음 예제를 고려해 보세요.
시스템 함수 사용 최적화
함수가 사용되는 이 예제를 GetCurrentTimestamp 고려합니다.
SELECT
GetCurrentTicks()
FROM
container c
WHERE
GetCurrentTimestamp() > 10
이 예제에는 쿼리 관리자 QA1008 가 반환하는 두 가지 조언이 있습니다 QA1009. 각 조언은 문자열 출력의 새 줄로 구분됩니다.
QA1009: Consider using GetCurrentTimestampStatic instead of GetCurrentTimestamp in the WHERE clause. [...]
QA1008: Consider using GetCurrentTicksStatic instead of GetCurrentTicks in the WHERE clause. [...]
이 조언을 사용하여 쿼리를 다음 대안으로 다시 작성할 수 있습니다.
SELECT
GetCurrentTicksStatic()
FROM
container c
WHERE
GetCurrentTimestampStatic() > 10