Indexação no Azure Cosmos DB – Descrição geralIndexing in Azure Cosmos DB - Overview

Azure Cosmos DB é uma base de dados de esquemas agnósticos que lhe permite iterar a sua aplicação sem ter de lidar com esquemas ou gestão de índices.Azure Cosmos DB is a schema-agnostic database that allows you to iterate on your application without having to deal with schema or index management. Por padrão, a Azure Cosmos DB indexa automaticamente todas as propriedades para todos os itens do seu contentor sem ter de definir qualquer esquema ou configurar índices secundários.By default, Azure Cosmos DB automatically indexes every property for all items in your container without having to define any schema or configure secondary indexes.

O objetivo deste artigo é explicar como o Azure Cosmos DB indexa os dados e como utiliza os índices para melhorar o desempenho da consulta.The goal of this article is to explain how Azure Cosmos DB indexes data and how it uses indexes to improve query performance. Recomenda-se passar por esta secção antes de explorar como personalizar políticas de indexação.It is recommended to go through this section before exploring how to customize indexing policies.

De itens a árvoresFrom items to trees

Sempre que um item é armazenado num recipiente, o seu conteúdo é projetado como um documento JSON e, em seguida, convertido numa representação de árvore.Every time an item is stored in a container, its content is projected as a JSON document, then converted into a tree representation. O que isso significa é que cada propriedade desse item é representada como um nó numa árvore.What that means is that every property of that item gets represented as a node in a tree. Um nó de raiz pseudo é criado como um pai para todas as propriedades de primeiro nível do item.A pseudo root node is created as a parent to all the first-level properties of the item. Os nós de folha contêm os valores de escalar reais transportados por um item.The leaf nodes contain the actual scalar values carried by an item.

Como exemplo, considere este item:As an example, consider this item:

    {
        "locations": [
            { "country": "Germany", "city": "Berlin" },
            { "country": "France", "city": "Paris" }
        ],
        "headquarters": { "country": "Belgium", "employees": 250 },
        "exports": [
            { "city": "Moscow" },
            { "city": "Athens" }
        ]
    }

Seria representada pela seguinte árvore:It would be represented by the following tree:

O item anterior representado como uma árvore

Note como as matrizes são codificadas na árvore: cada entrada numa matriz recebe um nó intermédio rotulado com o índice dessa entrada dentro da matriz (0, 1 etc.).Note how arrays are encoded in the tree: every entry in an array gets an intermediate node labeled with the index of that entry within the array (0, 1 etc.).

Das árvores aos caminhos da propriedadeFrom trees to property paths

A razão pela qual a Azure Cosmos DB transforma itens em árvores é porque permite que as propriedades sejam referenciadas pelos seus caminhos dentro dessas árvores.The reason why Azure Cosmos DB transforms items into trees is because it allows properties to be referenced by their paths within those trees. Para obter o caminho para uma propriedade, podemos atravessar a árvore desde o nó raiz até aquela propriedade, e concatenar os rótulos de cada nó atravessado.To get the path for a property, we can traverse the tree from the root node to that property, and concatenate the labels of each traversed node.

Aqui estão os caminhos para cada propriedade a partir do item de exemplo acima descrito:Here are the paths for each property from the example item described above:

/locations/0/country: "Germany"
/locations/0/city: "Berlin"
/locations/1/country: "France"
/locations/1/city: "Paris"
/headquarters/country: "Belgium"
/headquarters/employees: 250
/exports/0/city: "Moscow"
/exports/1/city: "Athens"

Quando um item é escrito, a Azure Cosmos DB indexa eficazmente o caminho de cada propriedade e o seu valor correspondente.When an item is written, Azure Cosmos DB effectively indexes each property's path and its corresponding value.

Tipos de índiceIndex kinds

A Azure Cosmos DB suporta atualmente três tipos de índices.Azure Cosmos DB currently supports three kinds of indexes.

Índice de GamaRange Index

O índice de alcance baseia-se numa estrutura ordenada em forma de árvore.Range index is based on an ordered tree-like structure. O tipo de índice de gama é utilizado para:The range index kind is used for:

  • Consultas de igualdade:Equality queries:

    SELECT * FROM container c WHERE c.property = 'value'
    
    SELECT * FROM c WHERE c.property IN ("value1", "value2", "value3")
    

    Igualdade jogo em um elemento de matrizEquality match on an array element

      SELECT * FROM c WHERE ARRAY_CONTAINS(c.tags, "tag1")
    
  • Consultas de alcance:Range queries:

    SELECT * FROM container c WHERE c.property > 'value'
    

    (obras > < para, >= , , , <= != )(works for >, <, >=, <=, !=)

  • Verificação da presença de um imóvel:Checking for the presence of a property:

    SELECT * FROM c WHERE IS_DEFINED(c.property)
    
  • Funções do sistema de cordas:String system functions:

    SELECT * FROM c WHERE CONTAINS(c.property, "value")
    
    SELECT * FROM c WHERE STRINGEQUALS(c.property, "value")
    
  • ORDER BYConsultas:ORDER BY queries:

    SELECT * FROM container c ORDER BY c.property
    
  • JOINConsultas:JOIN queries:

    SELECT child FROM container c JOIN child IN c.properties WHERE child = 'value'
    

Os índices de gama podem ser usados em valores escalares (cadeia ou número).Range indexes can be used on scalar values (string or number).

Índice espacialSpatial index

Os índices espaciais permitem consultas eficientes em objetos geoespaciais tais como - pontos, linhas, polígonos e multipolígonos.Spatial indices enable efficient queries on geospatial objects such as - points, lines, polygons, and multipolygon. Estas consultas usam ST_DISTANCE, ST_WITHIN, ST_INTERSECTS palavras-chave.These queries use ST_DISTANCE, ST_WITHIN, ST_INTERSECTS keywords. Seguem-se alguns exemplos que utilizam o tipo de índice espacial:The following are some examples that use spatial index kind:

  • Consultas de distância geoespaciais:Geospatial distance queries:

    SELECT * FROM container c WHERE ST_DISTANCE(c.property, { "type": "Point", "coordinates": [0.0, 10.0] }) < 40
    
  • Geoespacial dentro de consultas:Geospatial within queries:

    SELECT * FROM container c WHERE ST_WITHIN(c.property, {"type": "Point", "coordinates": [0.0, 10.0] } })
    
  • Consultas intersectais geoespaciais:Geospatial intersect queries:

    SELECT * FROM c WHERE ST_INTERSECTS(c.property, { 'type':'Polygon', 'coordinates': [[ [31.8, -5], [32, -5], [31.8, -5] ]]  })  
    

Os índices espaciais podem ser utilizados em objetos GeoJSON corretamente formatados.Spatial indexes can be used on correctly formatted GeoJSON objects. Pontos, LineStrings, Polígonos e MultiPolygons são atualmente suportados.Points, LineStrings, Polygons, and MultiPolygons are currently supported.

Índices compostosComposite indexes

Os índices compósitos aumentam a eficiência quando está a realizar operações em vários campos.Composite indices increase the efficiency when you are performing operations on multiple fields. O tipo de índice composto é utilizado para:The composite index kind is used for:

  • ORDER BYconsultas sobre múltiplas propriedades:ORDER BY queries on multiple properties:
 SELECT * FROM container c ORDER BY c.property1, c.property2
  • Consultas com um filtro e ORDER BY .Queries with a filter and ORDER BY. Estas consultas podem utilizar um índice composto se a propriedade do filtro for adicionada à ORDER BY cláusula.These queries can utilize a composite index if the filter property is added to the ORDER BY clause.
 SELECT * FROM container c WHERE c.property1 = 'value' ORDER BY c.property1, c.property2
  • Consultas com um filtro em duas ou mais propriedades onde pelo menos uma propriedade é um filtro de igualdadeQueries with a filter on two or more properties where at least one property is an equality filter
 SELECT * FROM container c WHERE c.property1 = 'value' AND c.property2 > 'value'

Enquanto um pré-filtro de filtros utilizar um do tipo indexado, o motor de consulta avaliará primeiro antes de digitalizar o resto.As long as one filter predicate uses one of the index kind, the query engine will evaluate that first before scanning the rest. Por exemplo, se tiver uma consulta SQL, comoSELECT * FROM c WHERE c.firstName = "Andrew" and CONTAINS(c.lastName, "Liu")For example, if you have a SQL query such as SELECT * FROM c WHERE c.firstName = "Andrew" and CONTAINS(c.lastName, "Liu")

  • A consulta acima filtra-se primeiro para entradas onde primeiro Nome = "Andrew" utilizando o índice.The above query will first filter for entries where firstName = "Andrew" by using the index. Em seguida, passa todas as entradas do primeiro Nome = "Andrew" através de um pipeline subsequente para avaliar o predicado do filtro CONTAINS.It then pass all of the firstName = "Andrew" entries through a subsequent pipeline to evaluate the CONTAINS filter predicate.

  • Pode acelerar as consultas e evitar análises completas dos contentores quando utilizar funções que não utilizem o índice (por exemplo, CONTAINS) adicionando predicados de filtros adicionais que utilizam o índice.You can speed up queries and avoid full container scans when using functions that don't use the index (e.g. CONTAINS) by adding additional filter predicates that do use the index. A ordem das cláusulas de filtragem não é importante.The order of filter clauses isn't important. O motor de consulta é vai descobrir quais os predicados são mais seletivos e executar a consulta em conformidade.The query engine is will figure out which predicates are more selective and run the query accordingly.

Consulta com índicesQuerying with indexes

Os caminhos extraídos ao indexar dados facilitam a procura do índice ao processar uma consulta.The paths extracted when indexing data make it easy to lookup the index when processing a query. Ao combinar a WHERE cláusula de uma consulta com a lista de caminhos indexados, é possível identificar os itens que correspondem à consulta predicado muito rapidamente.By matching the WHERE clause of a query with the list of indexed paths, it is possible to identify the items that match the query predicate very quickly.

Por exemplo, considere a seguinte consulta: SELECT location FROM location IN company.locations WHERE location.country = 'France' .For example, consider the following query: SELECT location FROM location IN company.locations WHERE location.country = 'France'. O predicado de consulta (filtragem em itens, onde qualquer local tem "França" como seu país/região) corresponderia ao caminho realçado a vermelho abaixo:The query predicate (filtering on items, where any location has "France" as its country/region) would match the path highlighted in red below:

Combinando um caminho específico dentro de uma árvore

Nota

Uma ORDER BY cláusula que ordena por uma única propriedade sempre precisa de um índice de alcance e falhará se o caminho que referenciar não tiver um.An ORDER BY clause that orders by a single property always needs a range index and will fail if the path it references doesn't have one. Da mesma forma, uma ORDER BY consulta que encomenda por múltiplas propriedades sempre precisa de um índice composto.Similarly, an ORDER BY query which orders by multiple properties always needs a composite index.

Passos seguintesNext steps

Leia mais sobre a indexação nos seguintes artigos:Read more about indexing in the following articles: