Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Pianificatore di query v2
Il nuovo pianificatore di query per Amazon DocumentDB (planner versione 2.0) offre funzionalità avanzate di ottimizzazione delle query e prestazioni migliorate. La versione 2.0 di Planner per Amazon DocumentDB 5.0 offre un miglioramento delle prestazioni fino a 10 volte rispetto alla versione precedente durante l'utilizzo e gli operatori con indici. find update I miglioramenti delle prestazioni derivano principalmente dall'utilizzo di piani di indicizzazione più ottimali e dall'abilitazione del supporto per la scansione degli indici per operatori come gli operatori di negazione (,) e nested. $neq $nin $elementMatch Le query della versione 2.0 di Planner vengono eseguite più velocemente grazie a migliori tecniche di stima dei costi, algoritmi ottimizzati e maggiore stabilità. La versione 2.0 di Planner supporta anche le API di filtro della cache del piano, il che migliora la stabilità del pianificatore. Con questa funzionalità, Amazon DocumentDB 5.0 offre ora la possibilità di scegliere tra diverse versioni di Query Planner.
Prerequisiti
I seguenti prerequisiti si applicano alla versione 2.0 di Planner:
La versione 2.0 di Planner è disponibile Regioni AWS ovunque sia disponibile la versione 5.0 del motore.
Per scegliere di utilizzare la versione 2.0 come pianificatore di query predefinito, il cluster deve utilizzare la patch del motore versione 3.0.15902 o successiva di Amazon DocumentDB versione 5.0. Per i passaggi per l'aggiornamento alla patch della versione più recente del motore, consulta. Esecuzione di un aggiornamento della patch alla versione del motore di un cluster
Per impostare la versione 2.0 di Planner come Query Planner predefinito, sono necessarie le autorizzazioni IAM per aggiornare i gruppi di parametri del cluster.
Per Amazon DocumentDB 8.0, la versione 3.0 di planner è il pianificatore di query predefinito. Per informazioni dettagliate, vedi Pianificatore di query v3.
Selezione della versione 2.0 del planner come pianificatore di query predefinito
Utilizza i passaggi seguenti per selezionare 2.0 come pianificatore di query predefinito dalla console o dalla CLI:
Segui i passaggi indicati Modifica dei parametri del cluster Amazon DocumentDB per modificare il gruppo di parametri del cluster.
Per il parametro denominato 'PlannerVersion', modifica il valore in 2.0, indicando la versione 2.0 di Planner.
Seleziona Applica immediatamente (selezionando Applica al riavvio la selezione sarà inefficace fino al successivo riavvio del cluster).
Best practice
Per ottenere i risultati previsti, utilizza le seguenti best practice quando applichi la versione 2.0 di Planner:
In un cluster globale, seleziona lo stesso plannerVersion valore (1.0 o 2.0) nei gruppi di parametri del cluster per entrambe le regioni. Tieni presente che la selezione di versioni diverse del planner nelle regioni primarie e secondarie può causare comportamenti e prestazioni delle query non coerenti.
L'aggiornamento alla versione 2.0 di Planner durante una finestra di manutenzione programmata o durante i periodi di traffico ridotto sarà il meno problematico, in quanto potrebbe verificarsi un aumento dei tassi di errore se la versione del pianificatore viene modificata quando i carichi di lavoro sono in esecuzione attiva.
La versione 2.0 di Planner funziona in modo ottimale con la versione 5.0 della shell MongoDB.
Limitazioni
Le seguenti limitazioni si applicano alla versione 2.0 di Planner:
La versione 2.0 di Planner non è supportata nei cluster elastici, che torneranno alla versione 1.0 di Planner.
La versione 2.0 di Planner non è supportata per l'aggregazione e i comandi distinti, che ricadranno nella versione 1.0 di Planner.
Su alcune forme di interrogazione non è possibile impostare un filtro della cache del piano. Per l'elenco corrente, vedereForme di interrogazione supportate.
Miglioramenti agli operatori di ricerca e aggiornamento
La versione 2.0 di Planner ottimizza le operazioni fondamentali tra cuifind, updatedelete, e find-and-modify comandi. Le seguenti sezioni a schede mostrano funzionalità avanzate per gli indici, nonché i miglioramenti delle prestazioni delle query con la versione 2.0 di Planner:
- Enhanced index support
-
La versione 2.0 di Planner aggiunge il supporto agli indici per gli operatori di negazione$nin, tra cui,, e $ne$not {eq}, oltre a e. $not {in} $type $elemMatch
Sample Document: { "x": 10, "y": [1, 2, 3] }
db.foo.createIndex({ "x": 1, "y": 1 })
db.foo.find({ "x": {$nin: [20, 30] }})
db.foo.find({"x":{ $type: "string" }})
db.foo.createIndex({"x.y": 1})
db.foo.find({"x":{$elemMatch:{"y":{$elemMatch:{"$gt": 3 }}}}})
La versione 2.0 di Planner utilizza indici sparsi o parziali anche quando $exists non sono presenti nell'espressione della query.
Sample Document: {"name": "Bob", "email": "example@fake.com" }
Using Planner Version 1.0, you can specify the command as shown below:
db.foo.find({email: "example@fake.com", email: {$exists: true}})
Using Planner Version 2.0, you can specify command without $exists:
db.foo.find({ email: "example@fake.com" })
La versione 2.0 di Planner utilizzerà indici parziali anche quando la condizione della query non corrisponde esattamente all'espressione del filtro dell'indice parziale.
Sample Document: {"name": "Bob", "age": 34}
db.foo.createIndex({"age":1},{partialFilterExpression:{"age":{$lt:50}}})
With Planner Version 1.0, index is used only when the query condition meets the partial
index filter criterion:
db.foo.find({"age":{$lt:50}})
With Planner Version 2.0, index is used even when the query condition doesn’t meet the index
criterion:
db.foo.find({"age":{$lt:30}})
La versione 2.0 di Planner utilizza la scansione parziale dell'indice con le query $elemMatch.
Sample Document: {"name": "Bob", "age": [34,35,36]}
db.foo.createIndex({"age":1},{partialFilterExpression:{"age":{$lt:50,$gt:20}}})
db.foo.find({age:{$elemMatch:{$lt:50,$gt:20}}})
La versione 2.0 di Planner include il supporto per la scansione dell'indice$regex, senza la necessità di fornire il codice dell'applicazione. $hint $regexsupporta l'indice solo nella ricerca di prefissi.
Sample Document: { "x": [1, 2, 3], "y": "apple" }
db.foo.createIndex({ "x": 1, "y": 1 })
db.foo.find({"y":{ $regex: "^a" }})
La versione 2.0 di Planner migliora le prestazioni delle query che coinvolgono indici a più chiavi, con condizioni di uguaglianza sui campi a più chiavi.
Sample Document: {"x": [1, 2, 3],
"y": 5}
db.foo.createIndex({"x": 1, "y":1})
db.foo.find({"x": 2,
"y": {$gt: 1}}).limit(1)
La versione 2.0 di Planner migliora le prestazioni delle query che coinvolgono più filtri, in particolare sulle raccolte con documenti di dimensioni superiori a 8 KB.
Sample Document: {"x": 2,
"y": 4,
"z": 9,
"t": 99}
db.foo.find({$and: [{"x": {$gt : 1}, "y": {$gt : 3}, "z": {$lt : 10},
"t":{$lt : 100}}]})
La versione 2.0 di Planner migliora le prestazioni delle query quando si utilizza l'$inoperatore con un indice composto eliminando la fase di ordinamento.
Sample Document: {"x": 2,
"y": 4,
"z": 9,
"t": 99}
db.foo.createIndex({"x":1, "y":1})
db.foo.find({"x":2,
"y":$in:[1,2,3,4]}).sort({x:1,y:1})
Migliora inoltre le prestazioni delle query che utilizzano indici a più chiavi con elementi. $in
Sample Document: {"x": [1, 2, 3]}
db.foo.createIndex({"x": 1})
db.foo.find("x":{$in:[>100 elements]})
- Query performance improvements
-
La versione 2.0 di Planner migliora le prestazioni delle query che coinvolgono più filtri, in particolare sulle raccolte con documenti di dimensioni superiori a 8 KB.
Sample Document: {"x": 2,
"y": 4,
"z": 9,
"t": 99}
db.foo.find({$and: [{"x": {$gt : 1}, "y": {$gt : 3}, "z": {$lt : 10},
"t":{$lt : 100}}]})
La versione 2.0 di Planner migliora le prestazioni delle query quando si utilizza l'$inoperatore con un indice composto eliminando la fase di ordinamento.
Sample Document: {"x": 2,
"y": 4,
"z": 9,
"t": 99}
db.foo.createIndex({"x":1, "y":1})
db.foo.find({"x":2,
"y":$in:[1,2,3,4]}).sort({x:1,y:1})
Migliora anche le prestazioni delle query che utilizzano indici a più chiavi con elementi. $in
Sample Document: {"x": [1, 2, 3]}
db.foo.createIndex({"x": 1})
db.foo.find("x":{$in:[>100 elements]})
Pianifica i filtri della cache
La versione 2.0 di Planner aggiunge il supporto per i filtri della cache del piano, chiamati anche filtri di indice, che consentono di limitare il set di indici che il planner considera per una specifica forma di query. I filtri vengono impostati con un comando del database e applicati sul server, quindi se si verifica una regressione delle query è possibile attenuarla senza modificare il codice dell'applicazione.
Nella versione 2.0 di planner, i filtri della cache del piano si applicano ai count comandi find e e, a partire da Amazon DocumentDB 5.0.2 e 8.0.2, anche ai comandi,, e. update delete findAndModify I aggregate comandi distinct and richiedono la versione 3.0 di Planner.
Per ulteriori informazioni sul riferimento ai comandi, sulle forme di query supportate, sugli esempi funzionanti e su come i filtri interagiscono con i suggerimenti, consulta. Pianifica i filtri della cache
Potenziali differenze di comportamento tra le versioni 1.0, 2.0 e MongoDB di Planner
In alcuni casi limite, è possibile che la versione 2.0 di Planner produca risultati leggermente diversi dai risultati in MongoDB. Questa sezione illustra alcuni esempi di queste possibilità.
- $(update) and $(projection)
-
In alcuni casi, $(update) gli $(projection) operatori in MongoDB possono comportarsi diversamente dalla versione 1.0 del planner di Amazon DocumentDB. Di seguito sono riportati alcuni esempi:
db.students_list.insertMany( [ { _id: 5, student_ids: [ 100, 200 ], grades: [ 95, 100 ], grad_year: [ 2024, 2023 ] } ] )
db.students_list.updateOne({ student_ids: 100, grades: 100, grad_year: 2024 },
{ $set: { “grad_year.$”: 2025 } }
Planner versione 1.0 — Campo degli aggiornamenti 2022
MongoDB — Campo degli aggiornamenti 2022
Planner versione 2.0 — Campo degli aggiornamenti 2021
db.col.insert({x:[1,2,3]})
db.col.update({$and:[{x:1},{x:3}]},{$set:{"x.$":500}})
Planner versione 1.0 — Aggiorna in modo casuale il primo elemento corrispondente
MongoDB: aggiorna casualmente il primo elemento corrispondente
Planner versione 2.0 — Non effettua aggiornamenti
db.col.insert({x:[1,2,3]})
db.col.find()
Planner versione 1.0 — Seleziona casualmente l'elemento corrispondente
MongoDB — Seleziona casualmente l'elemento corrispondente
Planner versione 2.0 — Non effettua una selezione
db.col.insert({x:100})
db.col.update({x:100},{x:100})
Planner versione 1.0 — Modifiche al conteggio non modificate
MongoDB — Modifiche al conteggio non modificate
Planner versione 2.0 — Il conteggio nModified non cambia se aggiornato con lo stesso valore.
Quando $(update) l'operatore viene utilizzato con$setOnInsert, la versione 1.0 di planner e MongoDB generano un errore, ma la versione 2.0 di planner no.
La ridenominazione di un campo inesistente $field genera un errore nella versione 2.0 di Planner, mentre non produce aggiornamenti nella versione 1.0 di Planner e MongoDB.
- Index behavior
-
La versione 2.0 di Planner genera un errore quando $hint viene applicata con un indice non adatto, mentre la versione 1.0 di Planner e MongoDB no.
// Insert
db.col.insert({x:1})
db.col.insert({x:2})
db.col.insert({x:3})
// Create index on x with partialFilter Expression {x:{$gt:2}}
db.col.createIndex({x:1},{partialFilterExpression:{x:{$gt:2}}})
// Mongodb allows hint on the following queries
db.col.find({x:1}).hint("x_1")
// result is no documents returned because {x:1} is not indexed by the partial index
// Without $hint mongo should return {x:1}, thus the difference in result between COLSCAN and IXSCAN
DocumentDB will error out when $hint is applied on such cases.
db.col.find({x:1}).hint("x_1")
Error: error: {
"ok" : 0,
"operationTime" : Timestamp(1746473021, 1),
"code" : 2,
"errmsg" : "Cannot use Hint for this Query. Index is multi key index , partial index or sparse index and query is not optimized to use this index."
}
rs0:PRIMARY> db.runCommand({"planCacheSetFilter": "col", "query": { location: {$nearSphere: {$geometry: {type: "Point", coordinates: [1, 1]}}}}, "indexes": ["name_1"]})
{
"ok" : 0,
"operationTime" : Timestamp(1750815778, 1),
"code" : 303,
"errmsg" : "Unsupported query shape for index filter $nearSphere"
}
$nearnon può essere utilizzato nella versione 2.0 di Planner. $hint({“$natural”:1})
// indexes present are index on x and geo index
rs0:PRIMARY> db.usarestaurants.getIndexes()
[
{
"v" : 4,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.usarestaurants"
},
{
"v" : 4,
"key" : {
"location" : "2dsphere"
},
"name" : "location_2dsphere",
"ns" : "test.usarestaurants",
"2dsphereIndexVersion" : 1
}
]
// Planner Version 2.0 will throw an error when $hint is applied with index "x_1"
rs0:PRIMARY> db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 }).hint({"$natural": 1})
Error: error: {
"ok" : 0,
"operationTime" : Timestamp(1746475524, 1),
"code" : 291,
"errmsg" : "unable to find index for $geoNear query"
}
// Planner Version 1.0 and MongoDB will not throw an error
db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 }).hint({"$natural": 1})
{ "_id" : ObjectId("681918e087dadfd99b7f0172"), "name" : "Noodle House" }
Mentre MongoDB supporta la scansione completa dell'indice regex, la versione 2.0 di planner supporta la scansione dell'indice regex solo sui campi di prefisso.
// index on x
db.col.createIndex({x:1})
// index scan is used only for prefix regexes
rs0:PRIMARY> db.col.find({x: /^x/}).explain()
{
"queryPlanner" : {
"plannerVersion" : 2,
"namespace" : "test.col",
"winningPlan" : {
"stage" : "IXSCAN",
"indexName" : "x_1",
"direction" : "forward",
"indexCond" : {
"$and" : [
{
"x" : {
"$regex" : /^x/
}
}
]
},
"filter" : {
"x" : {
"$regex" : /^x/
}
}
}
},
"indexFilterSet" : false,
"indexFilterApplied" : false,
"ok" : 1,
"operationTime" : Timestamp(1746474527, 1)
}
// COLSCAN is used for non-prefix regexes
rs0:PRIMARY> db.col.find({x: /x$/}).explain()
{
"queryPlanner" : {
"plannerVersion" : 2,
"namespace" : "test.col",
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"x" : {
"$regex" : /x$/
}
}
}
},
"indexFilterSet" : false,
"indexFilterApplied" : false,
"ok" : 1,
"operationTime" : Timestamp(1746474575, 1)
Ci sono alcune differenze intrinseche nell'uso dei filtri della cache dei piani con la versione 2.0 di Planner rispetto a MongoDB. Sebbene la versione 2.0 di planner non supporti la specifica di «proiezione» e «confronto» con i filtri della cache del piano, MongoDB sì. Tuttavia, il filtro dell'indice MongoDB è solo in memoria e viene perso dopo il riavvio. La versione 2.0 di Planner mantiene i filtri degli indici tramite riavvii e patch.
- Others
-
Il formato dei log di controllo DML quando si utilizza la versione 2.0 di Planner varia leggermente da quello della versione 1.0 di Planner.
command - db.col.find({x:1})
************** Audit logs generated ******************
// v1 format for dml audit logs
{"atype":"authCheck","ts":1746473479983,"timestamp_utc":"2025-05-05 19:31:19.983","remote_ip":"127.0.0.1:47022","users":[{"user":"serviceadmin","db":"test"}],"param":{"command":"find","ns":"test.col","args":{"batchSize":101,"filter":{"x":1},"find":"col","limit":18446744073709551615,"lsid":{"id":{"$binary":"P6RCGz9ZS4iWBSSHWXW15A==","$type":"4"},"uid":{"$binary":"6Jo8PisnEi3dte03+pJFjdCyn/5cGQL8V2KqaoWsnk8=","$type":"0"}},"maxScan":18446744073709551615,"singleBatch":false,"skip":0,"startTransaction":false},"result":0}}
// v2 formal for dml audit logs
{"atype":"authCheck","ts":1746473583711,"timestamp_utc":"2025-05-05 19:33:03.711","remote_ip":"127.0.0.1:37754","users":[{"user":"serviceadmin","db":"test"}],"param":{"command":"find","ns":"test.col","args":{"find":"col","filter":{"x":1},"lsid":{"id":{"$binary":"nJ88TGCSSd+BeD2+ZtrhQg==","$type":"4"}},"$db":"test"},"result":0}}
-
La condizione dell'indice come parte del piano di spiegazione:
rs0:PRIMARY> db.col.createIndex({index1:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1,
"operationTime" : Timestamp(1761149251, 1)
}
La versione 2.0 di Planner spiega l'output del piano mostrando la condizione dell'indice e il filtro:
rs0:PRIMARY> db.col.find({$and:[{price:{$eq:300}},{item:{$eq:"apples"}}]}).explain()
{
"queryPlanner" : {
"plannerVersion" : 2,
"namespace" : "test.col",
"winningPlan" : {
"stage" : "IXSCAN",
"indexName" : "price_1",
"direction" : "forward",
"indexCond" : {
"$and" : [
{
"price" : {
"$eq" : 300
}
}
]
},
"filter" : {
"$and" : [
{
"item" : {
"$eq" : "apples"
}
}
]
}
}
},
"indexFilterSet" : false,
"indexFilterApplied" : false,
"ok" : 1,
"operationTime" : Timestamp(1761149497, 1)
}
La versione 1.0 di Planner spiega l'output del piano:
rs0:PRIMARY> db.col.find({$and:[{price:{$eq:300}},{item:{$eq:"apples"}}]}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.col",
"winningPlan" : {
"stage" : "IXSCAN",
"indexName" : "price_1",
"direction" : "forward"
}
},
"ok" : 1,
"operationTime" : Timestamp(1761149533, 1)
}
La versione 2.0 di Planner colma il divario comportamentale con MongoDB
Ci sono alcune aree in cui la versione 2.0 di Planner colma le lacune comportamentali di MongoDB:
La versione 2.0 di Planner consente la ricerca dell'indice numerico su array appiattiti per: $elemMatch
doc: {"x" : [ [ { "y" : 1 } ] ] }
// Planner Version 2 and mongo
> db.bar.find({"x.0": {$elemMatch: {y: 1}}})
{ "_id" : ObjectId("68192947945e5846634c455a"), "x" : [ [ { "y" : 1 } ] ] }
> db.bar.find({"x": {$elemMatch: {"0.y": 1}}})
{ "_id" : ObjectId("68192947945e5846634c455a"), "x" : [ [ { "y" : 1 } ] ] }
//Whereas Planner Version 1 wouldn't return any results.
> db.bar.find({"x.0": {$elemMatch: {y: 1}}})
> db.bar.find({"x": {$elemMatch: {"0.y": 1}}})
Mentre la versione 1.0 di Planner escludeva le stringhe nella proiezione, il comportamento di Planner versione 2.0 si allinea a MongoDB e le considera come valori letterali»
// Planner V2/ MongoDB
> db.col.find()
{ "_id" : ObjectId("681537738aa101903ed2fe05"), "x" : 1, "y" : 1 }
> db.col.find({},{x:"string"})
{ "_id" : ObjectId("681537738aa101903ed2fe05"), "x" : "string" }
// Planner V1 treats strings as exclude in projection
rs0:PRIMARY> db.col.find()
{ "_id" : ObjectId("68153744d42969f11d5cca72"), "x" : 1, "y" : 1 }
rs0:PRIMARY> db.col.find({},{x:"string"})
{ "_id" : ObjectId("68153744d42969f11d5cca72"), "y" : 1 }
La versione 2.0 di Planner, come MongoDB, non consente la proiezione sugli stessi campi «x» e «x.a»:
// Planner version 2/MongoDB will error out
> db.col.find()
{ "_id" : ObjectId("68153da2012265816bc9ba23"), "x" : [ { "a" : 1 }, 3 ] }
db.col.find({},{"x.a":1,"x":1}) // error
// Planner Version 1 does not error out
db.col.find()
{ "_id" : ObjectId("68153da2012265816bc9ba23"), "x" : [ { "a" : 1 }, 3 ] }
db.col.find({},{"x.a":1,"x":1})
{ "_id" : ObjectId("68153d60143af947c720d099"), "x" : [ { "a" : 1 }, 3 ] }
La versione 2.0 di Planner, come MongoDB, consente la proiezione su documenti secondari:
// Planner Version2/MongoDB supports projections on subdocuments
db.col.find()
{ "_id" : ObjectId("681542d8f35ace71f0a50004"), "x" : [ { "y" : 100 } ] }
> db.col.find({},{"x":{"y":1}})
{ "_id" : ObjectId("681542b7a22d548e4ac9ddea"), "x" : [ { "y" : 100 } ] }
// Planner V1 throws error if projection is subdocument
db.col.find()
{ "_id" : ObjectId("681542d8f35ace71f0a50004"), "x" : [ { "y" : 100 } ] }
rs0:PRIMARY> db.col.find({},{"x":{"y":1}})
Error: error: {
"ok" : 0,
"operationTime" : Timestamp(1746223914, 1),
"code" : 2,
"errmsg" : "Unknown projection operator y"
}
Con la versione 2.0 di Planner, come MongoDB, la proiezione non supporta i campi successivi all'operatore: $
// Mongo and Planner Version 2 will error out
db.col.find()
{ "_id" : ObjectId("68155fa812f843439b593f3f"), "x" : [ { "a" : 100 } ] }
db.col.find({"x.a":100},{"x.$.a":1}) - // error
// v1 will not error out
db.col.find()
{ "_id" : ObjectId("68155fa812f843439b593f3f"), "x" : [ { "a" : 100 } ] }
db.col.find({"x.a":100},{"x.$.a":1})
{ "_id" : ObjectId("68155dee13b051d58239cd0a"), "x" : [ { "a" : 100 } ] }
La versione 2.0 di Planner, come MongoDB, consente l'utilizzo di: $hint
// v1 will error out on $hint if there are no filters
db.col.find({}).hint("x_1")
Error: error: {
"ok" : 0,
"operationTime" : Timestamp(1746466616, 1),
"code" : 2,
"errmsg" : "Cannot use Hint for this Query. Index is multi key index , partial index or sparse index and query is not optimized to use this index."
}
// Mongo and Planner Version 2 will allow $hint usage
db.col.find({}).hint("x_1")
{ "_id" : ObjectId("6818f790d5ba9359d68169cf"), "x" : 1 }