Hierarchiczne klucze partycji w usłudze Azure Cosmos DB
DOTYCZY: NoSQL
Usługa Azure Cosmos DB dystrybuuje dane między partycjami logicznymi i fizycznymi na podstawie kluczy partycji, aby obsługiwać skalowanie w poziomie. Korzystając z hierarchicznych kluczy partycji (nazywanych również podpartiowaniem), można skonfigurować maksymalnie trzypoziomową hierarchię kluczy partycji w celu dalszej optymalizacji dystrybucji danych i wyższego poziomu skalowania.
Jeśli obecnie używasz kluczy syntetycznych, masz scenariusze, w których klucze partycji mogą przekraczać 20 GB danych lub chcesz mieć pewność, że dokument każdej dzierżawy mapuje się na własną partycję logiczną, partycjonowanie może pomóc. Jeśli używasz tej funkcji, prefiksy kluczy partycji logicznej mogą przekraczać 20 GB i 10 000 jednostek żądania na sekundę (RU/s). Zapytania według prefiksu są efektywnie kierowane do podzestawu partycji, które przechowują dane.
Wybieranie hierarchicznych kluczy partycji
Jeśli masz aplikacje wielodostępne i obecnie izolujesz dzierżawy według klucza partycji, mogą być korzystne partycje hierarchiczne. Partycje hierarchiczne umożliwiają skalowanie poza limit klucza partycji logicznej 20 GB i jest dobrym rozwiązaniem, jeśli chcesz mieć pewność, że dokumenty poszczególnych dzierżaw mogą być skalowane w nieskończoność. Jeśli bieżący klucz partycji lub pojedynczy klucz partycji często osiąga 20 GB, partycje hierarchiczne są doskonałym wyborem dla obciążenia.
Jednak w zależności od charakteru obciążenia i kardynalnej wartości klucza pierwszego poziomu może istnieć pewne kompromisy, które szczegółowo omówimy na naszej stronie scenariuszy partycji hierarchicznych.
Podczas wybierania każdego poziomu klucza partycji hierarchicznej należy pamiętać o następujących ogólnych pojęciach dotyczących partycjonowania i zrozumieć, jak każdy z nich może mieć wpływ na obciążenie:
Dla wszystkich kontenerów każdy poziom pełnej ścieżki (począwszy od pierwszego poziomu) klucza partycji hierarchicznej powinien:
Mają wysoką kardynalność. Pierwsze, drugie i trzecie (jeśli dotyczy) klucze partycji hierarchicznej powinny mieć szeroki zakres możliwych wartości.
- Posiadanie niskiej kardynalności na pierwszym poziomie klucza partycji hierarchicznej ograniczy wszystkie operacje zapisu w czasie pozyskiwania tylko do jednej partycji fizycznej, dopóki nie osiągnie ona 50 GB i podzieli się na dwie partycje fizyczne. Załóżmy na przykład, że twój pierwszy klucz poziomu jest włączony
TenantId
i ma tylko 5 unikatowych dzierżaw. Każda z tych dzierżaw będzie mieć zakres tylko do jednej partycji fizycznej, ograniczając użycie przepływności tylko do tego, co znajduje się na tej partycji fizycznej. Dzieje się tak dlatego, że partycje hierarchiczne optymalizują wszystkie dokumenty z tym samym kluczem pierwszego poziomu, które mają być sortowane na tej samej partycji fizycznej, aby uniknąć zapytań o pełne fanout. - Chociaż może to być w porządku w przypadku obciążeń, w których jednorazowo pozyskujemy wszystkie dane dzierżawy, a następujące operacje są przede wszystkim ciężkie do odczytu, może to być nieidealne w przypadku obciążeń, w których wymagania biznesowe obejmują pozyskiwanie danych w określonym czasie. Jeśli na przykład masz ścisłe wymagania biznesowe, aby uniknąć opóźnień, maksymalna przepływność obciążenia może teoretycznie osiągnąć w celu pozyskiwania danych, to liczba partycji fizycznych * 10 tys. Jeśli klucz najwyższego poziomu ma niską kardynalność, liczba partycji fizycznych prawdopodobnie będzie wynosić 1, chyba że istnieje wystarczająca ilość danych dla klucza poziomu 1, aby można je było rozłożyć na wiele partycji po podziałach, które mogą potrwać od 4 do 6 godzin.
- Posiadanie niskiej kardynalności na pierwszym poziomie klucza partycji hierarchicznej ograniczy wszystkie operacje zapisu w czasie pozyskiwania tylko do jednej partycji fizycznej, dopóki nie osiągnie ona 50 GB i podzieli się na dwie partycje fizyczne. Załóżmy na przykład, że twój pierwszy klucz poziomu jest włączony
Równomierne rozłożenie użycia jednostek żądań (RU) i magazynu danych we wszystkich partycjach logicznych. Dzięki temu równomierne użycie jednostek ŻĄDANIA i dystrybucja magazynu między partycjami fizycznymi.
- Jeśli wybierzesz klucz pierwszego poziomu, który wydaje się mieć wysoką kardynalność, na
UserId
przykład , ale w praktyce obciążenie wykonuje operacje tylko na jednym konkretnymUserId
, prawdopodobnie wystąpi gorąca partycja, ponieważ wszystkie operacje będą ograniczone do tylko jednej lub kilku partycji fizycznych.
- Jeśli wybierzesz klucz pierwszego poziomu, który wydaje się mieć wysoką kardynalność, na
Obciążenia z dużym obciążeniem: zalecamy wybranie hierarchicznych kluczy partycji, które są często wyświetlane w zapytaniach.
- Na przykład obciążenie, które często uruchamia zapytania w celu odfiltrowania określonych sesji użytkownika w aplikacji wielodostępnej, może korzystać z hierarchicznych kluczy
TenantId
partycji ,UserId
iSessionId
, w tej kolejności. Zapytania mogą być efektywnie kierowane tylko do odpowiednich partycji fizycznych, uwzględniając klucz partycji w predykacie filtru. Aby uzyskać więcej informacji na temat wybierania kluczy partycji dla obciążeń wymagających odczytu, zobacz omówienie partycjonowania.
- Na przykład obciążenie, które często uruchamia zapytania w celu odfiltrowania określonych sesji użytkownika w aplikacji wielodostępnej, może korzystać z hierarchicznych kluczy
Obciążenia z dużym obciążeniem zapisu: zalecamy użycie wysokiej wartości kardynalnej dla pierwszego poziomu klucza partycji hierarchicznej. Wysoka kardynalność oznacza, że klucz pierwszego poziomu (a także kolejne poziomy) ma co najmniej tysiące unikatowych wartości i więcej unikatowych wartości niż liczba partycji fizycznych.
Załóżmy na przykład, że mamy obciążenie, które izoluje dzierżawy według klucza partycji i ma kilka dużych dzierżaw, które są bardziej duże niż inne. Obecnie usługa Azure Cosmos DB przestanie pozyskiwać dane na dowolnej wartości klucza partycji, jeśli przekroczy 20 GB danych. W tym obciążeniu firmy Microsoft i Contoso są dużymi dzierżawami i przewidujemy, że rośnie znacznie szybciej niż inne dzierżawy. Aby uniknąć ryzyka braku możliwości pozyskiwania danych dla tych dzierżaw, hierarchiczne klucze partycji umożliwiają skalowanie tych dzierżaw poza limitem 20 GB. Możemy dodać więcej poziomów, takich jak UserId i SessionId, aby zapewnić większą skalowalność między dzierżawami.
Aby upewnić się, że obciążenie może pomieścić zapisy dla wszystkich dokumentów z tym samym kluczem pierwszego poziomu, rozważ użycie identyfikatora elementu jako klucza drugiego lub trzeciego poziomu.
Jeśli pierwszy poziom nie ma wysokiej kardynalności i obecnie osiągasz limit partycji logicznej 20 GB dla klucza partycji, sugerujemy użycie syntetycznego klucza partycji zamiast hierarchicznego klucza partycji.
Przykładowy przypadek użycia
Załóżmy, że masz scenariusz wielodostępny, w którym przechowujesz informacje o zdarzeniach dla użytkowników w każdej dzierżawie. Informacje o zdarzeniu mogą zawierać wystąpienia zdarzeń, w tym logowania, strumienia kliknięć lub zdarzeń płatności.
W rzeczywistym scenariuszu niektóre dzierżawy mogą rosnąć duże, z tysiącami użytkowników, podczas gdy wiele innych dzierżaw jest mniejszych i ma kilku użytkowników. Partycjonowanie przez /TenantId
może prowadzić do przekroczenia limitu magazynu 20 GB usługi Azure Cosmos DB na pojedynczej partycji logicznej. Partycjonowanie według /UserId
powoduje, że wszystkie zapytania w dzierżawie są podzielone na partycje. Oba podejścia mają znaczące wady.
Użycie syntetycznego klucza partycji, który łączy TenantId
i UserId
zwiększa złożoność aplikacji. Ponadto syntetyczne zapytania dotyczące klucza partycji dla dzierżawy są nadal między partycjami, chyba że wszyscy użytkownicy są znani i określeni z wyprzedzeniem.
Jeśli obciążenie ma dzierżawy z mniej więcej tymi samymi wzorcami obciążeń, może pomóc hierarchiczny klucz partycji. Za pomocą hierarchicznych kluczy partycji można najpierw podzielić partycje na TenantId
, a następnie na UserId
. Jeśli oczekujesz, że kombinacja TenantId
i UserId
spowoduje wygenerowanie partycji przekraczających 20 GB, możesz jeszcze bardziej podzielić partycje na inny poziom, na przykład na .SessionId
Ogólna głębokość nie może przekraczać trzech poziomów. Gdy partycja fizyczna przekracza 50 GB magazynu, usługa Azure Cosmos DB automatycznie dzieli partycję fizyczną, tak aby około połowa danych była na jednej partycji fizycznej, a połowa jest na drugiej. Efektywnie dzielenie na części oznacza, że pojedyncza TenantId
wartość może przekroczyć 20 GB danych i możliwe TenantId
jest, aby dane obejmowały wiele partycji fizycznych.
Zapytania określające TenantId
zarówno , jak TenantId
i i UserId
, są efektywnie kierowane tylko do podzbioru partycji fizycznych zawierających odpowiednie dane. Efektywne określanie pełnej lub prefiksowej ścieżki klucza partycji podrzędnej pozwala uniknąć pełnego zapytania fan-out. Jeśli na przykład kontener miał 1000 partycji fizycznych, ale określona TenantId
wartość była tylko na 5 partycjach fizycznych, zapytanie zostanie przekierowane do mniejszej liczby odpowiednich partycji fizycznych.
Używanie identyfikatora elementu w hierarchii
Jeśli kontener ma właściwość, która ma duży zakres możliwych wartości, właściwość prawdopodobnie jest doskonałym wyborem klucza partycji dla ostatniego poziomu hierarchii. Jednym z możliwych przykładów tej właściwości jest identyfikator elementu. Identyfikator elementu właściwości systemu istnieje w każdym elemencie w kontenerze. Dodanie identyfikatora elementu jako innego poziomu gwarantuje, że można skalować poza limit klucza partycji logicznej 20 GB. Można skalować poza ten limit dla pierwszego poziomu lub dla pierwszego i drugiego poziomu kluczy.
Na przykład może istnieć kontener dla obciążenia wielodostępnego podzielonego na partycje według TenantId
i UserId
. Jeśli istnieje możliwość użycia pojedynczej kombinacji wartości i UserId
przekroczenia TenantId
20 GB, zalecamy partycjonowanie przy użyciu trzech poziomów kluczy, w których klucz trzeciego poziomu ma wysoką kardynalność. Przykładem tego scenariusza jest to, że klucz trzeciego poziomu jest identyfikatorem GUID, który ma naturalnie wysoką kardynalność. Jest mało prawdopodobne, że kombinacja , TenantId
UserId
i identyfikator GUID przekracza 20 GB, więc kombinacja TenantId
i UserId
może skutecznie skalować ponad 20 GB.
Aby uzyskać więcej informacji na temat używania identyfikatora elementu jako klucza partycji, zobacz omówienie partycjonowania.
Rozpocznij
Ważne
Praca z kontenerami korzystającymi z hierarchicznych kluczy partycji jest obsługiwana tylko w następujących wersjach zestawu SDK. Należy użyć obsługiwanego zestawu SDK, aby utworzyć nowe kontenery z hierarchicznymi kluczami partycji oraz wykonać operacje tworzenia, odczytu, aktualizowania i usuwania (CRUD) lub wykonywania zapytań na danych. Jeśli chcesz użyć zestawu SDK lub łącznika, który nie jest obecnie obsługiwany, zgłoś żądanie na naszym forum społeczności.
Znajdź najnowszą wersję zapoznawcza każdego obsługiwanego zestawu SDK:
SDK | Obsługiwane wersje | Link menedżera pakietów |
---|---|---|
.NET SDK 3 | >= 3.33.0 | https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.33.0/ |
Java SDK 4 | >= 4.42.0 | https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/cosmos/azure-cosmos/CHANGELOG.md#4420-2023-03-17/ |
Zestaw JavaScript SDK w wersji 4 | 4.0.0 | https://www.npmjs.com/package/@azure/cosmos/ |
Zestaw SDK dla języka Python | >= 4.6.0 | https://pypi.org/project/azure-cosmos/4.6.0/ |
Tworzenie kontenera przy użyciu hierarchicznych kluczy partycji
Aby rozpocząć, utwórz nowy kontener przy użyciu wstępnie zdefiniowanej listy ścieżek kluczy partycjonowania do trzech poziomów głębokości.
Nowy kontener można utworzyć przy użyciu jednej z następujących opcji:
- Azure Portal
- SDK
- Szablon usługi Azure Resource Manager
- Instalowanie i używanie emulatora usługi Azure Cosmos DB do lokalnego programowania i testowania
Azure Portal
Najprostszym sposobem utworzenia kontenera i określenia hierarchicznych kluczy partycji jest użycie witryny Azure Portal.
Zaloguj się w witrynie Azure Portal.
Przejdź do istniejącej strony konta usługi Azure Cosmos DB for NoSQL.
W menu po lewej stronie wybierz pozycję Eksplorator danych.
W Eksploratorze danych wybierz opcję Nowy kontener .
W polu Nowy kontener w polu Klucz partycji wprowadź wartość
/TenantId
. W pozostałych polach wprowadź dowolną wartość zgodną ze scenariuszem.Uwaga
W tym przykładzie użyto
/TenantId
metody . Podczas implementowania hierarchicznych kluczy partycji we własnych kontenerach można określić dowolny klucz pierwszego poziomu.Wybierz dwukrotnie pozycję Dodaj hierarchiczny klucz partycji.
W przypadku drugiej i trzeciej warstwy partycjonowania wprowadź odpowiednio wartości
/UserId
i/SessionId
.Wybierz przycisk OK, aby utworzyć kontener.
SDK
Podczas tworzenia nowego kontenera przy użyciu zestawu SDK zdefiniuj listę ścieżek kluczy partycjonowania do trzech poziomów głębokości. Podczas konfigurowania właściwości nowego kontenera użyj listy kluczy części podrzędnych.
- Zestaw .NET SDK w wersji 3
- Zestaw Java SDK w wersji 4
- Zestaw JavaScript SDK w wersji 4
- Zestaw SDK dla języka Python
// List of partition keys, in hierarchical order. You can have up to three levels of keys.
List<string> subpartitionKeyPaths = new List<string> {
"/TenantId",
"/UserId",
"/SessionId"
};
// Create a container properties object
ContainerProperties containerProperties = new ContainerProperties(
id: "<container-name>",
partitionKeyPaths: subpartitionKeyPaths
);
// Create a container that's subpartitioned by TenantId > UserId > SessionId
Container container = await database.CreateContainerIfNotExistsAsync(containerProperties, throughput: 400);
Szablony usługi Azure Resource Manager
Szablon usługi Azure Resource Manager dla kontenera z podpartycją jest niemal identyczny ze standardowym kontenerem. Jedyną kluczową różnicą jest wartość ścieżki properties/partitionKey
. Aby uzyskać więcej informacji na temat tworzenia szablonu usługi Azure Resource Manager dla zasobu usługi Azure Cosmos DB, zobacz dokumentację szablonu usługi Azure Resource Manager dla usługi Azure Cosmos DB.
partitionKey
Skonfiguruj obiekt przy użyciu wartości w poniższej tabeli, aby utworzyć kontener z podziałem na części:
Ścieżka | Wartość |
---|---|
paths |
Lista hierarchicznych kluczy partycji (maksymalnie trzy poziomy głębokości) |
kind |
MultiHash |
version |
2 |
Przykładowa definicja klucza partycji
Załóżmy na przykład, że masz hierarchiczny klucz partycji składający się z TenantId
>>UserId
SessionId
elementu . Obiekt partitionKey
zostanie skonfigurowany tak, aby zawierał wszystkie trzy wartości we paths
właściwości, kind
wartość MultiHash
i version
wartość 2
.
partitionKey: {
paths: [
'/TenantId'
'/UserId'
'/SessionId'
]
kind: 'MultiHash'
version: 2
}
Aby uzyskać więcej informacji na temat partitionKey
obiektu, zobacz specyfikację ContainerPartitionKey.
Instalowanie i używanie emulatora usługi Azure Cosmos DB do lokalnego programowania i testowania
Funkcję partycjonowania można przetestować przy użyciu najnowszej wersji lokalnego emulatora usługi Azure Cosmos DB. Aby włączyć podparowanie w emulatorze, uruchom emulator z katalogu instalacyjnego z flagą /EnablePreview
:
.\CosmosDB.Emulator.exe /EnablePreview
Ostrzeżenie
Emulator nie obsługuje obecnie wszystkich funkcji klucza partycji hiearchical jako portalu. Emulator obecnie nie obsługuje następujących funkcji:
- Tworzenie kontenerów z hierarchicznymi kluczami partycji za pomocą Eksploratora danych
- Przechodzenie do elementów za pomocą eksploratora danych i interakcja z nimi przy użyciu hierarchicznych kluczy partycji
Aby uzyskać więcej informacji, zobacz Emulator usługi Azure Cosmos DB.
Używanie zestawów SDK do pracy z kontenerami z hierarchicznymi kluczami partycji
Jeśli masz kontener z hierarchicznymi kluczami partycji, użyj wcześniej określonych wersji zestawów SDK platformy .NET lub Java do wykonywania operacji i wykonywania zapytań w tym kontenerze.
Dodawanie elementu do kontenera
Istnieją dwie opcje dodawania nowego elementu do kontenera z włączonymi hierarchicznymi kluczami partycji:
- Automatyczne wyodrębnianie
- Ręczne określanie ścieżki
Automatyczne wyodrębnianie
Jeśli przekażesz obiekt z ustawioną wartością klucza partycji, zestaw SDK będzie mógł automatycznie wyodrębnić pełną ścieżkę klucza partycji.
- Zestaw .NET SDK w wersji 3
- Zestaw Java SDK w wersji 4
- Zestaw JavaScript SDK w wersji 4
- Zestaw SDK dla języka Python
// Create a new item
UserSession item = new UserSession()
{
id = "f7da01b0-090b-41d2-8416-dacae09fbb4a",
TenantId = "Microsoft",
UserId = "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
SessionId = "0000-11-0000-1111"
};
// Pass in the object, and the SDK automatically extracts the full partition key path
ItemResponse<UserSession> createResponse = await container.CreateItemAsync(item);
Ręczne określanie ścieżki
Klasa PartitionKeyBuilder
w zestawie SDK może utworzyć wartość dla wcześniej zdefiniowanej hierarchicznej ścieżki klucza partycji. Ta klasa jest używana podczas dodawania nowego elementu do kontenera z włączoną podpartycją.
Napiwek
Na dużą skalę wydajność może zostać poprawiona, jeśli określisz pełną ścieżkę klucza partycji, nawet jeśli zestaw SDK może wyodrębnić ścieżkę z obiektu.
- Zestaw .NET SDK w wersji 3
- Zestaw Java SDK w wersji 4
- Zestaw JavaScript SDK w wersji 4
- Zestaw SDK dla języka Python
// Create a new item object
PaymentEvent item = new PaymentEvent()
{
id = Guid.NewGuid().ToString(),
TenantId = "Microsoft",
UserId = "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
SessionId = "0000-11-0000-1111"
};
// Specify the full partition key path when creating the item
PartitionKey partitionKey = new PartitionKeyBuilder()
.Add(item.TenantId)
.Add(item.UserId)
.Add(item.SessionId)
.Build();
// Create the item in the container
ItemResponse<PaymentEvent> createResponse = await container.CreateItemAsync(item, partitionKey);
Wykonywanie wyszukiwania klucza/wartości (odczyt punktu) elementu
Wyszukiwania klucz/wartość (odczyty punktów) są wykonywane w sposób podobny do kontenera niepartycyjnego. Załóżmy na przykład, że masz hierarchiczny klucz partycji składający się z TenantId
>>UserId
SessionId
elementu . Unikatowy identyfikator elementu to identyfikator GUID. Jest reprezentowana jako ciąg, który służy jako unikatowy identyfikator transakcji dokumentu. Aby wykonać odczyt punktu dla pojedynczego elementu, przekaż id
właściwość elementu i pełną wartość klucza partycji, w tym wszystkie trzy składniki ścieżki.
- Zestaw .NET SDK w wersji 3
- Zestaw Java SDK w wersji 4
- Zestaw JavaScript SDK w wersji 4
- Zestaw SDK dla języka Python
// Store the unique identifier
string id = "f7da01b0-090b-41d2-8416-dacae09fbb4a";
// Build the full partition key path
PartitionKey partitionKey = new PartitionKeyBuilder()
.Add("Microsoft") //TenantId
.Add("00aa00aa-bb11-cc22-dd33-44ee44ee44ee") //UserId
.Add("0000-11-0000-1111") //SessionId
.Build();
// Perform a point read
ItemResponse<UserSession> readResponse = await container.ReadItemAsync<UserSession>(
id,
partitionKey
);
Uruchamianie zapytania
Kod zestawu SDK używany do uruchamiania zapytania w kontenerze z podpartycją jest identyczny z uruchamianiem zapytania w kontenerze niepartycyjnym.
Gdy zapytanie określa wszystkie wartości kluczy partycji w filtrze WHERE
lub w prefiksie hierarchii kluczy, zestaw SDK automatycznie kieruje zapytanie do odpowiednich partycji fizycznych. Zapytania, które zapewniają tylko "środek" hierarchii, to zapytania obejmujące wiele partycji.
Rozważmy na przykład hierarchiczny klucz partycji składający się z TenantId
>>UserId
SessionId
elementu . Składniki filtru zapytania określają, czy zapytanie jest zapytaniem z jedną partycją, docelowym zapytaniem między partycjami lub zapytaniem fan-out.
Query | Routing |
---|---|
SELECT * FROM c WHERE c.TenantId = 'Microsoft' AND c.UserId = '00aa00aa-bb11-cc22-dd33-44ee44ee44ee' AND c.SessionId = '0000-11-0000-1111' |
Kierowany do pojedynczej partycji logicznej i fizycznej zawierającej dane dla określonych wartości TenantId , UserId i SessionId . |
SELECT * FROM c WHERE c.TenantId = 'Microsoft' AND c.UserId = '00aa00aa-bb11-cc22-dd33-44ee44ee44ee' |
Kierowany do tylko docelowego podzestawu partycji logicznych i fizycznych, które zawierają dane dla określonych wartości TenantId i UserId . To zapytanie jest docelowym zapytaniem między partycjami, które zwraca dane dla określonego użytkownika w dzierżawie. |
SELECT * FROM c WHERE c.TenantId = 'Microsoft' |
Kierowany do tylko docelowego podzestawu partycji logicznych i fizycznych, które zawierają dane dla określonej wartości TenantId . To zapytanie jest docelowym zapytaniem między partycjami, które zwraca dane dla wszystkich użytkowników w dzierżawie. |
SELECT * FROM c WHERE c.UserId = '00aa00aa-bb11-cc22-dd33-44ee44ee44ee' |
Kierowany do wszystkich partycji fizycznych, co powoduje utworzenie zapytania obejmującego wiele partycji. |
SELECT * FROM c WHERE c.SessionId = '0000-11-0000-1111' |
Kierowany do wszystkich partycji fizycznych, co powoduje utworzenie zapytania obejmującego wiele partycji. |
Zapytanie z jedną partycją w kontenerze podzielonym na części
Oto przykład uruchamiania zapytania zawierającego wszystkie poziomy partycjonowania, co skutecznie czyni zapytanie zapytaniem z jedną partycją.
- Zestaw .NET SDK w wersji 3
- Zestaw Java SDK w wersji 4
- Zestaw JavaScript SDK w wersji 4
- Zestaw SDK dla języka Python
// Define a single-partition query that specifies the full partition key path
QueryDefinition query = new QueryDefinition(
"SELECT * FROM c WHERE c.TenantId = @tenant-id AND c.UserId = @user-id AND c.SessionId = @session-id")
.WithParameter("@tenant-id", "Microsoft")
.WithParameter("@user-id", "00aa00aa-bb11-cc22-dd33-44ee44ee44ee")
.WithParameter("@session-id", "0000-11-0000-1111");
// Retrieve an iterator for the result set
using FeedIterator<PaymentEvent> results = container.GetItemQueryIterator<PaymentEvent>(query);
while (results.HasMoreResults)
{
FeedResponse<UserSession> resultsPage = await resultSet.ReadNextAsync();
foreach(UserSession result in resultsPage)
{
// Process result
}
}
Docelowe zapytanie obejmujące wiele partycji w kontenerze podzielonym na części
Oto przykład zapytania zawierającego podzbiór poziomów partycjonowania, co skutecznie czyni to zapytanie zapytaniem docelowym zapytaniem z wieloma partycjami.
- Zestaw .NET SDK w wersji 3
- Zestaw Java SDK w wersji 4
- Zestaw JavaScript SDK w wersji 4
- Zestaw SDK dla języka Python
// Define a targeted cross-partition query specifying prefix path[s]
QueryDefinition query = new QueryDefinition(
"SELECT * FROM c WHERE c.TenantId = @tenant-id")
.WithParameter("@tenant-id", "Microsoft")
// Retrieve an iterator for the result set
using FeedIterator<PaymentEvent> results = container.GetItemQueryIterator<PaymentEvent>(query);
while (results.HasMoreResults)
{
FeedResponse<UserSession> resultsPage = await resultSet.ReadNextAsync();
foreach(UserSession result in resultsPage)
{
// Process result
}
}
Ograniczenia i znane problemy
- Praca z kontenerami korzystającymi z hierarchicznych kluczy partycji jest obsługiwana tylko w zestawie SDK platformy .NET w wersji 3, w zestawie SDK języka Java w wersji 4, w zestawie SDK języka Python i w wersji zapoznawczej zestawu SDK języka JavaScript. Należy użyć obsługiwanego zestawu SDK, aby utworzyć nowe kontenery z hierarchicznymi kluczami partycji oraz wykonać operacje CRUD lub wykonywania zapytań na danych. Obsługa innych zestawów SDK, w tym języka Python, nie jest obecnie dostępna.
- Istnieją ograniczenia dotyczące różnych łączników usługi Azure Cosmos DB (na przykład w usłudze Azure Data Factory).
- Można określić hierarchiczne klucze partycji tylko do trzech warstw w głębi systemu.
- Hierarchiczne klucze partycji można obecnie włączać tylko w nowych kontenerach. Należy ustawić ścieżki klucza partycji w momencie tworzenia kontenera i nie można ich później zmienić. Aby używać partycji hierarchicznych w istniejących kontenerach, utwórz nowy kontener z ustawionymi hierarchicznymi kluczami partycji i przenieś dane przy użyciu zadań kopiowania kontenera.
- Hierarchiczne klucze partycji są obecnie obsługiwane tylko dla interfejsu API dla kont NoSQL. Interfejsy API dla baz danych MongoDB i Cassandra nie są obecnie obsługiwane.
- Hierarchiczne klucze partycji nie są obecnie obsługiwane przez funkcję użytkowników i uprawnień. Nie można przypisać uprawnienia do częściowego prefiksu ścieżki klucza partycji hierarchicznej. Uprawnienia można przypisać tylko do całej ścieżki klucza partycji logicznej. Na przykład jeśli masz partycjonowane według
TenantId
— >UserId
, nie możesz przypisać uprawnienia, które jest dla określonej wartościTenantId
. Można jednak przypisać uprawnienie dla klucza partycji, jeśli określisz zarówno wartość dlaTenantId
, jak i "UserId".
Następne kroki
- Zobacz często zadawane pytania dotyczące hierarchicznych kluczy partycji.
- Dowiedz się więcej na temat partycjonowania w usłudze Azure Cosmos DB.
- Dowiedz się więcej o korzystaniu z szablonów usługi Azure Resource Manager w usłudze Azure Cosmos DB.