A lekérdezési teljesítmény finomhangolása az Azure Cosmos DB-vel

A KÖVETKEZŐRE VONATKOZIK: NoSQL

Az Azure Cosmos DB egy API-t biztosít a NoSQL-hez az adatok lekérdezéséhez séma vagy másodlagos indexek nélkül. Ez a cikk a következő információkat tartalmazza a fejlesztők számára:

  • Az Azure Cosmos DB SQL-lekérdezésvégrehajtásának működésének magas szintű részletei
  • Tippek és ajánlott eljárások a lekérdezési teljesítményhez
  • Példák az SQL-lekérdezések végrehajtási metrikáinak a lekérdezési teljesítmény hibakeresésére való felhasználására

Tudnivalók az SQL-lekérdezések végrehajtásáról

Az Azure Cosmos DB-ben az adatok tárolókban vannak tárolva, amelyek bármilyen tárolóméretre vagy átviteli sebességre növekedhetnek. Az Azure Cosmos DB zökkenőmentesen skálázza az adatokat a fedelek alatti fizikai partíciók között az adatnövekedés vagy a kiosztott átviteli sebesség növelése érdekében. SQL-lekérdezéseket bármely tárolóba kiadhat a REST API-val vagy a támogatott SQL SDK-k egyikével.

A particionálás rövid áttekintése: meghatároz egy olyan partíciókulcsot, mint a "város", amely meghatározza az adatok fizikai partíciók közötti felosztását. Az egyetlen partíciókulcshoz tartozó adatokat (például "city" == "Seattle") egy fizikai partíció tárolja, és egyetlen fizikai partíció több partíciókulcsból is tárolhat adatokat. Amikor egy partíció eléri a tárterületkorlátot, a szolgáltatás zökkenőmentesen felosztja a partíciót két új partícióra. Az adatok egyenletesen oszlanak el az új partíciók között, így egyetlen partíciókulcs összes adata együtt marad. Mivel a partíciók átmenetiek, az API-k egy partíciókulcs-tartomány absztrakcióját használják, amely a partíciókulcs-kivonatok tartományait jelöli.

Amikor lekérdezést ad ki az Azure Cosmos DB-nek, az SDK a következő logikai lépéseket hajtja végre:

  • Elemezze az SQL-lekérdezést a lekérdezés végrehajtási tervének meghatározásához.
  • Ha a lekérdezés tartalmaz egy szűrőt a partíciókulcshoz, például SELECT * FROM c WHERE c.city = "Seattle"egy partícióhoz van irányítva. Ha a lekérdezés nem rendelkezik szűrővel a partíciókulcson, akkor a rendszer az összes partícióban végrehajtja, és az egyes partíciók eredményei egyesített ügyféloldaliak.
  • A lekérdezést az ügyfélkonfiguráció alapján sorozatban vagy párhuzamosan hajtja végre az egyes partíciókon belül. Az egyes partíciókon belül a lekérdezés a lekérdezés összetettségétől, a konfigurált oldalmérettől és a gyűjtemény kiosztott átviteli sebességétől függően egy vagy több ciklikus utazást is elvégezhet. Minden végrehajtás a lekérdezések végrehajtásának és a lekérdezések végrehajtásának statisztikái által felhasznált kérelemegységek számát adja vissza.
  • Az SDK a partíciók lekérdezési eredményeinek összegzését végzi el. Ha például a lekérdezés egy ORDER BY függvényt tartalmaz a partíciók között, akkor az egyes partíciók eredményei egyesítve lesznek rendezve, hogy globálisan rendezett sorrendben adja vissza az eredményeket. Ha a lekérdezés egy aggregáció, például COUNT, az egyes partíciókból származó számokat összegzi a rendszer a teljes szám létrehozásához.

Az SDK-k különböző lehetőségeket biztosítanak a lekérdezések végrehajtásához. A .NET-ben például ezek a lehetőségek érhetők el az QueryRequestOptions osztályban. Az alábbi táblázat ezeket a beállításokat és a lekérdezések végrehajtási idejét ismerteti.

Lehetőség Leírás
EnableScanInQuery Csak akkor alkalmazható, ha a kért szűrőútvonal indexelése le van tiltva. Igaz értékre kell állítani, ha nem indexelt, és teljes vizsgálattal szeretne lekérdezéseket futtatni.
MaxItemCount A kiszolgálóra való oda-visszaútonként visszaadandó elemek maximális száma. Beállíthatja -1 értékre, hogy a kiszolgáló kezelje a visszaadni kívánt elemek számát.
MaxBufferedItemCount Az ügyféloldali pufferelhető elemek maximális száma a párhuzamos lekérdezés végrehajtása során. A pozitív tulajdonságérték a pufferelt elemek számát a beállított értékre korlátozza. 0-nál kisebb értékre állíthatja, hogy a rendszer automatikusan eldöntse a pufferelendő elemek számát.
MaxConcurrency Lekéri vagy beállítja az egyidejűleg futtatott műveletek számát az ügyféloldalon a párhuzamos lekérdezés végrehajtása során. A pozitív tulajdonság értéke az egyidejű műveletek számát a beállított értékre korlátozza. 0-nál kisebb értékre állíthatja, hogy a rendszer automatikusan eldöntse az egyidejűleg futtatandó műveletek számát.
PopulateIndexMetrics Lehetővé teszi az indexmetrikák gyűjtését annak megértéséhez, hogy a lekérdezési motor hogyan használta a meglévő indexeket, és hogyan használhatja a potenciális új indexeket. Ez a beállítás többletterheléssel jár, ezért csak lassú lekérdezések hibakeresése esetén szabad engedélyezni.
ResponseContinuationTokenLimitInKb Korlátozhatja a kiszolgáló által visszaadott folytatási jogkivonat maximális méretét. Előfordulhat, hogy ezt be kell állítania, ha az alkalmazásgazda korlátozza a válaszfejléc méretét, de növelheti a lekérdezés teljes időtartamát és kérelemegységeit.

Íme például egy lekérdezés a .NET SDK használatával /city particionált tárolón:

QueryDefinition query = new QueryDefinition("SELECT * FROM c WHERE c.city = 'Seattle'");
QueryRequestOptions options = new QueryRequestOptions()
{
    MaxItemCount = -1,
    MaxBufferedItemCount = -1,
    MaxConcurrency = -1,
    PopulateIndexMetrics = true
};
FeedIterator<dynamic> feedIterator = container.GetItemQueryIterator<dynamic>(query);

FeedResponse<dynamic> feedResponse = await feedIterator.ReadNextAsync();

Minden lekérdezés végrehajtása egy REST API-nak POST felel meg, amelynek fejlécei a lekérdezési kérelmek beállításaihoz és a törzsben lévő SQL-lekérdezéshez vannak beállítva. A REST API-kérés fejléceinek és beállításainak részleteiért lásd : Erőforrások lekérdezése a REST API használatával.

Ajánlott eljárások a lekérdezési teljesítményhez

Az alábbi tényezők általában a legnagyobb hatással vannak az Azure Cosmos DB lekérdezési teljesítményére. Ebben a cikkben részletesebben is bemutatjuk ezeket a tényezőket.

Szorzó Tipp.
Kiosztott átviteli sebesség Mérje meg a lekérdezésenkénti ru-t, és győződjön meg arról, hogy rendelkezik a lekérdezésekhez szükséges kiosztott átviteli sebességgel.
Particionálási és partíciókulcsok A szűrési záradékban a partíciókulcs-értékkel rendelkező lekérdezések előnyben részesítése az alacsony késés érdekében.
SDK és lekérdezési beállítások Kövesse az SDK ajánlott eljárásait, például a közvetlen kapcsolatot, és hangolja az ügyféloldali lekérdezés-végrehajtási beállításokat.
Hálózati késleltetés Az alkalmazás futtatása az Azure Cosmos DB-fiókkal azonos régióban, ahol csak lehetséges, a késés csökkentése érdekében.
Indexelési szabályzat Győződjön meg arról, hogy rendelkezik a lekérdezéshez szükséges indexelési útvonalokkal/szabályzatokkal.
Lekérdezésvégrehajtási metrikák A lekérdezés-végrehajtási metrikák elemzése a lekérdezések és adatalakzatok lehetséges átírásainak azonosításához.

Kiosztott átviteli sebesség

Az Azure Cosmos DB-ben olyan adattárolókat hozhat létre, amelyben a fenntartott átviteli sebesség kérelemegységekben (RU) kifejezve másodpercenként. Egy 1 KB-os dokumentum olvasása egy RU, és minden művelet (beleértve a lekérdezéseket is) az összetettsége alapján rögzített számú kérelemegységre van normalizálva. Ha például 1000 RU/s van kiépítve a tárolóhoz, és olyan lekérdezése van, amely SELECT * FROM c WHERE c.city = 'Seattle' 5 kérelemegységet használ fel, akkor végrehajthat (1000 RU/s) / (5 RU/query) = 200 ilyen lekérdezést másodpercenként.

Ha több mint 200 lekérdezést küld el másodpercenként (vagy más olyan műveletet, amely az összes kiosztott kérelemegységet telítette), a szolgáltatás sebességkorlátozást indít el a bejövő kérelmeknél. Az SDK-k automatikusan kezelik a sebességkorlátozást egy visszalépés/újrapróbálkozás végrehajtásával, ezért nagyobb késést tapasztalhat ezeknél a lekérdezéseknél. A kiosztott átviteli sebességnek a szükséges értékre történő növelése javítja a lekérdezés késését és átviteli sebességét.

A kérelemegységekről további információt a Kérelemegységek című témakörben talál.

Particionálási és partíciókulcsok

Az Azure Cosmos DB-vel az adatok olvasására vonatkozó alábbi forgatókönyvek a jellemzően leggyorsabb/leghatékonyabbtól a leglassabb/legkevésbé hatékonyig vannak rendezve.

  • GET egyetlen partíciókulcsra és elemazonosítóra, más néven pontolvasásra
  • Lekérdezés egy szűrési záradékkal egyetlen partíciókulcson
  • Lekérdezés egyenlőségi vagy tartományszűrő záradékkal bármely tulajdonságon
  • Lekérdezés szűrők nélkül

Az összes partíción végrehajtandó lekérdezések nagyobb késéssel rendelkeznek, és magasabb kérelemegységeket használhatnak fel. Mivel minden partíció automatikus indexelést alkalmaz az összes tulajdonsághoz, a lekérdezés ebben az esetben hatékonyan kiszolgálható az indexből. A partíciókra kiterjedő lekérdezéseket gyorsabbá teheti a párhuzamossági beállítások használatával.

További információ a particionálásról és a partíciókulcsokról: Particionálás az Azure Cosmos DB-ben.

SDK és lekérdezési beállítások

Tekintse meg a lekérdezési teljesítményre vonatkozó tippeket és a teljesítménytesztelést , hogy miként szerezheti be a legjobb ügyféloldali teljesítményt az Azure Cosmos DB-ből az SDK-k használatával.

Hálózati késleltetés

A globális disztribúció beállításáról és a legközelebbi régióhoz való csatlakozásról az Azure Cosmos DB globális disztribúciója című témakörben olvashat. A hálózati késés jelentős hatással van a lekérdezési teljesítményre, ha több fordulót kell elvégeznie, vagy nagy eredményhalmazt kell lekérnie a lekérdezésből.

Lekérdezésvégrehajtási metrikák használatával lekérheti a lekérdezések kiszolgálói végrehajtási idejét, így megkülönböztetheti a lekérdezés végrehajtásával töltött időt a hálózati átvitel során töltött időtől.

Indexelési szabályzat

Tekintse meg az indexelési szabályzat konfigurálását az elérési utak, a típusok és a módok indexeléséhez, valamint a lekérdezések végrehajtására gyakorolt hatásukról. Az Azure Cosmos DB alapértelmezés szerint automatikus indexelést alkalmaz az összes adatra, és tartományindexeket használ sztringekhez és számokhoz, ami hatékony az egyenlőségi lekérdezésekhez. A nagy teljesítményű beszúrási forgatókönyvek esetében fontolja meg az útvonalak kizárását az egyes beszúrási műveletek ru-költségeinek csökkentése érdekében.

Az indexmetrikák segítségével azonosíthatja, hogy mely indexeket használja az egyes lekérdezésekhez, és hogy vannak-e hiányzó indexek, amelyek javítanák a lekérdezés teljesítményét.

Lekérdezésvégrehajtási metrikák

A rendszer részletes metrikákat ad vissza a kérés diagnosztikája minden egyes lekérdezés-végrehajtáshoz. Ezek a metrikák azt írják le, hogy a lekérdezés végrehajtása során hol történik az idő, és hogyan lehet speciális hibaelhárítást végezni.

További információ a lekérdezési metrikák beszerzéséről.

Metric Unit Leírás
TotalTime ezredmásodperc Lekérdezések végrehajtásának teljes ideje
DocumentLoadTime ezredmásodperc Dokumentumok betöltésével töltött idő
DocumentWriteTime ezredmásodperc A kimeneti dokumentumok írásával és szerializálásával töltött idő
IndexLookupTime ezredmásodperc Fizikai indexrétegben töltött idő
QueryPreparationTime ezredmásodperc A lekérdezés előkészítésével töltött idő
RuntimeExecutionTime ezredmásodperc Lekérdezés futásideje teljes végrehajtási ideje
VMExecutionTime ezredmásodperc A lekérdezés végrehajtásával töltött idő a lekérdezés futtatókörnyezetében
OutputDocumentCount darabszám Kimeneti dokumentumok száma az eredményhalmazban
OutputDocumentSize darabszám A kimeneti dokumentumok teljes mérete bájtban
RetrievedDocumentCount darabszám Beolvasott dokumentumok teljes száma
RetrievedDocumentSize bájt A beolvasott dokumentumok teljes mérete bájtban
IndexHitRatio arány [0,1] A szűrővel egyeztetett dokumentumok számának és a betöltött dokumentumok számának aránya

Az ügyféloldali SDK-k belsőleg több lekérdezési kérést is intézhetnek a lekérdezés kiszolgálásához az egyes partíciókon belül. Az ügyfél partíciónként egynél több hívást indít, ha a teljes eredmény meghaladja a maximális elemszám-kérési beállítást, ha a lekérdezés meghaladja a partícióhoz kiosztott átviteli sebességet, ha a lekérdezés hasznos adatai elérik az oldalenkénti maximális méretet, vagy ha a lekérdezés eléri a rendszer által lefoglalt időtúllépési korlátot. Minden részleges lekérdezésvégrehajtás az adott lap lekérdezési metrikáit adja vissza.

Íme néhány minta lekérdezés, és a lekérdezés végrehajtásából visszaadott metrikák értelmezése:

Query Mintametrika Leírás
SELECT TOP 100 * FROM c "RetrievedDocumentCount": 101 A lekért dokumentumok száma 100+1 a TOP záradéknak megfelelően. A lekérdezési időt többnyire beolvasják WriteOutputTime , és DocumentLoadTime mivel vizsgálatról van szó.
SELECT TOP 500 * FROM c "RetrievedDocumentCount": 501 A RetrievedDocumentCount mostantól magasabb (a TOP záradéknak megfelelő 500+1).
SELECT * FROM c WHERE c.N = 55 "IndexLookupTime": "00:00:00.0009500" A kulcskeresés körülbelül 0,9 ms-ot tölt az IndexLookupTime-ban, mivel ez egy indexkeresés./N/?
SELECT * FROM c WHERE c.N > 55 "IndexLookupTime": "00:00:00.0017700" Valamivel több időt (1,7 ms) töltött az IndexLookupTime egy tartományvizsgálat során, mert ez egy indexkeresés./N/?
SELECT TOP 500 c.N FROM c "IndexLookupTime": "00:00:00.0017700" Ugyanaz az idő, mint a DocumentLoadTime korábbi lekérdezések, de alacsonyabb DocumentWriteTime , mert csak egy tulajdonságot vetünk ki.
SELECT TOP 500 udf.toPercent(c.N) FROM c "RuntimeExecutionTime": "00:00:00.2136500" Körülbelül 213 ms-t költünk az UDF végrehajtására RuntimeExecutionTime az egyes értékeken c.N.
SELECT TOP 500 c.Name FROM c WHERE STARTSWITH(c.Name, 'Den') "IndexLookupTime": "00:00:00.0006400", "RuntimeExecutionTime": "00:00:00.0074100" Körülbelül 0,6 ms van töltve IndexLookupTime/Name/?. A lekérdezések végrehajtási idejének nagy része (~7 ms) a következőben: RuntimeExecutionTime.
SELECT TOP 500 c.Name FROM c WHERE STARTSWITH(LOWER(c.Name), 'den') "IndexLookupTime": "00:00:00", "RetrievedDocumentCount": 2491, "OutputDocumentCount": 500 A lekérdezés vizsgálatként történik, mert használja LOWER, és 2491 beolvasott dokumentumból 500 lesz visszaadva.

További lépések

  • A támogatott SQL-lekérdezési operátorokról és kulcsszavakról az SQL-lekérdezésben olvashat.
  • A kérelemegységekről további információt a kérelemegységek című témakörben talál.
  • Az indexelési szabályzatról további információt az indexelési szabályzatban talál