Nuevo en la versión 8.0.
Para evitar que una operación provoque una carga de trabajo excesiva, puede rechazar temporalmente todas las operaciones asociadas con esa operación. Forma de consulta. Para ello, utilice setQuerySettingspara establecer el reject campo en true para la forma de consulta de la operación. Una forma de consulta rechazada también se conoce como filtro de rechazo de operaciones.
El optimizador de query utiliza la configuración del query como entrada adicional durante la planificación del query, lo que afecta al plan seleccionado para ejecutar el query.
Los pasos en esta página crean una colección de ejemplo y utilizan un filtro de rechazo de operación para bloquear una forma del query.
Acerca de esta tarea
Supón que un clúster tiene una carga de trabajo excesiva porque una aplicación tiene una query ineficiente. Para evitar que la query consuma excesivos recursos del clúster, utilice un filtro de rechazo de operaciones para bloquear la query y otras similares de que se ejecuten.
Antes de comenzar
Para identificar una consulta ineficiente, utilice varios métodos que incluyen:
Nota
No se puede establecer un filtro de rechazo de operaciones en los clústeres Atlas Free o Flex.
Pasos
Crear la colección de ejemplo
Ejecuta:
// 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" ) } ] )
Agregar un filtro de rechazo de operaciones
Ejecuta el siguiente comando setQuerySettings para agregar un filtro de rechazo de operaciones con estos campos:
findcon un filtro y una clasificación, que define la forma del query.$dbcon la base de datos para los ajustes de consultas.settingsque rechazan la forma del query.
db.adminCommand( { setQuerySettings: { find: "pizzaOrders", filter: { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } }, sort: { totalNumber: 1 }, $db: "test" }, settings: { reject: true } } )
La siguiente salida truncada muestra que el valor del campo queryShapeHash y el campo settings reject es 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, ... }
(Opcional) Utilice el comando explicar para confirmar la configuración
Ejecute explain:
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )
La siguiente salida truncada muestra que el campo querySettings reject está 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 }, ... } ] } }
(Opcional) Enumerar todos los filtros de rechazo de operaciones
Para listar todos los filtros de rechazo de operaciones, utiliza las etapas $querySettings y $match en una agregación. En el siguiente ejemplo de agregación:
El
showDebugQueryShapecampo estátrueen la etapa$querySettings, lo que devuelve una versión de depuración de la forma del query. Para obtener detalles, consulta estadísticas de forma del query.La etapa
$matchfiltra la configuración de la query para mantener aquellas en las quesettings.rejectesté configurado entrue, lo que corresponde a los filtros de rechazo de la operación.
Ejemplo de agregación:
db.aggregate( [ { $querySettings: { showDebugQueryShape: true } }, { $match: { "settings.reject": true } } ] )
Salida:
[ { 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 } } } ]
(Opcional) Eliminar el filtro de rechazo de operaciones
El siguiente ejemplo utiliza removeQuerySettings para remover el filtro de rechazo de operaciones, que se identifica utilizando el valor queryShapeHash de la salida mostrada en el paso 2 anterior:
db.adminCommand( { removeQuerySettings: "AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1" } )
También puedes obtener el valor queryShapeHash de:
También puedes eliminar un filtro de rechazo de operación utilizando una forma del query. Por ejemplo:
db.adminCommand( { removeQuerySettings: { find: "pizzaOrders", filter: { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } }, sort: { totalNumber: 1 }, $db: "test" } } )
Próximos pasos
Tras bloquear una operación ineficiente mediante un filtro de rechazo de operaciones, el rendimiento del clúster debería volver al nivel anterior a la introducción de la consulta ineficiente. Próximos pasos:
Resuelva el problema de rendimiento de la consulta. Esto podría requerir un índice o una reescritura de la consulta.
Implemente la aplicación actualizada.
Para volver a habilitar las configuraciones de consulta que no se eliminaron, use setQuerySettings y configure el campo reject en false.