Dotazování kontejneru Azure Cosmos

PLATÍ PRO: ROZHRANÍ SQL API

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ů napříč oddíly a dotazy 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 na 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é vyfiltruje jeden oddíl. Přidání dalšího filtru Location se nezmění:

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 klíče oddílu (DeviceId). Proto musí fanouškovat všem fyzickým oddílům, ve kterých se spouští s indexem 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 mezi 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 nezávislé na sobě. Ve službě Azure Cosmos DB neexistuje žádný 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. Pokud je nastavená MaxConcurrency0hodnota , 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 nastavena na -1, sada SDK spravuje počet položek v vyrovnávací paměti během paralelního provádění dotazů.

Kvůli možnosti paralelizace dotazů napříč oddíly azure Cosmos DB se latence dotazů obecně škáluje a systém přidává fyzické oddíly. Poplatky za RU se ale výrazně zvýší při nárůstu celkového počtu 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 budou používat index, pokud jsou k dispozici, stále nejsou tak efektivní jako dotazy v oddílu.

Užitečný příklad

Tady je analogie pro lepší pochopení dotazů napříč oddíly:

Představme si, že jste řidič doručení, který musí dodávat balíčky do různých apartmánových komplexů. Každý apartmánový komplex má seznam v místním prostředí, který má všechna čísla jednotek rezidenta. Jednotlivé apartmány 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 rámci oddílu

Pokud řidič dodávky zná správný byt komplexní (fyzický oddíl), pak může okamžitě řídit do správné budovy. Řidič může zkontrolovat seznam jednotek rezidenta (index) a rychle doručit příslušné balíčky. V tomto případě řidič neztrácí žádný čas ani úsilí řídit do bytu komplexu, aby zkontroloval a zjistil, zda tam žijí někteří příjemci balíčku.

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

Pokud řidič doručení nezná správný apartmánový komplex (fyzický oddíl), bude muset řídit všechny jednotlivé budovy bytu a zkontrolovat seznam se všemi čísly jednotek rezidenta (index). Jakmile přijdou do každého apartmánového komplexu, budou moct dál používat seznam adres jednotlivých rezidentů. Budou však muset zkontrolovat seznam všech domů, ať už tam žijí příjemci balíčků, nebo ne. Takto fungují dotazy napříč oddíly. I když můžou index používat (nemusí zaklepat na všechny dveře), musí index pro každý fyzický oddíl zkontrolovat samostatně.

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

Pokud řidič doručení ví, že všichni příjemci balíčků žijí v určitých apartmánových komplexech, nebudou muset řídit na každý z nich. Při jízdě do několika apartmánových komplexů bude stále vyžadovat 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 IN klíčovým slovem, zkontroluje pouze indexy relevantních fyzických oddílů pro data.

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

U většiny kontejnerů je to nevyhnutelné, že budete mít nějaké dotazy napříč oddíly. Máte nějaké dotazy napříč oddíly, je v pořádku! Téměř všechny operace dotazů se podporují napříč oddíly (jak klíče logického oddílu, tak 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 jednoduše vybrat nejběžnější vlastnost ve filtrech dotazů. Měli byste se také ujistit, že klíč oddílu dodržuje 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 nebudou spotřebovávat 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 mít zřízených 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: