Zasady indeksowania w usłudze Azure Cosmos DBIndexing policies in Azure Cosmos DB

DOTYCZY: interfejs API SQL

W usłudze Azure Cosmos DB każdy kontener ma zasady indeksowania, które określają sposób indeksowania elementów tego kontenera.In Azure Cosmos DB, every container has an indexing policy that dictates how the container's items should be indexed. Domyślne zasady indeksowania dla nowo utworzonych kontenerów indeksują każdą właściwość i każdy element oraz wymuszają indeksy zakresu dla wszelkich ciągów i liczb.The default indexing policy for newly created containers indexes every property of every item and enforces range indexes for any string or number. Dzięki temu można uzyskać dobrą wydajność zapytań bez konieczności pomyślnego zaopiniowania indeksowania i zarządzania indeksem.This allows you to get good query performance without having to think about indexing and index management upfront.

W niektórych sytuacjach może być potrzebne zastąpienie tego automatycznego zachowania zachowaniem lepiej dostosowanym do wymagań.In some situations, you may want to override this automatic behavior to better suit your requirements. Można dostosować zasady indeksowania kontenera, ustawiając jego tryb indeksowania i dołączając lub wykluczając ścieżki właściwości.You can customize a container's indexing policy by setting its indexing mode , and include or exclude property paths.

Uwaga

Metoda aktualizacji zasad indeksowania opisana w tym artykule ma zastosowanie tylko do interfejsu API SQL (Core) Azure Cosmos DB.The method of updating indexing policies described in this article only applies to Azure Cosmos DB's SQL (Core) API. Dowiedz się więcej na temat indeksowania w interfejsie API Azure Cosmos DB MongoDBLearn about indexing in Azure Cosmos DB's API for MongoDB

Tryb indeksowaniaIndexing mode

Azure Cosmos DB obsługuje dwa tryby indeksowania:Azure Cosmos DB supports two indexing modes:

  • Spójne : indeks jest aktualizowany synchronicznie podczas tworzenia, aktualizowania lub usuwania elementów.Consistent : The index is updated synchronously as you create, update or delete items. Oznacza to, że spójność zapytań odczytu będzie spójna z konfiguracją dla konta.This means that the consistency of your read queries will be the consistency configured for the account.
  • Brak : indeksowanie jest wyłączone w kontenerze.None : Indexing is disabled on the container. Jest to często używane, gdy kontener jest używany jako czysty magazyn klucz-wartość bez konieczności stosowania indeksów pomocniczych.This is commonly used when a container is used as a pure key-value store without the need for secondary indexes. Może również służyć do poprawy wydajności operacji zbiorczych.It can also be used to improve the performance of bulk operations. Po zakończeniu operacji zbiorczych tryb indeksu może być ustawiony na spójny, a następnie monitorowany przy użyciu IndexTransformationProgress do momentu ukończenia.After the bulk operations are complete, the index mode can be set to Consistent and then monitored using the IndexTransformationProgress until complete.

Uwaga

Azure Cosmos DB obsługuje również tryb indeksowania z opóźnieniem.Azure Cosmos DB also supports a Lazy indexing mode. Indeksowanie z opóźnieniem aktualizuje indeks na znacznie niższym poziomie priorytetu, gdy aparat nie wykonuje żadnej innej pracy.Lazy indexing performs updates to the index at a much lower priority level when the engine is not doing any other work. Może to doprowadzić do niespójnych lub niekompletnych wyników zapytań.This can result in inconsistent or incomplete query results. Jeśli planujesz wysyłać zapytania względem kontenera Cosmos, nie wybieraj indeksowania z opóźnieniem.If you plan to query a Cosmos container, you should not select lazy indexing. Nowe kontenery nie mogą wybrać indeksowania z opóźnieniem.New containers cannot select lazy indexing. Możesz zażądać wykluczenia, kontaktując się z pomocą techniczną platformy Azure (chyba że używasz konta usługi Azure Cosmos w trybie bez serwera , który nie obsługuje indeksowania z opóźnieniem).You can request an exemption by contacting Azure support (except if you are using an Azure Cosmos account in serverless mode which doesn't support lazy indexing).

Domyślnie zasady indeksowania są ustawione na automatic .By default, indexing policy is set to automatic. Jest to osiągane przez ustawienie automatic właściwości w zasadach indeksowania na true .It's achieved by setting the automatic property in the indexing policy to true. Ustawienie tej właściwości true umożliwia usłudze Azure CosmosDB Automatyczne indeksowanie dokumentów w miarę ich pisania.Setting this property to true allows Azure CosmosDB to automatically index documents as they are written.

Uwzględnianie i wykluczanie ścieżek właściwościIncluding and excluding property paths

Niestandardowe zasady indeksowania mogą określać ścieżki właściwości, które są jawnie dołączone lub wykluczone z indeksowania.A custom indexing policy can specify property paths that are explicitly included or excluded from indexing. Przez optymalizację liczby indeksowanych ścieżek można znacznie ograniczyć opóźnienia i obciążenie RU operacji zapisu.By optimizing the number of paths that are indexed, you can substantially reduce the latency and RU charge of write operations. Te ścieżki są zdefiniowane po metodzie opisanej w sekcji Omówienie indeksowania z następującymi dodatkami:These paths are defined following the method described in the indexing overview section with the following additions:

  • ścieżka prowadząca do wartości skalarnej (ciąg lub Number) ma koniec /?a path leading to a scalar value (string or number) ends with /?
  • elementy z tablicy są rozłączone za pośrednictwem /[] notacji (zamiast /0 /1 itp.)elements from an array are addressed together through the /[] notation (instead of /0, /1 etc.)
  • /*symbol wieloznaczny może służyć do dopasowania elementów poniżej węzłathe /* wildcard can be used to match any elements below the node

Ponowne wykonanie tego samego przykładu:Taking the same example again:

    {
        "locations": [
            { "country": "Germany", "city": "Berlin" },
            { "country": "France", "city": "Paris" }
        ],
        "headquarters": { "country": "Belgium", "employees": 250 }
        "exports": [
            { "city": "Moscow" },
            { "city": "Athens" }
        ]
    }
  • headquarters employees ścieżka jest/headquarters/employees/?the headquarters's employees path is /headquarters/employees/?

  • locations" country ścieżka jest/locations/[]/country/?the locations' country path is /locations/[]/country/?

  • ścieżka do wszystkich elementów w obszarze headquarters to /headquarters/*the path to anything under headquarters is /headquarters/*

Na przykład możemy dołączyć /headquarters/employees/? ścieżkę.For example, we could include the /headquarters/employees/? path. Ta ścieżka zapewni, że indeksuje Właściwość Employees, ale nie indeksuje dodatkowych zagnieżdżonych JSON w ramach tej właściwości.This path would ensure that we index the employees property but would not index additional nested JSON within this property.

Strategia uwzględniania/wykluczaniaInclude/exclude strategy

Każda zasada indeksowania musi zawierać ścieżkę katalogu głównego /* jako dołączoną lub wykluczoną ścieżkę.Any indexing policy has to include the root path /* as either an included or an excluded path.

  • Uwzględnij ścieżkę główną, aby wykluczać ścieżki, które nie muszą być indeksowane.Include the root path to selectively exclude paths that don't need to be indexed. Jest to zalecane podejście, które pozwala Azure Cosmos DB aktywnie indeksować wszelkie nowe właściwości, które mogą zostać dodane do modelu.This is the recommended approach as it lets Azure Cosmos DB proactively index any new property that may be added to your model.

  • Wyklucz ścieżkę katalogu głównego do selektywnego dołączania ścieżek, które muszą być indeksowane.Exclude the root path to selectively include paths that need to be indexed.

  • W przypadku ścieżek ze zwykłymi znakami, które zawierają: znaki alfanumeryczne i _ (podkreślenie), nie trzeba określać ciągu ścieżki wokół podwójnych cudzysłowów (na przykład "/Path/?").For paths with regular characters that include: alphanumeric characters and _ (underscore), you don't have to escape the path string around double quotes (for example, "/path/?"). W przypadku ścieżek z innymi znakami specjalnymi należy wypróbować ciąg ścieżki wokół podwójnych cudzysłowów (na przykład "/ " Path-ABC " /?").For paths with other special characters, you need to escape the path string around double quotes (for example, "/"path-abc"/?"). Jeśli oczekujesz znaków specjalnych w ścieżce, możesz pominąć wszystkie ścieżki w celu zapewnienia bezpieczeństwa.If you expect special characters in your path, you can escape every path for safety. Funkcjonalnie nie powoduje żadnych różnic w przypadku ucieczki wszystkich ścieżek, które zawierają znaki specjalne.Functionally, it doesn't make any difference if you escape every path Vs just the ones that have special characters.

  • Właściwość systemowa _etag jest domyślnie wykluczona z indeksowania, chyba że element ETag zostanie dodany do ścieżki dołączonej do indeksowania.The system property _etag is excluded from indexing by default, unless the etag is added to the included path for indexing.

  • Jeśli tryb indeksowania jest ustawiony na spójne , właściwości systemu id i _ts są indeksowane automatycznie.If the indexing mode is set to consistent , the system properties id and _ts are automatically indexed.

W przypadku dołączania i wykluczania ścieżek mogą wystąpić następujące atrybuty:When including and excluding paths, you may encounter the following attributes:

  • kind może być albo range hash .kind can be either range or hash. Obsługa indeksu wartości skrótu jest ograniczona do filtrów równości.Hash index support is limited to equality filters. Funkcja indeksu zakresu oferuje wszystkie funkcje indeksów skrótu, a także wydajne sortowanie, filtry zakresu i funkcje systemowe.Range index functionality provides all of the functionality of hash indexes as well as efficient sorting, range filters, system functions. Zawsze zalecamy użycie indeksu zakresu.We always recommend using a range index.

  • precision jest liczbą zdefiniowaną na poziomie indeksu dla dołączonych ścieżek.precision is a number defined at the index level for included paths. Wartość -1 wskazuje maksymalną precyzję.A value of -1 indicates maximum precision. Zalecamy zawsze ustawienie tej wartości na -1 .We recommend always setting this value to -1.

  • dataType może być albo String Number .dataType can be either String or Number. Wskazuje typy właściwości JSON, które będą indeksowane.This indicates the types of JSON properties which will be indexed.

Gdy nie zostanie określony, te właściwości będą miały następujące wartości domyślne:When not specified, these properties will have the following default values:

Nazwa właściwościProperty Name Wartość domyślnaDefault Value
kind range
precision -1
dataType String i NumberString and Number

Zapoznaj się z tą sekcją , aby zapoznać się z przykładami zasad indeksowania obejmującymi i wykluczającymi ścieżki.See this section for indexing policy examples for including and excluding paths.

Pierwszeństwo uwzględniania/wykluczaniaInclude/exclude precedence

Jeśli zawarte ścieżki i wykluczone ścieżki mają konflikt, pierwszeństwo ma dokładniejszą ścieżkę.If your included paths and excluded paths have a conflict, the more precise path takes precedence.

Oto przykład:Here's an example:

Ścieżka uwzględniona : /food/ingredients/nutrition/*Included Path : /food/ingredients/nutrition/*

Wykluczona ścieżka : /food/ingredients/*Excluded Path : /food/ingredients/*

W takim przypadku dołączona ścieżka ma pierwszeństwo przed wykluczoną ścieżką, ponieważ jest bardziej precyzyjna.In this case, the included path takes precedence over the excluded path because it is more precise. W oparciu o te ścieżki wszelkie dane ze food/ingredients ścieżki lub zagnieżdżone w ramach zostałyby wykluczone z indeksu.Based on these paths, any data in the food/ingredients path or nested within would be excluded from the index. Wyjątek mógłby zawierać dane w dołączonej ścieżce: /food/ingredients/nutrition/* , które byłyby indeksowane.The exception would be data within the included path: /food/ingredients/nutrition/*, which would be indexed.

Poniżej przedstawiono niektóre reguły pierwszeństwa zawartych i wykluczonych ścieżek w Azure Cosmos DB:Here are some rules for included and excluded paths precedence in Azure Cosmos DB:

  • Dokładniejsze ścieżki są bardziej precyzyjne niż wąskie ścieżki.Deeper paths are more precise than narrower paths. na przykład: /a/b/? jest bardziej precyzyjna niż /a/? .for example: /a/b/? is more precise than /a/?.

  • /?Jest bardziej precyzyjna niż /* .The /? is more precise than /*. Na przykład /a/? ma dokładniejszy /a/* /a/? priorytet.For example /a/? is more precise than /a/* so /a/? takes precedence.

  • Ścieżka /* musi być ścieżką dołączoną lub wykluczoną.The path /* must be either an included path or excluded path.

Indeksy przestrzenneSpatial indexes

Podczas definiowania ścieżki przestrzennej w zasadach indeksowania należy określić, który indeks type ma zostać zastosowany do tej ścieżki.When you define a spatial path in the indexing policy, you should define which index type should be applied to that path. Możliwe typy indeksów przestrzennych obejmują:Possible types for spatial indexes include:

  • MomentPoint

  • WielokątPolygon

  • MultiPolygonMultiPolygon

  • LineStringLineString

Domyślnie Azure Cosmos DB nie utworzy żadnych indeksów przestrzennych.Azure Cosmos DB, by default, will not create any spatial indexes. Jeśli chcesz używać przestrzennych funkcji języka SQL, należy utworzyć indeks przestrzenny dla wymaganych właściwości.If you would like to use spatial SQL built-in functions, you should create a spatial index on the required properties. Zobacz tę sekcję , aby zapoznać się z przykładami zasad indeksowania służącymi do dodawania indeksów przestrzennych.See this section for indexing policy examples for adding spatial indexes.

Indeksy złożoneComposite indexes

Zapytania, które mają ORDER BY klauzulę mającą co najmniej dwie właściwości, wymagają złożonego indeksu.Queries that have an ORDER BY clause with two or more properties require a composite index. Można również zdefiniować indeks złożony, aby zwiększyć wydajność wielu zapytań równości i zakresu.You can also define a composite index to improve the performance of many equality and range queries. Domyślnie nie są zdefiniowane żadne indeksy złożone, dlatego należy dodać indeksy złożone zgodnie z wymaganiami.By default, no composite indexes are defined so you should add composite indexes as needed.

W przeciwieństwie do ścieżek uwzględnionych lub wykluczonych nie można utworzyć ścieżki z /* symbolem wieloznacznym.Unlike with included or excluded paths, you can't create a path with the /* wildcard. Każda ścieżka złożona ma niejawną /? na końcu ścieżki, której nie trzeba określać.Every composite path has an implicit /? at the end of the path that you don't need to specify. Ścieżki złożone prowadzą do wartości skalarnej i jest to jedyna wartość, która jest uwzględniona w indeksie złożonym.Composite paths lead to a scalar value and this is the only value that is included in the composite index.

Podczas definiowania indeksu złożonego należy określić:When defining a composite index, you specify:

  • Co najmniej dwie ścieżki właściwości.Two or more property paths. Sekwencja, w której są zdefiniowane ścieżki właściwości.The sequence in which property paths are defined matters.

  • Zamówienie (rosnąco lub malejąco).The order (ascending or descending).

Uwaga

Po dodaniu indeksu złożonego zapytanie będzie używać istniejących indeksów zakresu do momentu ukończenia nowego złożonego dodawania indeksu.When you add a composite index, the query will utilize existing range indexes until the new composite index addition is complete. W związku z tym, po dodaniu indeksu złożonego, nie należy od razu obserwować ulepszeń wydajności.Therefore, when you add a composite index, you may not immediately observe performance improvements. Istnieje możliwość śledzenia postępu transformacji indeksu przy użyciu jednego z zestawów SDK.It is possible to track the progress of index transformation by using one of the SDKs.

Zaporządkuj według zapytań dotyczących wielu właściwości:ORDER BY queries on multiple properties:

Poniższe zagadnienia są używane podczas używania indeksów złożonych dla zapytań z ORDER BY klauzulą z co najmniej dwiema właściwościami:The following considerations are used when using composite indexes for queries with an ORDER BY clause with two or more properties:

  • Jeśli złożone ścieżki indeksu nie pasują do sekwencji właściwości w ORDER BY klauzuli, indeks złożony nie obsługuje zapytania.If the composite index paths do not match the sequence of the properties in the ORDER BY clause, then the composite index can't support the query.

  • Kolejność ścieżek złożonych indeksów (rosnąco lub malejąco) powinna również być zgodna z order ORDER BY klauzulą w klauzuli.The order of composite index paths (ascending or descending) should also match the order in the ORDER BY clause.

  • Indeks złożony również obsługuje ORDER BY klauzulę z odwrotną kolejnością we wszystkich ścieżkach.The composite index also supports an ORDER BY clause with the opposite order on all paths.

Rozważmy następujący przykład, w którym zdefiniowano indeks złożony w nazwach właściwości, wieku i _ts:Consider the following example where a composite index is defined on properties name, age, and _ts:

Indeks złożonyComposite Index Przykładowe ORDER BY zapytanieSample ORDER BY Query Obsługiwane przez indeks złożony?Supported by Composite Index?
(name ASC, age ASC) SELECT * FROM c ORDER BY c.name ASC, c.age asc Yes
(name ASC, age ASC) SELECT * FROM c ORDER BY c.age ASC, c.name asc No
(name ASC, age ASC) SELECT * FROM c ORDER BY c.name DESC, c.age DESC Yes
(name ASC, age ASC) SELECT * FROM c ORDER BY c.name ASC, c.age DESC No
(name ASC, age ASC, timestamp ASC) SELECT * FROM c ORDER BY c.name ASC, c.age ASC, timestamp ASC Yes
(name ASC, age ASC, timestamp ASC) SELECT * FROM c ORDER BY c.name ASC, c.age ASC No

Zasady indeksowania należy dostosować, aby można było obsłużyć wszystkie niezbędne ORDER BY zapytania.You should customize your indexing policy so you can serve all necessary ORDER BY queries.

Zapytania z filtrami na wielu właściwościachQueries with filters on multiple properties

Jeśli zapytanie zawiera filtry dla co najmniej dwóch właściwości, warto utworzyć indeks złożony dla tych właściwości.If a query has filters on two or more properties, it may be helpful to create a composite index for these properties.

Rozważmy na przykład następujące zapytanie, które ma filtr równości dla dwóch właściwości:For example, consider the following query which has an equality filter on two properties:

SELECT * FROM c WHERE c.name = "John" AND c.age = 18

To zapytanie będzie bardziej wydajne, co zajmuje mniej czasu i zużywa mniejszą liczbę jednostek RU, jeśli może wykorzystać indeks złożony w dniu (nazwa ASC, wiek ASC).This query will be more efficient, taking less time and consuming fewer RU's, if it is able to leverage a composite index on (name ASC, age ASC).

Zapytania z filtrami zakresu można także zoptymalizować przy użyciu indeksu złożonego.Queries with range filters can also be optimized with a composite index. Jednak zapytanie może mieć tylko jeden filtr zakresu.However, the query can only have a single range filter. Filtry zakresu obejmują > , < , <= , >= , i != .Range filters include >, <, <=, >=, and !=. Filtr zakresu powinien być zdefiniowany jako ostatni w indeksie złożonym.The range filter should be defined last in the composite index.

Rozważ następujące zapytanie z filtrami równości i zakresu:Consider the following query with both equality and range filters:

SELECT * FROM c WHERE c.name = "John" AND c.age > 18

To zapytanie będzie bardziej wydajne z indeksem złożonym w dniu (nazwa ASC, wiek ASC).This query will be more efficient with a composite index on (name ASC, age ASC). Jednak zapytanie nie korzysta ze złożonego indeksu w (Age ASC, Name ASC), ponieważ filtry równości muszą być zdefiniowane najpierw w indeksie złożonym.However, the query would not utilize a composite index on (age ASC, name ASC) because the equality filters must be defined first in the composite index.

Poniższe zagadnienia są używane podczas tworzenia indeksów złożonych dla zapytań z filtrami dla wielu właściwościThe following considerations are used when creating composite indexes for queries with filters on multiple properties

  • Właściwości w filtrze zapytania powinny być zgodne z tymi w indeksie złożonym.The properties in the query's filter should match those in composite index. Jeśli właściwość znajduje się w indeksie złożonym, ale nie jest uwzględniona w zapytaniu jako filtr, zapytanie nie będzie korzystać z indeksu złożonego.If a property is in the composite index but is not included in the query as a filter, the query will not utilize the composite index.
  • Jeśli zapytanie ma dodatkowe właściwości w filtrze, który nie został zdefiniowany w indeksie złożonym, wówczas do obliczenia zapytania zostanie użyta kombinacja indeksów złożonych i zakresów.If a query has additional properties in the filter that were not defined in a composite index, then a combination of composite and range indexes will be used to evaluate the query. Będzie to wymagało mniejszej liczby jednostek RU niż w przypadku używania indeksów zakresów.This will require fewer RU's than exclusively using range indexes.
  • Jeśli właściwość ma filtr zakresu ( > ,,, < <= >= lub != ), wówczas ta właściwość powinna być zdefiniowana jako Ostatnia w indeksie złożonym.If a property has a range filter (>, <, <=, >=, or !=), then this property should be defined last in the composite index. Jeśli zapytanie ma więcej niż jeden filtr zakresu, nie będzie używać indeksu złożonego.If a query has more than one range filter, it will not utilize the composite index.
  • Podczas tworzenia indeksu złożonego do optymalizowania zapytań z wieloma filtrami ORDER indeks złożony nie będzie miał wpływu na wyniki.When creating a composite index to optimize queries with multiple filters, the ORDER of the composite index will have no impact on the results. Ta właściwość jest opcjonalna.This property is optional.
  • Jeśli nie zdefiniujesz indeksu złożonego dla zapytania z filtrami dla wielu właściwości, zapytanie będzie nadal kończyło się pomyślnie.If you do not define a composite index for a query with filters on multiple properties, the query will still succeed. Koszt RU zapytania można jednak zmniejszyć przy użyciu indeksu złożonego.However, the RU cost of the query can be reduced with a composite index.
  • Zapytania z agregacjami (np. COUNT lub SUM) i filtry korzystają również z indeksów złożonych.Queries with both aggregates (for example, COUNT or SUM) and filters also benefit from composite indexes.

Rozważmy następujące przykłady, w których zdefiniowany jest indeks złożony w polu Nazwa właściwości, wiek i sygnatura czasowa:Consider the following examples where a composite index is defined on properties name, age, and timestamp:

Indeks złożonyComposite Index Przykładowe zapytanieSample Query Obsługiwane przez indeks złożony?Supported by Composite Index?
(name ASC, age ASC) SELECT * FROM c WHERE c.name = "John" AND c.age = 18 Yes
(name ASC, age ASC) SELECT * FROM c WHERE c.name = "John" AND c.age > 18 Yes
(name ASC, age ASC) SELECT COUNT(1) FROM c WHERE c.name = "John" AND c.age > 18 Yes
(name DESC, age ASC) SELECT * FROM c WHERE c.name = "John" AND c.age > 18 Yes
(name ASC, age ASC) SELECT * FROM c WHERE c.name != "John" AND c.age > 18 No
(name ASC, age ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" AND c.age = 18 AND c.timestamp > 123049923 Yes
(name ASC, age ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" AND c.age < 18 AND c.timestamp = 123049923 No

Zapytania z filtrem, a także z klauzulą ORDER BYQueries with a filter as well as an ORDER BY clause

Jeśli zapytanie filtruje dla jednej lub wielu właściwości i ma inne właściwości w klauzuli ORDER BY, może być pomocne dodanie właściwości w filtrze do ORDER BY klauzuli.If a query filters on one or more properties and has different properties in the ORDER BY clause, it may be helpful to add the properties in the filter to the ORDER BY clause.

Na przykład dodając właściwości w filtrze do klauzuli ORDER BY, można ponownie napisać następujące zapytanie, aby użyć złożonego indeksu:For example, by adding the properties in the filter to the ORDER BY clause, the following query could be rewritten to leverage a composite index:

Zapytanie przy użyciu indeksu zakresu:Query using range index:

SELECT * FROM c WHERE c.name = "John" ORDER BY c.timestamp

Zapytanie przy użyciu indeksu złożonego:Query using composite index:

SELECT * FROM c WHERE c.name = "John" ORDER BY c.name, c.timestamp

Te same optymalizacje wzorca i kwerendy mogą być uogólnione dla zapytań z wieloma filtrami równości:The same pattern and query optimizations can be generalized for queries with multiple equality filters:

Zapytanie przy użyciu indeksu zakresu:Query using range index:

SELECT * FROM c WHERE c.name = "John", c.age = 18 ORDER BY c.timestamp

Zapytanie przy użyciu indeksu złożonego:Query using composite index:

SELECT * FROM c WHERE c.name = "John", c.age = 18 ORDER BY c.name, c.age, c.timestamp

Poniższe zagadnienia są używane podczas tworzenia indeksów złożonych w celu optymalizacji zapytania z ORDER BY klauzulą Filter i:The following considerations are used when creating composite indexes to optimize a query with a filter and ORDER BY clause:

  • Jeśli zapytanie filtruje właściwości, należy je najpierw uwzględnić w ORDER BY klauzuli.If the query filters on properties, these should be included first in the ORDER BY clause.
  • Jeśli zapytanie jest filtrowane dla wielu właściwości, filtry równości muszą być pierwszymi właściwościami w ORDER BY klauzuliIf the query filters on multiple properties, the equality filters must be the first properties in the ORDER BY clause
  • Jeśli nie zdefiniujesz indeksu złożonego w zapytaniu z filtrem dla jednej właściwości i oddzielną ORDER BY klauzulą używającą innej właściwości, zapytanie będzie nadal kończyć się powodzeniem.If you do not define a composite index on a query with a filter on one property and a separate ORDER BY clause using a different property, the query will still succeed. Koszt RU zapytania można jednak zmniejszyć przy użyciu indeksu złożonego, szczególnie jeśli właściwość w ORDER BY klauzuli ma wysoką Kardynalność.However, the RU cost of the query can be reduced with a composite index, particularly if the property in the ORDER BY clause has a high cardinality.
  • Wszystkie zagadnienia dotyczące tworzenia indeksów złożonych dla ORDER BY zapytań z wieloma właściwościami, a także zapytania z filtrami dla wielu właściwości nadal mają zastosowanie.All considerations for creating composite indexes for ORDER BY queries with multiple properties as well as queries with filters on multiple properties still apply.
Indeks złożonyComposite Index Przykładowe ORDER BY zapytanieSample ORDER BY Query Obsługiwane przez indeks złożony?Supported by Composite Index?
(name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" ORDER BY c.name ASC, c.timestamp ASC Yes
(name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" AND c.timestamp > 1589840355 ORDER BY c.name ASC, c.timestamp ASC Yes
(timestamp ASC, name ASC) SELECT * FROM c WHERE c.timestamp > 1589840355 AND c.name = "John" ORDER BY c.timestamp ASC, c.name ASC No
(name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" ORDER BY c.timestamp ASC, c.name ASC No
(name ASC, timestamp ASC) SELECT * FROM c WHERE c.name = "John" ORDER BY c.timestamp ASC No
(age ASC, name ASC, timestamp ASC) SELECT * FROM c WHERE c.age = 18 and c.name = "John" ORDER BY c.age ASC, c.name ASC,c.timestamp ASC Yes
(age ASC, name ASC, timestamp ASC) SELECT * FROM c WHERE c.age = 18 and c.name = "John" ORDER BY c.timestamp ASC No

Modyfikowanie zasad indeksowaniaModifying the indexing policy

Zasady indeksowania kontenera można aktualizować w dowolnym momencie przy użyciu Azure Portal lub jednego z obsługiwanych zestawów SDK.A container's indexing policy can be updated at any time by using the Azure portal or one of the supported SDKs. Aktualizacja zasad indeksowania wyzwala transformację ze starego indeksu do nowego, który jest wykonywany w trybie online i w miejscu (dlatego w trakcie operacji nie jest używane dodatkowe miejsce do magazynowania).An update to the indexing policy triggers a transformation from the old index to the new one, which is performed online and in-place (so no additional storage space is consumed during the operation). Stare zasady indeksowania są efektywnie przekształcane w nowe zasady bez wpływu na dostępność zapisu, dostępność odczytu lub przepływność zainicjowaną na tym kontenerze.The old indexing policy is efficiently transformed to the new policy without affecting the write availability, read availability, or the throughput provisioned on the container. Przekształcanie indeksów jest operacją asynchroniczną i czas potrzebny do ukończenia zależy od przepływności, liczby elementów i ich rozmiaru.Index transformation is an asynchronous operation, and the time it takes to complete depends on the provisioned throughput, the number of items and their size.

Ważne

Przekształcanie indeksów to operacja, która zużywa jednostki żądania.Index transformation is an operation that consumes Request Units. Jednostki żądań zużywane przez transformację indeksu nie są obecnie rozliczane, jeśli używasz kontenerów bezserwerowych .Request Units consumed by an index transformation aren't currently billed if you are using serverless containers. Te jednostki żądania będą rozliczane, gdy bezserwerowy staną się ogólnie dostępne.These Request Units will get billed once serverless becomes generally available.

Uwaga

Istnieje możliwość śledzenia postępu transformacji indeksu przy użyciu jednego z zestawów SDK.It is possible to track the progress of index transformation by using one of the SDKs.

Nie ma to wpływu na zapisywanie dostępności podczas przekształcania indeksów.There is no impact to write availability during any index transformations. Przekształcenie indeksu używa zainicjowanego jednostek ru, ale ma niższy priorytet niż operacje CRUD lub zapytania.The index transformation uses your provisioned RUs but at a lower priority than your CRUD operations or queries.

Podczas dodawania nowego indeksu nie ma wpływu na dostępność.There is no impact to read availability when adding a new index. Zapytania będą korzystać tylko z nowych indeksów po zakończeniu przekształcania indeksu.Queries will only utilize new indexes once the index transformation is complete. Podczas przekształcania indeksu aparat zapytań będzie kontynuował korzystanie z istniejących indeksów, więc zobaczysz podobną wydajność odczytu podczas transformacji indeksowania do zaobserwowanego przed zainicjowaniem zmiany indeksowania.During the index transformation, the query engine will continue to use existing indexes, so you'll observe similar read performance during the indexing transformation to what you had observed before initiating the indexing change. Przy dodawaniu nowych indeksów nie jest również ryzykowne żadne niekompletne lub niespójne wyniki zapytania.When adding new indexes, there is also no risk of incomplete or inconsistent query results.

W przypadku usuwania indeksów i natychmiastowego uruchamiania zapytań, które odfiltrują się do usuniętych indeksów, nie istnieje gwarancja spójnych lub pełnych wyników zapytania.When removing indexes and immediately running queries that filter on the dropped indexes, there is not a guarantee of consistent or complete query results. W przypadku usunięcia wielu indeksów i przeprowadzenia tej operacji w ramach jednej pojedynczej zmiany zasad indeksowania aparat zapytań zapewnia spójne i kompletne wyniki w całej transformacji indeksu.If you remove multiple indexes and do so in one single indexing policy change, the query engine provides consistent and complete results throughout the index transformation. Jeśli jednak usuniesz indeksy przy użyciu wielu zmian zasad indeksowania, aparat zapytań nie będzie zapewniać spójnych ani kompletnych wyników do momentu zakończenia wszystkich przekształceń indeksu.However, if you remove indexes through multiple indexing policy changes, the query engine will not provide consistent or complete results until all index transformations complete. Większość deweloperów nie porzuca indeksów, a następnie natychmiast próbuje uruchomić zapytania, które używają tych indeksów, w przeciwnym razie ta sytuacja jest mało prawdopodobne.Most developers do not drop indexes and then immediately try to run queries that utilize these indexes so, in practice, this situation is unlikely.

Uwaga

Jeśli to możliwe, zawsze należy próbować grupować wiele zmian indeksowania w jedną modyfikację pojedynczej zasady indeksowaniaWhere possible, you should always try to group multiple indexing changes into one single indexing policy modification

Zasady indeksowania i czas wygaśnięciaIndexing policies and TTL

Korzystanie z funkcji Time-to-Live (TTL) wymaga indeksowania.Using the Time-to-Live (TTL) feature requires indexing. Oznacza to, że:This means that:

  • nie można aktywować czasu wygaśnięcia w kontenerze, w którym jest ustawiony tryb indeksowania none ,it is not possible to activate TTL on a container where the indexing mode is set to none,
  • nie można ustawić trybu indeksowania na brak w kontenerze, w którym jest aktywowany czas wygaśnięcia.it is not possible to set the indexing mode to None on a container where TTL is activated.

W przypadku scenariuszy, w których nie ma potrzeby indeksowania ścieżki właściwości, ale czas wygaśnięcia jest wymagany, można użyć zasad indeksowania z trybem indeksowania ustawionym na consistent , brak dołączonych ścieżek i /* jako jedynej wykluczonej ścieżki.For scenarios where no property path needs to be indexed, but TTL is required, you can use an indexing policy with an indexing mode set to consistent, no included paths, and /* as the only excluded path.

Następne krokiNext steps

Więcej informacji na temat indeksowania znajdziesz w następujących artykułach:Read more about the indexing in the following articles: