Na tej stronie dowiesz się, jak wyświetlać i kontrolować wykorzystanie rozdrobnionych pól w Cloud Firestore. Jest ona dostępna w wersji Enterprise Firestore.
Podczas tworzenia dokumentów Cloud Firestore może zdecydować, że określone pola powinny być przechowywane w formacie rozdrobnionym. Pola rozdrobnione optymalizują wydajność zapytań, ponieważ odczytują tylko wymagane pola zamiast całego dokumentu.
Zapytania, w których przypadku przydają się podzielone pola
Odczyty w przypadku pól rozdrobnionych są stosowane do tych kształtów zapytań, w których ma to zastosowanie:
Zapytania agregujące: zapytania, które do operacji agregacji potrzebują dostępu tylko do podzbioru pól. Przykład:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate( countAll().as("total"), )lub z grupowaniem:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate({ accumulators: [ field('account_balance').average().as('avg_account_balance') ], groups: [field('market_segment')] })Zapytania projekcyjne: zapytania, które zwracają tylko określony podzbiór pól. Przykład:
db.pipeline() .collection("/customers") .select("family_name", "given_name") .limit(10)Zapytania dotyczące filtrowania: zapytania, w przypadku których Cloud Firestore silnik zapytań uzna, że użycie podzielonych pól do filtrowania dokumentów jest korzystne. Przykład:
db.pipeline() .collection("/customers") .where(equal("given_name", "alice"))
Wyświetlanie wykorzystania pól rozdrobnionych
Aby sprawdzić, czy zapytanie korzysta z pociętych pól, możesz użyć funkcji wyjaśniania zapytań. Węzeł TableScan w planie zapytania zawiera sekcję Storage z tymi danymi:
- Skanuj kształt:
shredded_fields_only: zapytanie odczytuje tylko zaszyfrowane pola.shredded_fields_backjoin: Zapytanie odczytuje dane z zaszyfrowanych pól i łączy je z oryginalnym dokumentem w przypadku innych pól.
- Użyte pola rozdrobnione: lista nazw pól odczytanych jako pola rozdrobnione.
- Liczba ponownych sprawdzeń: mapa liczników ponownych sprawdzeń. Ponowne sprawdzenie oznacza powrót do odczytu z oryginalnego pełnego dokumentu podczas skanowania pól z rozdrabnianymi danymi. Może się tak zdarzyć, jeśli wartość pola w dokumencie przekracza 8 KiB, co jest zbyt dużą wartością dla przechowywania w polach rozdrobnionych.
Przykładowe dane wyjściowe
...
└── • TableScan
source: /customers
order: UNDEFINED
row range: (-∞..+∞)
filter: ($account_balance_1 < 0L)
output bindings: {$account_balance_1=account_balance, $market_segment_1=market_segment}
variables: [$account_balance_1, $market_segment_1]
Execution:
records returned: 1,374
latency: 26.58 ms
post-filtered rows: 13,626
records scanned: 15,000
data bytes read: 23.73 MiB (24,887,141 B)
Storage:
scan shape: shredded_fields_only
shredded fields used: [account_balance, market_segment]
Kontrolowanie użycia pól rozdrobnionych
Domyślnie Cloud Firestore używa dostępnych pól rozdrobnionych. Możesz kontrolować to zachowanie za pomocą opcji zapytania table_scan_method.
Obsługiwane wartości opcji table_scan_method:
shredded_fields_enabled(Domyślnie): używaj pól rozdrobnionych, gdy są dostępne.shredded_fields_disabled: Nie używaj pól rozdrobnionych.force_shredded_fields: Jeśli nie można zrealizować zapytania przez skanowanie podzielonych pól, zwróć błąd.
Przykład
var opts = new PipelineExecuteOptions()
.with("table_scan_method", "shredded_fields_disabled");
var snapshot = db.pipeline()
.collection("/customers")
.where(equal("given_name", "alice"))
.execute(opts)
.get();
Ostrzeżenia dotyczące wydajności zapytań
Cloud Firestore może wyświetlać ostrzeżenia o wydajności w wyniku wyjaśnienia zapytania, gdy wykryje nieefektywne użycie rozdrobnionego pola. Przykład:
Zapytania o niskiej selektywności: występują, gdy zapytanie skanuje podzielone pola w celu filtrowania, ale odfiltrowuje zbyt mało dokumentów, co sprawia, że skanowanie jest nieefektywne.
Zapytania wymagające częstego ponownego sprawdzania: występują, gdy zapytanie często wraca do odczytu pełnego dokumentu, co może mieć wpływ na wydajność. Możesz używać funkcji takich jak
storage_size, aby identyfikować duże wartości, które powodują ponowne sprawdzanie.
W takich przypadkach możesz wyłączyć odczyty rozdrobnionych pól za pomocą opcji zapytań.
Ograniczenia
Cloud Firestore usuwa tylko pola najwyższego poziomu. Ogranicza też liczbę pól, które można rozdrabniać w każdej grupie kolekcji.