Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Bloquear consultas lentas con filtros de rechazo de operaciones

Nuevo en la versión 8.0.

Para evitar que una operación cause una carga de trabajo excesiva, puedes rechazar temporalmente todas las operaciones asociadas con esa forma del query. Para hacerlo, utiliza setQuerySettings para establecer el campo reject en true para la forma del query de la operación. Una forma del query rechazada también se conoce como un filtro de rechazo de operación.

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.

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.

Para identificar una query ineficiente, utiliza varios métodos que incluyen:

  • Supervisión de Atlas

  • Alertas de Atlas

  • Perfilador del query de Atlas

  • Mensajes de registro

Nota

No puedes establecer un filtro de rechazo de operaciones en Atlas Free o clústeres Flex.

1

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" ) }
] )
2

Ejecuta el siguiente comando setQuerySettings para agregar un filtro de rechazo de operaciones con estos campos:

  • find con un filtro y una clasificación, que define la forma del query.

  • $db con la base de datos para los ajustes de consultas.

  • settings que 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,
...
}
3

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 },
...
}
]
}
}
4

Intente ejecutar esta query:

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

La siguiente salida verifica que la query se rechaza:

MongoServerError: Query rejected by admin query settings
5

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 showDebugQueryShape campo está true en 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 $match filtra la configuración de la query para mantener aquellas en las que settings.reject esté configurado en true, 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 }
}
}
]
6

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"
}
} )
7

Debido a que el filtro de rechazo de operaciones se elimina, la siguiente query se desbloquea y ahora se ejecuta:

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

Después de bloquear una operación ineficiente utilizando un filtro de rechazo de operaciones, el rendimiento de tu clúster debería volver al estado en que se encontraba antes de que se introdujera la query ineficiente. Siguientes pasos:

  1. Soluciona el problema de rendimiento con la query. Esto puede requerir un índice o una reescritura de query.

  2. Implemente la aplicación actualizada.

Para volver a habilitar la configuración de query que no se han borrado, usa setQuerySettings y establece el campo reject como false.

Volver

Supervisar queries lentas

En esta página