Βελτιστοποίηση επιδόσεων ερωτημάτων GQL για γράφημα στο Microsoft Fabric

Σημείωμα

Αυτή η δυνατότητα βρίσκεται αυτήν τη στιγμή σε δημόσια προεπισκόπηση. Αυτή η προεπισκόπηση παρέχεται χωρίς σύμβαση παροχής υπηρεσιών και δεν συνιστάται για φόρτους εργασίας παραγωγής. Ορισμένες δυνατότητες ενδέχεται να μην υποστηρίζονται ή να έχουν περιορισμένες δυνατότητες. Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα Συμπληρωματικοί Όροι Χρήσης για Microsoft Azure Προεπισκοπήσεις.

Αυτό το άρθρο παρέχει οδηγίες για τη σύνταξη ερωτημάτων GQL (Graph Query Language) που εκτελούνται προβλέψιμα και αποτελεσματικά κατά την εργασία με γράφημα στο Microsoft Fabric. Οι συστάσεις βασίζονται στην τρέχουσα συμπεριφορά της πλατφόρμας και στους τεκμηριωμένους περιορισμούς.

Για αυστηρά όρια σχετικά με το μέγεθος γραφήματος, το μέγεθος αποτελέσματος και το χρονικό όριο ερωτήματος, ανατρέξτε στο θέμα Τρέχοντες περιορισμοί. Αρκετές συστάσεις σε αυτό το άρθρο σχετίζονται επίσης με τον τρόπο σχεδίασης του σχήματος γραφήματος. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα Σχεδίαση σχήματος γραφήματος.

Φιλτράρισμα νωρίς σε μοτίβα

Τοποθετήστε φίλτρα μέσα σε μοτίβα γραφημάτων και όχι σε μεταγενέστερες προτάσεις. Οι ρήτρες σε επίπεδο WHERE μοτίβου μειώνουν τον αριθμό των ενδιάμεσων αποτελεσμάτων πριν από την εκτέλεση των ενώσεων και των επόμενων δηλώσεων, γεγονός που μειώνει το συνολικό κόστος εκτέλεσης.

Συνιστάται: Φιλτράρισμα κατά την αντιστοίχιση μοτίβων.

-- 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

Αποφύγετε: Φιλτράρισμα αργά με ξεχωριστή δήλωση FILTER.

-- 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

Και τα δύο ερωτήματα επιστρέφουν τα ίδια αποτελέσματα, αλλά η πρώτη έκδοση επιτρέπει στη μηχανή ερωτημάτων να κλαδεύει τις γραμμές νωρίτερα στη διαδικασία αξιολόγησης.

Συμβουλή

Σκεφτείτε το επίπεδο WHERE μοτίβου ως ανάλογο με μια συνθήκη SQL JOIN ... ON . Περιορίζει τις αντιστοιχίσεις στο σημείο αξιολόγησης αντί να φιλτράρει εκ των υστέρων το πλήρες σύνολο αποτελεσμάτων.

Επιστρέψτε μόνο τα ακίνητα που χρειάζεστε

Επιστρέψτε μόνο τις ιδιότητες κόμβου και ακμής που απαιτεί το σενάριό σας. Αποφύγετε την επιστροφή πλήρων κόμβων ή τη χρήση RETURN * όταν χρειάζεστε μόνο ένα υποσύνολο ιδιοτήτων.

Στο γράφημα, το OneLake επιστρέφει ιδιότητες κόμβου. Η επιλογή περιττών ιδιοτήτων αυξάνει την ανάγνωση δεδομένων, το κόστος σειριοποίησης και το μέγεθος απόκρισης. Κατά τη μοντελοποίηση γραφήματος, όλες οι στήλες από τον πίνακα προέλευσης προστίθενται ως ιδιότητες τύπου κόμβου από προεπιλογή, εκτός εάν τις καταργήσετε.

Συνιστάται: Στενή προβολή.

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

Αποφύγετε: Επιστροφή πλήρων κόμβων.

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

Σημείωμα

Καταργήστε τις ιδιότητες τύπου κόμβου που δεν χρησιμοποιούνται κατά τη μοντελοποίηση γραφήματος, επιλέγοντας το εικονίδιο του κάδου απορριμμάτων δίπλα σε κάθε ιδιότητα. Λιγότερες ιδιότητες ανά κόμβο μειώνουν τόσο την επιβάρυνση storage όσο και query.

Περιορισμός μεγέθους συνόλου αποτελεσμάτων

Εφαρμόστε LIMIT ή άλλες συνθήκες οριοθέτησης κατά την υποβολή ερωτημάτων σε κόμβους ή σχέσεις που μπορεί να έχουν υψηλή πληθικότητα. Οι απεριόριστες αντιστοιχίσεις γραφημάτων μπορούν να παράγουν πολύ μεγάλα σύνολα αποτελεσμάτων που πλησιάζουν τα όρια της πλατφόρμας.

Συνιστάται: Περιορισμένα αποτελέσματα.

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

Αποφύγετε: Απεριόριστη αντιστοίχιση υψηλής πληθικότητας.

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

Σημαντικό

Το γράφημα περικόπτει αποκρίσεις μεγαλύτερες από 64 MB και οι επιδόσεις συνάθροισης μπορεί να είναι ασταθείς όταν τα αποτελέσματα υπερβαίνουν τα 128 MB. Χρησιμοποιήστε FILTER, LIMITκαι GROUP BY για να διατηρήσετε τα αποτελέσματα εντός αυτών των ορίων. Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα Τρέχοντες περιορισμοί.

Κρατήστε τις διελεύσεις ρηχές και στοχευμένες

Αποφύγετε τα βαθιά ένθετα ή εξαιρετικά πολύπλοκα μοτίβα γραφημάτων. Χρησιμοποιήστε απλές, στοχευμένες διελεύσεις που απαντούν άμεσα σε μια συγκεκριμένη ερώτηση. Κάθε επιπλέον άλμα σε ένα μοτίβο μεταβλητού μήκους μπορεί να αυξήσει εκθετικά τον αριθμό των διαδρομών που αξιολογεί ο κινητήρας, ειδικά σε πυκνά συνδεδεμένα γραφήματα.

Συνιστάται: Σφιχτά όρια.

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

Αποφύγετε: Διέλευση μέγιστου βάθους χωρίς σαφή ανάγκη.

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

Σημαντικό

Το γράφημα υποστηρίζει έως και οκτώ άλματα σε μοτίβα μεταβλητού μήκους. Ακόμα κι έτσι, χρησιμοποιήστε τα πιο αυστηρά όρια που επιτρέπει το σενάριό σας. Στο παράδειγμα, το {1,3} μοτίβο είναι σημαντικά φθηνότερο από ό,τι {1,8} στο ίδιο γράφημα.

Χρησιμοποιήστε το TRAIL για να αποτρέψετε περιττές διελεύσεις

Χρησιμοποιήστε TRAIL τη λειτουργία διαδρομής για να αποτρέψετε την εκ νέου επίσκεψη του μηχανισμού ερωτημάτων στο ίδιο Edge. Σε πυκνά γραφήματα, οι κύκλοι μπορούν να προκαλέσουν έκρηξη εκθετικής διαδρομής. TRAIL διασφαλίζει ότι κάθε Edge επισκέπτεται το πολύ μία φορά ανά διαδρομή, γεγονός που βελτιώνει τόσο την ορθότητα όσο και την απόδοση.

-- 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

Χωρίς TRAIL, το ίδιο ερώτημα σε ένα κυκλικό γράφημα μπορεί να παράγει ένα πολύ μεγαλύτερο (και συχνά περιττό) σύνολο αποτελεσμάτων.

Χρήση κοινόχρηστων μεταβλητών για αποτελεσματικούς συνδέσμους

Όταν ένα ερώτημα απαιτεί δεδομένα από πολλές σχέσεις, χρησιμοποιήστε μια κοινόχρηστη μεταβλητή για να ενώσετε μοτίβα στην ίδια οντότητα. Χωρίς μια κοινή μεταβλητή, τα μοτίβα μπορούν να παράγουν ένα καρτεσιανό γινόμενο - κάθε συνδυασμός αντιστοιχιών και από τα δύο μοτίβα - οδηγώντας σε ένα πολύ μεγαλύτερο σύνολο αποτελεσμάτων.

Συνιστάται: Η κοινόχρηστη μεταβλητή p ενώνει τα μοτίβα.

-- 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

Αποφύγετε: Ανεξάρτητα μοτίβα χωρίς κοινή μεταβλητή.

-- 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

Ένα καρτεσιανό προϊόν συνδυάζει κάθε αποτέλεσμα από το ένα μοτίβο με κάθε αποτέλεσμα από το άλλο. Εάν Person-workAt->Company αντιστοιχεί σε 1.000 γραμμές και Person-isLocatedIn->City σε 500 γραμμές, το ερώτημα επιστρέφει 1.000 × 500 = 500.000 γραμμές. Η προσθήκη μιας κοινόχρηστης μεταβλητής περιορίζει τον σύνδεσμο, ώστε να επιστρέφονται μόνο τα ζεύγη που ταιριάζουν.

Ορισμός βασικών περιορισμών σε κόμβους

Καθορίστε περιορισμούς κλειδιού κόμβου στον τύπο γραφήματος σας. Οι βασικοί περιορισμοί επιτρέπουν στο σύστημα να βελτιστοποιεί ερωτήματα που αναζητούν συγκεκριμένους κόμβους με βάση τις βασικές τους ιδιότητες, παρόμοια με τα ευρετήρια πρωτεύοντος κλειδιού σε σχεσιακές βάσεις δεδομένων.

Για παράδειγμα, εάν ο τύπος γραφήματος ορίζεται id ως το κλειδί για Person τους κόμβους:

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

Στη συνέχεια, τα ερωτήματα που φιλτράρουν id μπορούν να χρησιμοποιήσουν αυτό το κλειδί για άμεση αναζήτηση:

-- 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

Χωρίς το φίλτρο στην ιδιότητα κλειδιού, ο μηχανισμός πρέπει να σαρώσει κάθε Person κόμβο:

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

Συμβουλή

Όταν χρειάζεστε έναν συγκεκριμένο κόμβο, φιλτράρετε την ιδιότητα κλειδιού του στο MATCH μοτίβο για να επωφεληθείτε από τον περιορισμό που ορίσατε.

Επιλέξτε τους κατάλληλους τύπους δεδομένων

Επιλέξτε τον πιο συγκεκριμένο τύπο δεδομένων για κάθε ιδιότητα κατά τη μοντελοποίηση γραφήματος. Η επιλογή των σωστών τύπων είναι σημαντική τόσο για την αποτελεσματικότητα του storage όσο και για την απόδοση των ερωτημάτων. Για παράδειγμα, οι αριθμητικές συγκρίσεις σε INT ιδιότητες είναι ταχύτερες από τις συγκρίσεις συμβολοσειρών σε ισοδύναμες STRING τιμές.

Για υποστηριζόμενους τύπους δεδομένων, ανατρέξτε στην ενότητα Τρέχοντες περιορισμοί — Τύποι δεδομένων και Υποστηριζόμενοι τύποι ιδιοτήτων.

Όπου είναι δυνατό, ανακτήστε σχετικές οντότητες σε ένα μοτίβο γραφήματος αντί να εκδίδετε ξεχωριστά ερωτήματα που διασχίζουν τις ίδιες ακμές ανεξάρτητα. Ο συνδυασμός διελεύσεων αποφεύγει την περιττή αντιστοίχιση μοτίβων και αποτρέπει το πρόβλημα ερωτήματος N+1, όπου ένα αρχικό ερώτημα ενεργοποιεί ένα ξεχωριστό ερώτημα για κάθε σειρά αποτελεσμάτων.

Συνιστάται: Ενιαίο συνδυασμένο μοτίβο.

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

Αποφύγετε: Δύο ξεχωριστά ερωτήματα που διασχίζουν την ίδια Customer → Order άκρη.

-- 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

Δοκιμή ερωτημάτων σε ρεαλιστικούς όγκους δεδομένων

Τα ερωτήματα που έχουν καλή απόδοση σε μικρά σύνολα δεδομένων ενδέχεται να μην κλιμακώνονται γραμμικά. Δοκιμάστε τα ερωτήματά σας με όγκους δεδομένων που αντιπροσωπεύουν τον αναμενόμενο φόρτο εργασίας παραγωγής.

  • Προτιμήστε συντηρητικά σχήματα ερωτημάτων που περιλαμβάνουν φίλτρα και όρια.
  • Αποφύγετε τα διερευνητικά ερωτήματα "επιστρέψτε τα πάντα" σε μεγάλα γραφήματα.
  • Παρακολουθήστε τη διάρκεια του ερωτήματος σε σχέση με το όριο χρονικού ορίου των 20 λεπτών.