GQL-lekérdezés teljesítményének optimalizálása a Microsoft Fabric gráfhoz

Ez a cikk útmutatást nyújt olyan GQL-lekérdezések írásához, amelyek kiszámíthatóan és hatékonyan működnek a gráfokkal a Microsoft Fabric platformján. A javaslatok a platform aktuális viselkedésén és a dokumentált korlátozásokon alapulnak.

A gráfméretre, az eredményméretre és a lekérdezés időtúllépésére vonatkozó korlátozásokat az Aktuális korlátozások című témakörben talál. A cikkben szereplő számos javaslat a gráfséma tervezésére is vonatkozik. További információ: Gráfséma tervezése.

Korai szűrés a mintákban

Helyezze a szűrőket a gráfmintákba a későbbi utasítások helyett. A mintaszintű WHERE záradékok csökkentik a köztes eredmények számát az illesztések és az azt követő utasítások futtatása előtt, ami csökkenti a teljes végrehajtási költséget.

Ajánlott: Szűrés a mintaegyezés során.

-- Pattern-level WHERE reduces intermediate results
MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.id > 1000)
RETURN p.firstName, p.lastName, c.name

Elkerülni: Késői szűrés külön FILTER utasítással.

-- Statement-level filter runs after all pattern matches are produced
MATCH (p:Person)-[:workAt]->(c:Company)
FILTER p.birthday < 19940101 AND c.id > 1000
RETURN p.firstName, p.lastName, c.name

Mindkét lekérdezés ugyanazt az eredményt adja vissza, de az első verzió lehetővé teszi, hogy a lekérdezési motor a kiértékelési folyamat korábbi sorait metsse ki.

Jótanács

A mintaszintet WHERE az SQL-feltételhez JOIN ... ON hasonlónak tekinti. A teljes eredményhalmaz utólagos szűrése helyett a kiértékelési ponton korlátozza az egyezéseket.

Csak a szükséges tulajdonságokat adja vissza

Csak a forgatókönyv által igényelt csomópont- és éltulajdonságokat adja vissza. Kerülje a teljes csomópontok visszaadását vagy használatát RETURN * , ha csak a tulajdonságok egy részhalmazára van szüksége.

A gráfban a OneLake visszatábláz egy csomóponttulajdonságokat. A szükségtelen tulajdonságok kiválasztása növeli az adatok olvasási, szerializálási költségeit és válaszméretét. A gráfmodellezés során manuálisan válasszon ki oszlopokat a forrástáblából, amelyet csomóponttípus-tulajdonságokként szeretne hozzáadni.

Ajánlott: Keskeny kivetítés.

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name

Elkerülni: Teljes csomópontok visszaadása.

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN *

Megjegyzés:

Csak akkor adjon hozzá csomóponttípus-tulajdonságokat a gráfmodellezés során, ha lekérdezésekhez vagy elemzéshez van rájuk szükség. Csomópontonként kevesebb tulajdonság csökkenti a storage és a lekérdezések terhelését.

Az eredményhalmaz méretének korlátozása

Olyan csomópontok vagy kapcsolatok lekérdezésekor alkalmazhat LIMIT vagy egyéb határoló feltételeket, amelyek nagy számossággal rendelkezhetnek. A kötetlen gráf egyezések nagyon nagy eredményhalmazokat hozhatnak létre, amelyek megközelítik a platform korlátait.

Ajánlott: Korlátozott eredmények.

MATCH (p:Person)-[:knows]->(friend:Person)
RETURN p.firstName, friend.firstName
LIMIT 1000

Elkerülni: Kötetlen, magas számosságú egyezés.

MATCH (p:Person)-[:knows]->(friend:Person)
RETURN p.firstName, friend.firstName

Fontos

A gráf csonkolja a 64 MB-nál nagyobb válaszokat, és az összesítési teljesítmény instabil lehet, ha az eredmények túllépik a 128 MB-ot. Használja a FILTER, LIMIT és GROUP BY elemeket, hogy az eredményeket ezeken a határok között tartsa. További információ: Aktuális korlátozások.

A bejárások sekélyek és célzottak maradnak

Kerülje a mélyen beágyazott vagy rendkívül összetett gráfmintákat. Használjon egyszerű, célzott bejárásokat, amelyek közvetlenül válaszolnak egy adott kérdésre. A változó hosszúságú mintázat minden extra ugrása exponenciálisan növelheti a motor által kiértékelt útvonalak számát, különösen sűrűn csatlakoztatott grafikonokon.

Ajánlott: Szűk határok.

-- Use the narrowest hop range that answers your question
MATCH (p:Person)-[:knows]->{1,3}(friend:Person)
RETURN p.firstName, friend.firstName
LIMIT 1000

Elkerülni: Maximális mélységű bejárás egyértelmű igény nélkül.

-- Exploring the full 8-hop limit on a dense graph is expensive
MATCH (p:Person)-[:knows]->{1,8}(friend:Person)
RETURN *

Fontos

A Graph legfeljebb nyolc ugrást támogat változó hosszúságú mintákban. Ennek ellenére használja a forgatókönyv által lehetővé tetsző legszorosabb korlátokat. A példában a {1,3} minta jelentősen olcsóbb, mint {1,8} ugyanazon a grafikonon.

Redundáns bejárások megakadályozása a TRAIL használatával

TRAIL elérési út mód használatával megakadályozhatja, hogy a lekérdezési motor ugyanazt az élt ismételje. Sűrű gráfokban a ciklusok exponenciális útvonalrobbanást okozhatnak. TRAIL biztosítja, hogy az egyes élek minden útvonalon legfeljebb egyszer legyenek meglátogatva, ami javítja a helyességet és a teljesítményt.

-- TRAIL prevents revisiting the same :knows edge
MATCH TRAIL (src:Person)-[:knows]->{1,4}(dst:Person)
WHERE src.firstName = 'Alice' AND dst.firstName = 'Bob'
RETURN count(*) AS numPaths

A ciklikus gráfon végzett ugyanazon lekérdezés TRAIL nélkül sokkal nagyobb (és gyakran redundáns) eredményhalmazt hozhat létre.

Megosztott változók használata a hatékony illesztéshez

Ha egy lekérdezéshez több kapcsolat adataira van szükség, használjon megosztott változót ugyanazon entitás mintáinak összekapcsolásához. Megosztott változó nélkül a minták egy cartesian terméket hozhatnak létre - mindkét mintából származó egyezések minden kombinációját -, ami sokkal nagyobb eredményhalmazhoz vezet.

Ajánlott: A megosztott változó p összekapcsolja a mintákat.

-- Single shared variable ensures an efficient join
MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 1000

Elkerülni: Független minták megosztott változó nélkül.

-- Without a shared variable, this produces a cartesian product
MATCH (p1:Person)-[:workAt]->(c:Company),
      (p2:Person)-[:isLocatedIn]->(city:City)
RETURN p1.firstName, c.name, p2.firstName, city.name

A descartes-i szorzat minden egy mintából származó eredményt a másikból származó összes eredménnyel párosít. Ha Person-workAt->Company 1000 sor és Person-isLocatedIn->City 500 sor egyezik, a lekérdezés 1000 × 500 = 500 000 sort ad vissza. Megosztott változó hozzáadása korlátozza az illesztéseket, így csak egyező párok lesznek visszaadva.

Kulcskorlátozások definiálása csomópontokon

Csomópontkulcs-korlátozások definiálása a gráftípusban. A kulcskorlátozások lehetővé teszik, hogy a rendszer optimalizálja azokat a lekérdezéseket, amelyek meghatározott csomópontokat keresnek a kulcstulajdonságuk alapján, hasonlóan a relációs adatbázisok elsődleges kulcsindexeihez.

Például, ha a gráftípus úgy van definiálva, hogy a id csomópontok kulcsa Person legyen:

CONSTRAINT person_pk
  FOR (n:Person) REQUIRE n.id IS KEY

Ezután a szűrést id végző lekérdezések használhatják ezt a kulcsot a közvetlen kereséshez:

-- Fast: the engine can look up person 12345 directly using the key
MATCH (p:Person WHERE p.id = 12345)-[:workAt]->(c:Company)
RETURN p.firstName, c.name

A kulcstulajdonság szűrője nélkül a motornak minden Person csomópontot át kell vizsgálnia:

-- Slower: scans all Person nodes before traversing
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, c.name

Jótanács

Ha egy adott csomópontra van szüksége, szűrjön a mintában lévő kulcstulajdonságra, MATCH hogy kihasználhassa a megadott korlátozást.

Válassza ki a megfelelő adattípusokat

Válassza ki az egyes tulajdonságok legspecifikusabb adattípusát a gráfmodellezés során. A megfelelő típusok kiválasztása fontos a storage hatékonyság és a lekérdezési teljesítmény szempontjából is. A tulajdonságok numerikus INT összehasonlításai például gyorsabbak, mint az egyenértékű STRING értékek sztring-összehasonlításai.

A támogatott adattípusokról az aktuális korlátozások – Adattípusok és támogatott tulajdonságtípusok című témakörben olvashat.

Ahol lehetséges, kérje le a kapcsolódó entitásokat egyetlen gráfmintában ahelyett, hogy külön lekérdezéseket bocsátanak ki, amelyek egymástól függetlenül haladnak át ugyanazon éleken. A bejárások kombinálása elkerüli a redundáns mintaegyezést, és megakadályozza az N+1 lekérdezési problémát, ahol egy kezdeti lekérdezés minden eredménysorhoz külön lekérdezést indít el.

Ajánlott: Egyetlen kombinált minta.

MATCH (c:Customer)-[:purchased]->(o:Order)-[:contains]->(product:Product)
RETURN c.id, o.id, product.name
LIMIT 1000

Elkerülni: Két különálló lekérdezés, amelyek ugyanazon Customer → Order a peremen haladnak.

-- Query 1: fetch 100 orders
MATCH (c:Customer)-[:purchased]->(o:Order)
RETURN c.id, o.id

-- Query 2: run once per order to get products (N+1 problem)
MATCH (o:Order)-[:contains]->(product:Product)
RETURN o.id, product.name

Lekérdezések tesztelése reális adatkötetek ellen

Előfordulhat, hogy a kis adathalmazokon jól teljesítő lekérdezések nem skálázhatók lineárisan. Tesztelje a lekérdezéseket olyan adatkötetekkel, amelyek a várt éles számítási feladatot képviselik.

  • Előnyben részesítse a szűrőket és korlátokat tartalmazó konzervatív lekérdezési alakzatokat.
  • Kerülje el a feltáró lekérdezések végrehajtását, amelyek "mindent visszaadnak" nagy gráfok esetén.
  • A lekérdezés időtartamának monitorozása a 20 perces időtúllépési korláthoz képest.