Dotazování kontejneru 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ů 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 .DeviceId
Pokud tento dotaz spustíme u kontejneru rozděleného na DeviceId
oddí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 globální index.
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
-1
, sada SDK spravuje stupeň paralelismu.MaxConcurrency
Pokud je nastavená hodnota0
, 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 tuto možnost vynecháte nebo nastavíte na -1, sada SDK spravuje počet položek v vyrovnávací paměti během paralelního provádě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. S rostoucím celkovým počtem fyzických oddílů se ale poplatek za RU výrazně zvyšuje.
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č doručování, 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 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 máte jenom jeden (nebo jen několik) fyzických oddílů, dotazy napříč oddíly nevyužívají výrazně více RU než dotazy v oddílu.
Počet fyzických oddílů je svázán s množstvím 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 zřídit 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: