작업 거부 필터로 느린 쿼리 차단
버전 8.0에 추가 되었습니다.
작업으로 인해 과도한 워크로드 가 발생하지 않도록 하려면 해당 쿼리 형태 와 관련된 모든 작업을 일시적으로 거부할 수 있습니다. 이렇게 하려면 setQuerySettings
를 사용하여 작업의 쿼리 형태 에 대해 reject
필드 를 true
로 설정하다 합니다. 거부된 쿼리 형태 는 작업 거부 필터하다 라고도 합니다.
쿼리 옵티마이저 쿼리 계획 중에 쿼리 설정을 추가 입력으로 사용하며, 이는 쿼리 를 실행 하기 위해 선택한 계획에 영향을 줍니다.
이 페이지의 단계에서는 예시 컬렉션 을 만들고 작업 거부 필터하다 를 사용하여 쿼리 형태 를 차단 합니다.
이 작업에 대하여
애플리케이션 에 비효율적인 쿼리 가 있어서 클러스터 에 과도한 워크로드 가 있다고 가정해 보겠습니다. 쿼리 가 클러스터 리소스를 과도하게 사용하지 않도록 하려면 작업 거부 필터하다 를 사용하여 쿼리 및 유사한 쿼리의 실행 을 차단 합니다.
시작하기 전에
비효율적인 쿼리 를 식별하려면 다음과 같은 다양한 방법을 사용하세요.
단계
예시 컬렉션 만들기
실행:
// 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" ) } ] )
작업 거부 필터하다 추가
다음 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, ... }
(선택 사항) 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 }, ... } ] } }
(선택 사항) 작업 거부 필터하다 제거
다음 예시 에서는 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" } } )
다음 단계
작업 거부 필터하다 를 사용하여 비효율적인 작업을 차단 한 후에는 클러스터 성능이 비효율적인 쿼리 가 도입되기 전의 상태로 돌아가야 합니다. 다음 단계:
쿼리 의 성능 문제를 해결합니다. 이를 위해서는 인덱스 또는 쿼리 재작성이 필요할 수 있습니다.
업데이트된 애플리케이션 을 배포합니다.
삭제되지 않은 쿼리 설정을 다시 활성화하려면 setQuerySettings
를 설정하다 하고 reject
필드 를 false
로 설정합니다.