Pola z usuniętymi danymi

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.