Sdílet prostřednictvím


Dotazování kontejneru Azure Cosmos DB

PLATÍ PRO: NoSQL

Tento článek vysvětluje, jak dotazovat data (například kolekci, graf nebo tabulku) v rámci kontejneru ve službě Azure Cosmos DB. Konkrétně se zabývá fungováním dotazů v oddílu a napříč oddíly ve službě Azure Cosmos DB.

Dotaz v rámci oddílu

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

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

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

Stejně jako v předchozím příkladu tento dotaz také filtruje na jeden oddíl. Když přidáte filtr, Location nezmění se 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 byl dotaz v oddílu, musí mít dotaz 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 pro klíč oddílu (DeviceId). Proto se musí rozdýchat do všech fyzických oddílů, ve kterých se spouští proti indexu každého oddílu:

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

Každý fyzický oddíl má svůj vlastní index. Proto při spuštění dotazu napříč oddíly v kontejneru efektivně spouštíte jeden dotaz na 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 vzájemně nezávislé. Ve službě Azure Cosmos DB neexistuje výchozí globální index.

Optimalizace dotazů napříč oddíly s využitím globálních sekundárních indexů

Globální sekundární indexy (Preview) poskytují alternativní přístup, abyste se vyhnuli dotazům napříč oddíly beze změny klíče oddílu kontejneru. Globální sekundární index vytvoří samostatný, automaticky synchronizovaný kontejner s jiným klíčem oddílu optimalizovaným pro konkrétní vzory dotazů.

Pokud je například kontejner particionovaný DeviceId, ale často dotazujete podle Location, můžete vytvořit globální sekundární index particionovaný Location. Dotaz, který byl dříve dotazem napříč oddíly, se teď dá spustit jako dotaz v oddílu proti globálnímu sekundárnímu indexu:

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

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

Sady SDK služby Azure Cosmos DB 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 souběžných síťových připojení k oddílům kontejneru. Pokud tuto vlastnost nastavíte na hodnotu -1, sada SDK spravuje stupeň paralelismu. MaxConcurrency Pokud je nastavená hodnota 0, existuje jedno síťové připojení k oddílům kontejneru.

  • MaxBufferedItemCount: Obchoduje s latencí dotazů a využitím paměti na straně klienta. Pokud tuto možnost vynecháte nebo nastavíte na -1, SDK spravuje počet položek ve vyrovnávací paměti během paralelního vykonávání dotazů.

Kvůli schopnosti služby Azure Cosmos DB paralelizovat dotazy napříč oddíly, latence dotazů se obecně škáluje a systém přidává fyzické oddíly. Poplatky za jednotky žádostí (RU) se ale výrazně zvyšují, protože se zvyšuje celkový počet fyzických oddílů.

Když spustíte dotaz napříč oddíly, v podstatě provádíte samostatný dotaz na jednotlivé fyzické oddíly. I když dotazy napříč oddíly používají index, pokud jsou k dispozici, stále nejsou tak efektivní jako dotazy v oddílu.

Užitečný příklad

Tady je analogie k lepšímu vysvětlení dotazů napříč oddíly:

Představte si, že jste řidič dodávky, který musí dodávat balíčky do různých apartmánových komplexů. Každý apartmánový komplex má seznam v prostorách, kde jsou 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 v oddílu a mezi oddíly:

Dotaz v oddílu (příklad)

Pokud řidič dodávky zná správný apartmánový komplex (fyzický oddíl), může okamžitě zajet do správné budovy. Řidič může zkontrolovat seznam jednotek obyvatel (index) a rychle doručit příslušné balíčky. V takovém případě řidič neztrácí čas ani úsilí při jízdě do komplexu bytu, aby zkontroloval a zjistil, jestli tam žijí někteří příjemci balíčků.

Dotaz napříč oddíly (ventilátor)

Pokud řidič dodávky nezná správný bytový komplex (fyzický oddíl), musí jet do každé budovy bytu a zkontrolovat seznam se všemi čísly jednotek obyvatel (index). Jakmile řidič dorazí do každého apartmánového komplexu, bude moct dál používat seznam adres každého rezidenta. Musí ale zkontrolovat seznam všech apartmánových komplexů bez ohledu na to, jestli tam žijí příjemci balíčků, nebo ne. Tento příklad ukazuje, jak fungují dotazy napříč oddíly. I když můžou index používat (to znamená, že nemusí zaklepat na všechny dveře), musí zvlášť zkontrolovat index pro každý fyzický oddíl.

Dotaz napříč oddíly (omezený pouze na několik fyzických oddílů)

Pokud řidič dodávky ví, že všichni příjemci balíčků žijí v určitých několika apartmánových komplexech, nemusí řídit na každý z nich. Zatímco řízení 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é množství času a úsilí. Pokud dotaz obsahuje klíč oddílu ve svém filtru s klíčovým slovem IN , zkontroluje pouze indexy relevantních fyzických oddílů pro data.

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

U většinykontejnerůch Téměř všechny operace dotazů jsou podporovány napříč oddíly, a to jak pro klíče logického oddílu, tak pro fyzické oddíly. Azure Cosmos DB má také mnoho optimalizací v dotazovacím stroji a klientských sadách SDK pro paralelizaci provádění dotazů napříč fyzickými oddíly.

U většiny scénářů náročných na čtení doporučujeme vybrat nejběžnější vlastnost ve vašich filtrech dotazů. Měli byste také zajistit, aby klíč oddílu dodržoval jiné 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 účtuje 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 máte pouze jeden (nebo jen několik) fyzických oddílů, dotazy napříč oddíly nespotřebovávají výrazně více RU než dotazy v rámci oddílu.

Počet fyzických oddílů je svázán s počtem 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 automaticky spravuje fyzické oddíly za vás. 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 pokusit vyhnout dotazům napříč oddíly:

  • Plánujete zajistit více než 30 000 jednotek žádosti (RU).
  • Plánujete uložit více než 100 GB dat.

Zvažte použití globálních sekundárních indexů (Preview), abyste se vyhnuli dotazům napříč oddíly. Globální sekundární indexy umožňují vytvářet další kontejnery s různými klíči oddílů, které se automaticky synchronizují se zdrojovým kontejnerem. Tento přístup může eliminovat dotazy napříč oddíly pro konkrétní vzory dotazů, aniž by bylo nutné změnit stávající logiku aplikace nebo klíč oddílu.

Další kroky