این صفحه نحوه مشاهده و کنترل استفاده از فیلدهای خرد شده در Cloud Firestore را شرح میدهد. این قابلیت در نسخه Firestore Enterprise موجود است.
وقتی اسناد نوشته میشوند، Cloud Firestore ممکن است تشخیص دهد که فیلدهای خاصی باید در قالبی خرد شده ذخیره شوند. فیلدهای خرد شده با خواندن فقط فیلدهای مورد نیاز به جای کل سند، عملکرد پرس و جو را بهینه میکنند.
پرسوجوهایی که از فیلدهای خرد شده سود میبرند
خواندن روی فیلدهای خرد شده در صورت لزوم روی شکلهای پرسوجوی زیر اعمال میشود:
پرسوجوهای تجمیع : پرسوجوهایی که فقط نیاز به دسترسی به زیرمجموعهای از فیلدها برای عملیات تجمیع دارند. برای مثال:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate( countAll().as("total"), )یا با گروهبندی:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate({ accumulators: [ field('account_balance').average().as('avg_account_balance') ], groups: [field('market_segment')] })پرسوجوهای طرحریزی : پرسوجوهایی که فقط زیرمجموعه خاصی از فیلدها را برمیگردانند. برای مثال:
db.pipeline() .collection("/customers") .select("family_name", "given_name") .limit(10)پرسوجوهای فیلتر : پرسوجوهایی که موتور پرسوجوی Cloud Firestore تشخیص میدهد که استفاده از فیلدهای خرد شده برای فیلتر کردن اسناد مفید است. برای مثال:
db.pipeline() .collection("/customers") .where(equal("given_name", "alice"))
مشاهده میزان استفاده از فیلدهای خرد شده
میتوانید از query explain برای بررسی اینکه آیا یک پرسوجو از فیلدهای shredded استفاده میکند یا خیر، استفاده کنید. گره TableScan در طرح پرسوجو شامل یک بخش Storage با معیارهای زیر است:
- شکل اسکن :
-
shredded_fields_only: کوئری فقط از فیلدهای shredded شده خوانده میشود. -
shredded_fields_backjoin: کوئری از فیلدهای shredded شده میخواند و برای فیلدهای دیگر به سند اصلی متصل میکند.
-
- فیلدهای خرد شده استفاده شده : فهرستی از نام فیلدها که به عنوان فیلدهای خرد شده خوانده میشوند.
- تعداد بررسی مجدد : نقشهای از شمارندهها برای بررسیهای مجدد. بررسی مجدد به معنای بازگشت به خواندن از سند کامل اصلی هنگام اسکن فیلدهای خرد شده است. این ممکن است زمانی اتفاق بیفتد که مقدار فیلد در یک سند از 8 کیلوبایت تجاوز کند، که برای ذخیرهسازی فیلدهای خرد شده بسیار بزرگ است.
خروجی مثال
...
└── • 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]
کنترل استفاده از فیلدهای خرد شده
به طور پیشفرض، Cloud Firestore در صورت وجود از فیلدهای خرد شده استفاده میکند. میتوانید این رفتار را با استفاده از گزینه پرس و جوی table_scan_method کنترل کنید.
مقادیر پشتیبانی شده برای گزینه table_scan_method :
-
shredded_fields_enabled(پیشفرض): در صورت وجود، از فیلدهای shredded استفاده کنید. -
shredded_fields_disabled: از فیلدهای shredded استفاده نکنید. -
force_shredded_fields: اگر اسکن جدول با اسکن فیلدهای shredded شده امکانپذیر نباشد، کوئری با شکست مواجه میشود.
مثال
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();
هشدارهای عملکرد پرس و جو
Cloud Firestore ممکن است در صورت شناسایی استفاده ناکارآمد از فیلد shredded، هشدارهای عملکردی را در نتیجه توضیح پرس و جو منتشر کند. برای مثال:
پرسوجوهای با گزینشپذیری پایین : زمانی رخ میدهد که یک پرسوجو فیلدهای خرد شده را برای فیلتر کردن اسکن میکند اما اسناد بسیار کمی را فیلتر میکند و باعث میشود اسکن ناکارآمد شود.
پرسوجوهای با بررسی مجدد بالا : زمانی رخ میدهد که پرسوجو مرتباً به خواندن کامل سند برمیگردد، که میتواند بر عملکرد تأثیر بگذارد. میتوانید از توابعی مانند
storage_sizeبرای شناسایی مقادیر بزرگی که باعث بررسی مجدد میشوند، استفاده کنید.
در این موارد، غیرفعال کردن خواندن فیلدهای خرد شده با استفاده از گزینههای پرسوجو را در نظر بگیرید.
محدودیتها
Cloud Firestore فقط فیلدهای سطح بالا را خرد میکند. همچنین تعداد فیلدهایی که میتوانند در هر گروه جمعآوری خرد شوند را محدود میکند.