عملکرد پرس و جو را با استفاده از Query Explain درک کنید

Query Explain به شما امکان می دهد پرس و جوهای Cloud Firestore را به باطن ارسال کنید و در ازای آن آمار عملکرد دقیقی را در مورد اجرای پرس و جوی پشتیبان دریافت کنید. عملکرد آن مانند عملیات EXPLAIN [ANALYZE] در بسیاری از سیستم های پایگاه داده رابطه ای است.

درخواست های Query Explain را می توان با استفاده از کتابخانه های سرویس گیرنده سرور Firestore ارسال کرد.

نتایج Query Explain به شما کمک می کند تا نحوه اجرای پرس و جوهای خود را درک کنید و ناکارآمدی ها و محل تنگناهای احتمالی سمت سرور را به شما نشان می دهد.

پرس و جو توضیح دهید:

  • بینش هایی را در مورد مرحله برنامه ریزی پرس و جو ارائه می دهد تا بتوانید شاخص های درخواست خود را تنظیم کرده و کارایی را افزایش دهید.
  • استفاده از گزینه تجزیه و تحلیل، به شما کمک می کند تا هزینه و عملکرد خود را بر اساس هر پرس و جو درک کنید و به شما امکان می دهد به سرعت الگوهای پرس و جو را تکرار کنید تا استفاده از آنها را بهینه کنید.

درک گزینه های Query Explain: پیش فرض و تجزیه و تحلیل

عملیات Query Explain را می توان با استفاده از گزینه پیش فرض یا گزینه تجزیه و تحلیل انجام داد.

با گزینه پیش فرض، Query Explain پرس و جو را برنامه ریزی می کند، اما از مرحله اجرا می گذرد. این اطلاعات مرحله برنامه ریز را برمی گرداند. می توانید از این برای بررسی اینکه یک پرس و جو دارای شاخص های لازم است و درک اینکه کدام شاخص ها استفاده می شوند استفاده کنید. این به شما کمک می‌کند تا به‌عنوان مثال، تأیید کنید که یک پرس‌وجو خاص از یک شاخص ترکیبی استفاده می‌کند تا مجبور باشد روی شاخص‌های مختلف متقاطع شود.

با گزینه تجزیه و تحلیل، Query Explain هم پرس و جو را برنامه ریزی و هم اجرا می کند. این همه اطلاعات برنامه ریز که قبلا ذکر شد را به همراه آماری از زمان اجرای پرس و جو برمی گرداند. این شامل اطلاعات صورتحساب پرس و جو به همراه بینش در سطح سیستم در مورد اجرای پرس و جو می شود. شما می توانید از این ابزار برای آزمایش پیکربندی های مختلف پرس و جو و فهرست برای بهینه سازی هزینه و تأخیر آنها استفاده کنید.

هزینه Query Explin چقدر است؟

وقتی از Query Explain با گزینه پیش فرض استفاده می کنید، هیچ عملیات فهرست یا خواندن انجام نمی شود. صرف نظر از پیچیدگی پرس و جو، یک عملیات خواندن شارژ می شود.

هنگامی که از Query Explain با گزینه Analysis استفاده می کنید، عملیات نمایه سازی و خواندن انجام می شود، بنابراین طبق معمول هزینه پرس و جو از شما دریافت می شود. هیچ هزینه اضافی برای فعالیت تجزیه و تحلیل وجود ندارد، فقط هزینه معمول برای پرس و جو در حال اجرا است.

از Query Explin با گزینه پیش فرض استفاده کنید

می توانید از کتابخانه های مشتری برای ارسال درخواست گزینه پیش فرض استفاده کنید.

توجه داشته باشید که درخواست ها با استفاده از همان مجوزها برای عملیات پرس و جوی معمولی با استفاده از IAM احراز هویت می شوند. سایر تکنیک‌های احراز هویت، مانند احراز هویت Firebase، نادیده گرفته می‌شوند. برای اطلاعات بیشتر، راهنمای IAM برای کتابخانه های سرویس گیرنده سرور را ببینید.

جاوا (ادمین)

Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();

    
گره (مدیر)

const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;

    

نتایج برگردانده شده را می توان به JSON تبدیل کرد. مثلا:

{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

برای اطلاعات بیشتر، به مرجع گزارش Query Explin مراجعه کنید.

از Query Explin با گزینه Analysis استفاده کنید

می توانید از کتابخانه های مشتری برای ارسال درخواست گزینه تجزیه و تحلیل استفاده کنید.

توجه داشته باشید که درخواست ها با استفاده از همان مجوزها برای عملیات پرس و جوی معمولی با استفاده از IAM احراز هویت می شوند. سایر تکنیک‌های احراز هویت، مانند احراز هویت Firebase، نادیده گرفته می‌شوند. برای اطلاعات بیشتر، راهنمای IAM برای کتابخانه های سرویس گیرنده سرور را ببینید.

جاوا (ادمین)

Query q = db.collection("col").whereGreaterThan("a", 1);

ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();

ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();

    
گره (مدیر)

const q = db.collection('col').where('country', '=', 'USA');

const options = { analyze : 'true' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;

    

نتایج برگردانده شده را می توان به JSON تبدیل کرد. مثال زیر شی stats را نشان می دهد که اکنون علاوه بر planInfo دریافت می کنیم.

{
    "resultsReturned": "5",
    "executionDuration": "0.100718s",
    "readOperations": "5",
    "debugStats": {
               "index_entries_scanned": "95000",
               "documents_scanned": "5"
               "billing_details": {
                     "documents_billable": "5",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }

}

برای اطلاعات بیشتر، به مرجع گزارش Query Explin مراجعه کنید.

نتایج را تفسیر کنید و تنظیمات را انجام دهید

بیایید به یک سناریوی مثال نگاه کنیم که در آن فیلم‌ها را بر اساس ژانر و کشور سازنده جویا می‌شویم.

برای مثال، معادل این پرس و جوی SQL را فرض کنید.

SELECT *
FROM /movies
WHERE category = 'Romantic' AND country = 'USA';

اگر از گزینه تجزیه و تحلیل استفاده کنیم، معیارهای بازگشتی نشان می‌دهند که پرس و جو در دو شاخص تک فیلدی اجرا می‌شود، (category ASC, __name__ ASC) و (country ASC, __name__ ASC) . 16500 ورودی فهرست را اسکن می کند، اما تنها 1200 سند را برمی گرداند.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

// Output query status
{
    "resultsReturned": "1200",
    "executionDuration": "0.118882s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "16500",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}

برای بهینه سازی عملکرد اجرای پرس و جو، می توانید یک نمایه ترکیبی کاملاً پوشیده (category ASC, country ASC, __name__ ASC) ایجاد کنید.

با اجرای مجدد پرس و جو با گزینه تجزیه و تحلیل، می بینیم که نمایه جدید ایجاد شده برای این پرس و جو انتخاب شده است و پرس و جو بسیار سریعتر و کارآمدتر اجرا می شود.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, country ASC,  __name__ ASC)"}
    ]
}

// Output query stats
{
    "resultsReturned": "1200",
    "executionDuration": "0.026139s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "1200",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}