ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs Menu

작업 거부 필터로 느린 쿼리 차단

버전 8.0에 추가 되었습니다.

작업으로 인해 과도한 워크로드 가 발생하지 않도록 하려면 해당 쿼리 형태 와 관련된 모든 작업을 일시적으로 거부할 수 있습니다. 이렇게 하려면 setQuerySettings 를 사용하여 작업의 쿼리 형태 에 대해 reject 필드 를 true 로 설정하다 합니다. 거부된 쿼리 형태 는 작업 거부 필터하다 라고도 합니다.

쿼리 옵티마이저 쿼리 계획 중에 쿼리 설정을 추가 입력으로 사용하며, 이는 쿼리 를 실행 하기 위해 선택한 계획에 영향을 줍니다.

이 페이지의 단계에서는 예시 컬렉션 을 만들고 작업 거부 필터하다 를 사용하여 쿼리 형태 를 차단 합니다.

애플리케이션 에 비효율적인 쿼리 가 있어서 클러스터 에 과도한 워크로드 가 있다고 가정해 보겠습니다. 쿼리 가 클러스터 리소스를 과도하게 사용하지 않도록 하려면 작업 거부 필터하다 를 사용하여 쿼리 및 유사한 쿼리의 실행 을 차단 합니다.

비효율적인 쿼리 를 식별하려면 다음과 같은 다양한 방법을 사용하세요.

참고

Atlas 또는 Flex 클러스터에서는 작업 거부 필터하다 설정하다 M0 수 없습니다.

1

실행:

// Create pizzaOrders collection
db.pizzaOrders.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 19,
totalNumber: 10, orderDate: ISODate( "2023-03-13T08:14:30Z" ) },
{ _id: 1, type: "pepperoni", size: "medium", price: 20,
totalNumber: 20, orderDate: ISODate( "2023-03-13T09:13:24Z" ) },
{ _id: 2, type: "pepperoni", size: "large", price: 21,
totalNumber: 30, orderDate: ISODate( "2023-03-17T09:22:12Z" ) },
{ _id: 3, type: "cheese", size: "small", price: 12,
totalNumber: 15, orderDate: ISODate( "2023-03-13T11:21:39.736Z" ) },
{ _id: 4, type: "cheese", size: "medium", price: 13,
totalNumber: 50, orderDate: ISODate( "2024-01-12T21:23:13.331Z" ) },
{ _id: 5, type: "cheese", size: "large", price: 14,
totalNumber: 10, orderDate: ISODate( "2024-01-12T05:08:13Z" ) },
{ _id: 6, type: "vegan", size: "small", price: 17,
totalNumber: 10, orderDate: ISODate( "2023-01-13T05:08:13Z" ) },
{ _id: 7, type: "vegan", size: "medium", price: 18,
totalNumber: 10, orderDate: ISODate( "2023-01-13T05:10:13Z" ) }
] )
2

다음 setQuerySettings 명령을 실행하여 이러한 필드가 포함된 작업 거부 필터하다 를 추가합니다.

  • find 을 필터하다 및 정렬로 변환하여 쿼리 형태 를 정의합니다.

  • $db 을(를) 쿼리 설정에 대한 데이터베이스 로 변환합니다.

  • 쿼리 형태 를 거부하는 settings .

db.adminCommand( {
setQuerySettings: {
find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"
},
settings: {
reject: true
}
} )

다음 잘린 출력은 queryShapeHash 필드 값과 settings reject 필드 가 true 임을 보여줍니다.

{
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1',
settings: { reject: true },
representativeQuery: {
find: 'pizzaOrders',
filter: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
sort: { totalNumber: 1 },
'$db': 'test'
},
ok: 1,
...
}
3

explain 를 실행합니다.

db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate(
"2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

다음 잘린 출력은 querySettings reject 필드 가 true 임을 보여줍니다.

{
queryPlanner: {
winningPlan: {
stage: 'SINGLE_SHARD',
shards: [
{
explainVersion: '1',
...
namespace: 'test.pizzaOrders',
parsedQuery: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
querySettings: { reject: true },
...
}
]
}
}
4

이 쿼리 를 실행 해 봅니다.

db.pizzaOrders.find( { orderDate: {
$gt: ISODate("2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

다음 출력은 쿼리 가 거부되었는지 확인합니다.

MongoServerError: Query rejected by admin query settings
5

모든 작업 거부 필터를 나열하려면 집계 $querySettings 에서 및 $match 단계를 사용합니다. 다음 집계 예시:

  • 필드 단계에서 showDebugQueryShape true 이며,$querySettings 쿼리 형태 의 디버그 버전을 반환합니다. 자세한 내용은 쿼리 형태 통계를 참조하세요.

  • $match 단계에서는 settings.reject 가 작업 거부 필터에 해당하는 true로 설정하다 상태를 유지하도록 쿼리 설정을 필터링합니다.

애그리게이션 예시:

db.aggregate( [
{ $querySettings: { showDebugQueryShape: true } },
{ $match: { "settings.reject": true } }
] )

출력:

[
{
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1',
settings: { reject: true },
representativeQuery: {
find: 'pizzaOrders',
filter: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
sort: { totalNumber: 1 },
'$db': 'test'
},
debugQueryShape: {
cmdNs: { db: 'test', coll: 'pizzaOrders' },
command: 'find',
filter: { orderDate: { '$gt': '?date' } },
sort: { totalNumber: 1 }
}
}
]
6

다음 예시 에서는 removeQuerySettings 를 사용하여 이전 2 단계에 표시된 출력에서 queryShapeHash 값으로 식별되는 작업 거부 필터하다 를 제거 합니다.

db.adminCommand( {
removeQuerySettings: "AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1"
} )

다음에서 queryShapeHash 값을 가져올 수도 있습니다.

쿼리 형태 를 사용하여 작업 거부 필터하다 를 제거 할 수도 있습니다. 예를 예시 다음과 같습니다.

db.adminCommand( {
removeQuerySettings: {
find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"
}
} )
7

작업 거부 필터하다 가 제거되었으므로 다음 쿼리 가 차단 해제되고 이제 실행됩니다.

db.pizzaOrders.find( { orderDate: {
$gt: ISODate("2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

작업 거부 필터하다 를 사용하여 비효율적인 작업을 차단 한 후에는 클러스터 성능이 비효율적인 쿼리 가 도입되기 전의 상태로 돌아가야 합니다. 다음 단계:

  1. 쿼리 의 성능 문제를 해결합니다. 이를 위해서는 인덱스 또는 쿼리 재작성이 필요할 수 있습니다.

  2. 업데이트된 애플리케이션 을 배포합니다.

삭제되지 않은 쿼리 설정을 다시 활성화하려면 setQuerySettings 를 설정하다 하고 reject 필드 를 false 로 설정합니다.