Indici parziali

Utilizzare gli indici parziali per creare indici che utilizzano un sottoinsieme dei documenti del database. Si tratta di una tecnica di ottimizzazione potente, se usata correttamente: riduce le dimensioni complessive di un indice, rendendo le query più veloci e riducendo i costi di archiviazione dei dati.

Creazione di un indice parziale

IBM Cloudant Query supporta gli indici parziali utilizzando il campo partial_filter_selector. Il file partial_filter_selector contiene una query standard IBM Cloudant che viene eseguita al momento dell'indice. I documenti che non corrispondono al selettore non vengono aggiunti all'indice.

Si veda il seguente esempio di query:

{
  "selector": {
    "status": {
      "$ne": "archived"
    },
    "type": "user"
  }
}

Senza un indice parziale, questa query richiede una scansione completa dell'indice per trovare tutti i documenti di type:user che non hanno uno stato di archived. Questa situazione si verifica perché un indice normale può essere utilizzato per abbinare righe contigue, mentre l'operatore $ne non può garantirlo.

Per migliorare i tempi di risposta, è possibile creare un indice che escluda i documenti con status: { $ne: archived } al momento dell'indice, utilizzando partial_filter_selector mostrato nell'esempio seguente:

POST /db/_index HTTP/1.1
Content-Type: application/json
Content-Length: 144
Host: localhost:5984

{
  "index": {
    "partial_filter_selector": {
      "status": {
        "$ne": "archived"
      }
    },
    "fields": ["type"]
  },
  "ddoc" : "type-not-archived",
  "type" : "json"
}

Gli indici parziali non vengono utilizzati dal query planner a meno che non siano specificati da un campo da un campo use_index, quindi è necessario modificare la query originale:

{
  "selector": {
    "status": {
      "$ne": "archived"
    },
    "type": "user"
  },
  "use_index": "type-not-archived"
}

Tecnicamente, non è necessario includere il filtro sul campo status nel selettore della query nel selettore della query. L'indice parziale assicura che questo valore sia sempre vero. Tuttavia, se si include il filtro, l'intento del selettore è più chiaro. Inoltre, rende più facile sfruttare i futuri miglioramenti della pianificazione delle query (ad esempio, la selezione automatica degli indici parziali).