Sdílet prostřednictvím


Dotazování kontejneru Služby Azure Cosmos DB

PLATÍ PRO: NoSQL

Tento článek vysvětluje, jak dotazovat kontejner (kolekci, graf nebo tabulku) ve službě Azure Cosmos DB. Konkrétně se zabývá fungováním dotazů na oddíly a mezi oddíly ve službě Azure Cosmos DB.

Dotaz v rámci oddílu

Pokud dotazujete data z kontejnerů a pokud má dotaz zadaný filtr klíče oddílu, Azure Cosmos DB dotaz automaticky optimalizuje. Směruje dotaz do fyzických oddílů odpovídajících hodnotám klíče oddílu zadaným ve filtru.

Představte si například následující dotaz s filtrem rovnosti pro DeviceId. Pokud tento dotaz spustíme v kontejneru rozděleného na DeviceId, vyfiltruje se tento dotaz na jeden fyzický oddíl.

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001'

Stejně jako v předchozím příkladu i tento dotaz filtruje na jeden oddíl. Přidání filtru na Location nezmění následující dotaz:

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001' AND c.Location = 'Seattle'

Tady je dotaz, který má filtr rozsahu pro klíč oddílu a nebude vymezený na jeden fyzický oddíl. Aby se dotaz mohl stát dotazem v oddílu, musí mít filtr rovnosti, který obsahuje klíč oddílu:

SELECT * FROM c WHERE c.DeviceId > 'XMS-0001'

Dotazování napříč oddíly

Následující dotaz nemá filtr na klíč oddílu (DeviceId). Proto musí být rozdmýchaný do všech fyzických oddílů, kde se spouští proti indexu jednotlivých oddílů:

SELECT * FROM c WHERE c.Location = 'Seattle`

Každý fyzický oddíl má vlastní index. Proto při spuštění dotazu mezi oddíly v kontejneru ve skutečnosti spouštíte jeden dotaz na každý fyzický oddíl. Azure Cosmos DB automaticky agreguje výsledky napříč různými fyzickými oddíly.

Indexy v různých fyzických oddílech jsou na sobě nezávislé. Ve službě Azure Cosmos DB není žádný globální index.

Paralelní dotazování napříč oddíly

Sady SDK služby Azure Cosmos DB verze 1.9.0 a novější podporují možnosti paralelního spouštění dotazů. Paralelní dotazy napříč oddíly umožňují provádět dotazy napříč oddíly s nízkou latencí.

Paralelní provádění dotazů můžete spravovat laděním následujících parametrů:

  • MaxConcurrency: Nastaví maximální počet současných síťových připojení k oddílům kontejneru. Pokud nastavíte tuto vlastnost na -1, sada SDK spravuje stupeň paralelismu. MaxConcurrency Pokud je hodnota nastavená na 0, existuje jedno síťové připojení k oddílům kontejneru.

  • MaxBufferedItemCount: Vyvažuje latenci dotazů a využití paměti na straně klienta. Pokud je tato možnost vynechána nebo je nastavena na hodnotu -1, sada SDK spravuje počet položek v vyrovnávací paměti během paralelního provádění dotazů.

Vzhledem k tomu, že služba Azure Cosmos DB dokáže paralelizovat dotazy mezi oddíly, latence dotazů se obecně škáluje a systém přidává fyzické oddíly. Poplatky za RU se ale výrazně zvyšují s tím, jak se zvyšuje celkový počet fyzických oddílů.

Při spuštění dotazu mezi oddíly provádíte v podstatě samostatný dotaz na jednotlivé fyzické oddíly. I když dotazy napříč oddíly používají index, pokud jsou k dispozici, nejsou zdaleka tak efektivní jako dotazy v rámci oddílů.

Užitečný příklad

Tady je analogie pro lepší vysvětlení dotazů mezi oddíly:

Představte si, že jste řidič doručení, který musí doručovat balíčky do různých apartmánových komplexů. Každý apartmánový komplex má v prostorách seznam, který obsahuje všechna čísla jednotek obyvatel. Jednotlivé apartmánové komplexy můžeme porovnat s fyzickým oddílem a každý seznam s indexem fyzického oddílu.

Pomocí tohoto příkladu můžeme porovnat dotazy na oddíly a dotazy napříč oddíly:

Dotaz v oddílu (příklad)

Pokud řidič dodávky zná správný byt komplex (fyzický oddíl), pak může okamžitě dojet do správné budovy. Řidič může zkontrolovat seznam jednotek obyvatel v apartmánovém komplexu (index) a rychle doručit příslušné balíčky. V tomto případě řidič neztrácejí čas ani úsilí autem do apartmánového komplexu, aby zkontroloval, jestli tam žijí příjemci balíčku.

Dotaz mezi oddíly (fan-out)

Pokud řidič dodávky nezná správný apartmánový komplex (fyzický oddíl), musí jet do každého jednotlivého bytového domu a zkontrolovat seznam se všemi čísly jednotek obyvatel (indexem). Jakmile řidič dorazí do každého apartmánového komplexu, bude moct dál používat seznam adres jednotlivých obyvatel. Musí však zkontrolovat seznam všech apartmánových komplexů, zda tam žijí příjemci balíčků, nebo ne. V tomto příkladu fungují dotazy napříč oddíly. I když můžou index používat (to znamená, že nemusí klepat na všechny dveře), musí index samostatně kontrolovat pro každý fyzický oddíl.

Dotaz mezi oddíly (vymezený pouze na několik fyzických oddílů)

Pokud řidič doručení ví, že všichni příjemci balíku žijí v určitých několika apartmánových komplexech, nemusí jet ke každému. Zatímco jízda do několika apartmánových komplexů stále vyžaduje více práce než návštěva jen jedné budovy, řidič dodávky stále šetří značný čas a úsilí. Pokud má dotaz ve svém filtru klíč oddílu s klíčovým slovem IN , zkontroluje pouze indexy příslušného fyzického oddílu na data.

Vyhněte se dotazům napříč oddíly

U většiny kontejnerů je několik dotazů mezi oddíly nevyhnutelné, což je v pořádku. Téměř všechny operace dotazů jsou podporovány napříč oddíly, a to jak pro klíče logických oddílů, tak pro fyzické oddíly. Azure Cosmos DB má také řadu optimalizací v dotazovacím stroji a klientských sadách SDK pro paralelizaci spouštění dotazů napříč fyzickými oddíly.

U většiny scénářů náročných na čtení doporučujeme ve filtrech dotazů vybrat nejběžnější vlastnost. Měli byste také zajistit, aby klíč oddílu dodržoval další osvědčené postupy pro výběr klíče oddílu.

Vyhněte se dotazům napříč oddíly obvykle záleží jenom na velkých kontejnerech. Při každé kontrole indexu fyzického oddílu se vám bude účtovat minimálně 2,5 RU, a to i v případě, že žádné položky ve fyzickém oddílu neodpovídají filtru dotazu. Pokud tedy máte jenom jeden (nebo jen několik) fyzických oddílů, nespotřebovávají dotazy mezi oddíly výrazně více RU než dotazy v rámci oddílů.

Počet fyzických oddílů je vázán na množství zřízených RU. Každý fyzický oddíl umožňuje až 10 000 zřízených RU a může ukládat až 50 GB dat. Azure Cosmos DB za vás automaticky spravuje fyzické oddíly. Počet fyzických oddílů v kontejneru závisí na zřízené propustnosti a spotřebovaném úložišti.

Pokud vaše úloha splňuje následující kritéria, měli byste se vyhnout dotazům napříč oddíly:

  • Plánujete mít zřízené více než 30 000 RU.
  • Plánujete uložit více než 100 GB dat.

Další kroky

Informace o dělení ve službě Azure Cosmos DB najdete v následujících článcích: