Trang này mô tả cách xem và kiểm soát việc sử dụng các trường được phân mảnh trong Cloud Firestore. Tính năng này có trong phiên bản Firestore Enterprise.
Khi các tài liệu được ghi, Cloud Firestore có thể xác định rằng các trường cụ thể phải được lưu trữ ở định dạng phân mảnh. Các trường được phân mảnh tối ưu hoá hiệu suất truy vấn bằng cách chỉ đọc các trường bắt buộc thay vì toàn bộ tài liệu.
Các truy vấn hưởng lợi từ các trường được phân mảnh
Các lượt đọc trên các trường được phân mảnh được áp dụng cho các hình dạng truy vấn sau đây (nếu có):
Truy vấn tổng hợp: Các truy vấn chỉ cần truy cập vào một tập hợp con của các trường cho các thao tác tổng hợp. Ví dụ:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate( countAll().as("total"), )hoặc bằng group-by:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate({ accumulators: [ field('account_balance').average().as('avg_account_balance') ], groups: [field('market_segment')] })Truy vấn chiếu: Các truy vấn chỉ trả về một tập hợp con cụ thể của các trường. Ví dụ:
db.pipeline() .collection("/customers") .select("family_name", "given_name") .limit(10)Truy vấn bộ lọc: Các truy vấn mà Cloud Firestore công cụ truy vấn xác định rằng việc sử dụng các trường được phân mảnh để lọc tài liệu là có lợi. Ví dụ:
db.pipeline() .collection("/customers") .where(equal("given_name", "alice"))
Xem mức sử dụng các trường được phân mảnh
Bạn có thể sử dụng tính năng giải thích truy vấn để kiểm tra xem một truy vấn có sử dụng các trường được phân mảnh hay không. Nút TableScan trong kế hoạch truy vấn bao gồm một phần Storage với các chỉ số sau:
- Hình dạng quét:
shredded_fields_only: Truy vấn chỉ đọc từ các trường được phân mảnh.shredded_fields_backjoin: Truy vấn đọc từ các trường được phân mảnh và kết hợp với tài liệu gốc cho các trường khác.
- Các trường được phân mảnh đã sử dụng: Danh sách tên trường được đọc dưới dạng các trường được phân mảnh.
- Số lần kiểm tra lại: Bản đồ bộ đếm cho các lần kiểm tra lại. Việc kiểm tra lại có nghĩa là quay lại đọc từ tài liệu đầy đủ ban đầu khi quét các trường được phân mảnh. Điều này có thể xảy ra nếu giá trị trường trong một tài liệu vượt quá 8 KiB, tức là quá lớn đối với bộ nhớ lưu trữ các trường được phân mảnh.
Ví dụ về đầu ra
...
└── • 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]
Kiểm soát việc sử dụng các trường được phân mảnh
Theo mặc định, Cloud Firestore sử dụng các trường được phân mảnh khi có. Bạn có thể kiểm soát hành vi này bằng cách sử dụng tuỳ chọn truy vấn table_scan_method.
Các giá trị được hỗ trợ cho tuỳ chọn table_scan_method:
shredded_fields_enabled(Mặc định): Sử dụng các trường được phân mảnh khi có.shredded_fields_disabled: Không sử dụng các trường được phân mảnh.force_shredded_fields: Không thực hiện truy vấn nếu không thể thực hiện quá trình quét bảng bằng cách quét các trường được phân mảnh.
Ví dụ
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();
Cảnh báo về hiệu suất truy vấn
Cloud Firestore có thể đưa ra cảnh báo về hiệu suất trong kết quả giải thích truy vấn khi phát hiện thấy việc sử dụng các trường được phân mảnh không hiệu quả. Ví dụ:
Truy vấn có độ chọn lọc thấp: Xảy ra khi một truy vấn quét các trường được phân mảnh để lọc nhưng lọc ra quá ít tài liệu, khiến quá trình quét không hiệu quả.
Truy vấn có số lần kiểm tra lại cao: Xảy ra khi truy vấn thường xuyên quay lại đọc toàn bộ tài liệu, điều này có thể ảnh hưởng đến hiệu suất. Bạn có thể sử dụng các hàm như
storage_sizeđể xác định các giá trị lớn kích hoạt quá trình kiểm tra lại.
Trong những trường hợp này, hãy cân nhắc việc tắt các lượt đọc trường được phân mảnh bằng cách sử dụng các tuỳ chọn truy vấn.
Hạn chế
Cloud Firestore chỉ phân mảnh các trường cấp cao nhất. Hệ thống cũng hạn chế số lượng trường có thể được phân mảnh trên mỗi nhóm bộ sưu tập.