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 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 consultas utiliza la configuración de la consulta como una entrada adicional durante la planificación de la consulta, lo que afecta el plan seleccionado para ejecutar la consulta.

Los pasos de esta página crean una colección de ejemplo y utilizan un filtro de rechazo de operaciones para bloquear una forma de consulta.

Supongamos que un clúster tiene una carga de trabajo excesiva porque una aplicación tiene una consulta ineficiente. Para evitar que la consulta consuma demasiados recursos del clúster, utilice un filtro de rechazo de operaciones para bloquear la ejecución de la consulta y de consultas similares.

Para identificar una consulta ineficiente, utilice varios métodos que incluyen:

  • Supervisión de Atlas

  • Alertas de Atlas

  • Perfilador del query de Atlas

  • Mensajes de registro

Nota

No se puede establecer un filtro de rechazo de operaciones en los clústeres Atlas Free o 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

Ejecute 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 la configuración de la consulta.

  • settings que rechazan la forma de consulta.

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 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

explainEjecutar:

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 consulta:

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

La siguiente salida verifica que la consulta fue rechazada:

MongoServerError: Query rejected by admin query settings
5

Para enumerar todos los filtros de rechazo de operaciones, utilice las $querySettings etapas y en una agregación. En el siguiente ejemplo de agregación:$match

  • El showDebugQueryShape campo es true en la $querySettings etapa, que devuelve una versión de depuración de la forma de la consulta. Para más detalles, consulte las estadísticas de la forma de la consulta.

  • La etapa $match filtra las configuraciones de consulta para mantener aquellas en las que settings.reject está establecido en true, lo que corresponde a los filtros de rechazo de operaciones.

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 puede eliminar un filtro de rechazo de operaciones mediante una forma de consulta. 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 se elimina el filtro de rechazo de operaciones, la siguiente consulta se desbloquea y ahora se ejecuta:

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

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:

  1. Resuelva el problema de rendimiento de la consulta. Esto podría requerir un índice o una reescritura de la consulta.

  2. Implementar 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.

Volver

Supervisar queries lentas

En esta página