Recupero dei piani di query
La comprensione dell'indice utilizzato da IBM Cloudant Query nell'esecuzione delle query è essenziale per ottenere buone prestazioni. Utilizzare l'endpoint _explain per recuperare i piani di query.
Come vengono selezionati gli indici
IBM Cloudant Query sceglie quale indice utilizzare per rispondere a una query, a meno che non si specifichi un indice al momento della query.
Quando non si specifica un indice da utilizzare, IBM Cloudant La query utilizza la seguente logica:
- Il pianificatore di query esamina la sezione del selettore, e trova l'indice che corrisponde maggiormente agli operatori e ai campi utilizzati nella query. Se due o più indici di tipo JSON corrispondono, viene preferito l'indice con il minor numero di campi. Se esistono ancora due o più indici candidati, viene scelto quello con il primo nome alfabetico.
- Se un indice di tipo
jsone un indice di tipotextpossono entrambi soddisfare un selettore, l'indicejsonviene scelto per default. - L'indice di tipo
textviene scelto quando sono soddisfatte le seguenti condizioni:- Un indice di tipo
jsone un indice di tipotextesistono nello stesso campo (ad esempiofieldone). - Il selettore può essere soddisfatto solo utilizzando un indice di tipo
text.
- Un indice di tipo
Ad esempio, si supponga di avere un indice di tipo text e un indice di tipo json per il campo foo, e si voglia usare un selettore simile al seguente esempio:
{
"foo": {
"$in": ["red","blue","green"]
}
}
IBM Cloudant La query utilizza l'indice di tipo text perché un indice di tipo json non può soddisfare il selettore.
Tuttavia, si può usare un selettore diverso con gli stessi indici:
{
"foo": {
"$gt": 2
}
}
In questo esempio, IBM Cloudant Query utilizza l'indice di tipo json perché entrambi i tipi di indici possono soddisfare il selettore.
Specificare un indice da utilizzare
Utilizzare i parametri di query use_index e allow_fallback per controllare l'uso degli indici per le query. Per maggiori dettagli, vedere Parametri della query.
Utilizzando questi parametri, _explain può mostrare se le query sono in grado di utilizzare gli indici specificati e quindi se la query verrà eseguita come previsto.
Utilizzo dell'endpoint _explain
Per identificare quale indice viene utilizzato da una particolare query, inviare un POST all'endpoint _explain per il database, con la query come dato. I dettagli dell'indice in uso sono mostrati nell'oggetto index all'interno del risultato.
Si veda il seguente esempio che utilizza HTTP per mostrare come identificare l'indice utilizzato per rispondere a una query:
POST /movies/_explain HTTP/1.1
Host: $SERVICE_URL
Content-Type: application/json
{
"selector": {
"$text": "Pacino",
"year": 2010
}
}
Si veda il seguente esempio che utilizza la riga di comando per mostrare come identificare l'indice utilizzato per rispondere a una query:
curl "$SERVICE_URL/movies/_explain" \
-X POST \
-H "Content-Type: application/json" \
-d '{
"selector": {
"$text": "Pacino",
"year": 2010
}
}'
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.ExplainResult;
import com.ibm.cloud.cloudant.v1.model.PostExplainOptions;
import java.util.HashMap;
import java.util.Map;
Cloudant service = Cloudant.newInstance();
Map<String, Object> selector = new HashMap<>();
selector.put("$text", "Pacino");
selector.put("year", 2010);
PostExplainOptions explainOptions =
new PostExplainOptions.Builder()
.db("movies")
.selector(selector)
.build();
ExplainResult response =
service.postExplain(explainOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
let selector: CloudantV1.Selector = {
'$text': 'Pacino',
'year': 2010
};
service.postExplain({
db: 'movies',
selector: selector
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_find(
db='movies',
selector={'$text': 'Pacino', 'year': 2010}
).get_result()
print(response)
postExplainOptions := service.NewPostExplainOptions(
"movies",
map[string]interface{}{
"$text": "Pacino",
"year": 2010,
},
)
explainResult, _, err := service.PostExplain(postExplainOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(explainResult, "", " ")
fmt.Println(string(b))
Il precedente esempio di Go richiede il seguente blocco di importazione:
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
Questo esempio di risposta _explain mostra quale indice è stato utilizzato per rispondere a una query:
{
"dbname": "$ACCOUNT/movies",
"index": {
"ddoc": "_design/32372935e14bed00cc6db4fc9efca0f1537d34a8",
"name": "32372935e14bed00cc6db4fc9efca0f1537d34a8",
"type": "text",
"def": {
"default_analyzer": "keyword",
"default_field": {},
"selector": {},
"fields": []
}
},
"selector": {
"$and": [
{
"$default": {
"$text": "Pacino"
}
},
{
"year": {
"$eq": 2010
}
}
]
},
"opts": {
"use_index": [],
"bookmark": [],
"limit": 10000000000,
"skip": 0,
"sort": {},
"fields": "all_fields",
"r": [
49
],
"conflicts": false
},
"limit": 200,
"skip": 0,
"fields": "all_fields",
"query": "(($default:Pacino) AND (year_3anumber:2010))",
"sort": "relevance"
}