ক্যোয়ারী এক্সপ্লেইন সহ ক্যোয়ারী এক্সিকিউশন বিশ্লেষণ করুন

কোয়েরি এক্সপ্লেইন আপনাকে ব্যাকএন্ডে Cloud Firestore কোয়েরি জমা দিতে এবং বিনিময়ে ব্যাকএন্ডে কোয়েরি সম্পাদনের বিস্তারিত পারফরম্যান্স পরিসংখ্যান পেতে দেয়। এটি অনেক রিলেশনাল ডেটাবেস সিস্টেমের EXPLAIN [ANALYZE] অপারেশনের মতো কাজ করে।

ফায়ারস্টোর সার্ভার ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কোয়েরি এক্সপ্লেইন অনুরোধ পাঠানো যায়।

কোয়েরি এক্সপ্লেইন-এর ফলাফল আপনাকে বুঝতে সাহায্য করে যে আপনার কোয়েরিগুলো কীভাবে সম্পাদিত হচ্ছে, এবং এর মাধ্যমে আপনি অদক্ষতা ও সম্ভাব্য সার্ভার-সাইড প্রতিবন্ধকতার অবস্থান দেখতে পারেন।

প্রশ্ন ব্যাখ্যা করুন:

  • কোয়েরি পরিকল্পনা পর্যায় সম্পর্কে ধারণা দেয়, যার ফলে আপনি আপনার কোয়েরি ইনডেক্সগুলো সমন্বয় করে কার্যকারিতা বাড়াতে পারেন।
  • অ্যানালাইজ অপশনটি ব্যবহার করে আপনি প্রতিটি কোয়েরির ভিত্তিতে আপনার খরচ ও পারফরম্যান্স বুঝতে পারবেন এবং বিভিন্ন কোয়েরি প্যাটার্নের ব্যবহার অপ্টিমাইজ করার জন্য দ্রুত সেগুলোর মধ্যে তুলনা করতে পারবেন।

কোয়েরি এক্সপ্লেইন অপশনগুলো বুঝুন: ডিফল্ট এবং বিশ্লেষণ করুন

ডিফল্ট অপশন অথবা অ্যানালাইজ অপশন ব্যবহার করে কোয়েরি এক্সপ্লেইন অপারেশন সম্পাদন করা যায়।

ডিফল্ট অপশনটি চালু থাকলে, কোয়েরি এক্সপ্লেইন কোয়েরিটির পরিকল্পনা করে, কিন্তু এক্সিকিউশন পর্যায়টি এড়িয়ে যায়। এটি প্ল্যানার পর্যায়ের তথ্য ফেরত দেবে। কোনো কোয়েরিতে প্রয়োজনীয় ইনডেক্স আছে কিনা এবং কোন ইনডেক্সগুলো ব্যবহৃত হচ্ছে, তা যাচাই করতে আপনি এটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, এটি আপনাকে যাচাই করতে সাহায্য করবে যে কোনো নির্দিষ্ট কোয়েরি অনেকগুলো ভিন্ন ভিন্ন ইনডেক্সের মধ্যে ইন্টারসেক্ট না করে একটি কম্পোজিট ইনডেক্স ব্যবহার করছে।

অ্যানালাইজ অপশনটির মাধ্যমে, কোয়েরি এক্সপ্লেইন কোয়েরিটির পরিকল্পনা ও সম্পাদন উভয়ই করে। এটি পূর্বে উল্লিখিত প্ল্যানারের সমস্ত তথ্যের পাশাপাশি কোয়েরি এক্সিকিউশন রানটাইমের পরিসংখ্যানও ফেরত দেয়। এর মধ্যে কোয়েরিটির বিলিং তথ্যের পাশাপাশি কোয়েরি এক্সিকিউশন সম্পর্কিত সিস্টেম-স্তরের অন্তর্দৃষ্টিও অন্তর্ভুক্ত থাকবে। আপনি এই টুলিং ব্যবহার করে বিভিন্ন কোয়েরি ও ইনডেক্স কনফিগারেশন পরীক্ষা করে সেগুলোর খরচ এবং ল্যাটেন্সি অপ্টিমাইজ করতে পারেন।

Query Explain-এর খরচ কত?

আপনি যখন ডিফল্ট অপশন সহ কোয়েরি এক্সপ্লেইন ব্যবহার করেন, তখন কোনো ইনডেক্স বা রিড অপারেশন সম্পাদিত হয় না। কোয়েরির জটিলতা নির্বিশেষে, একটি রিড অপারেশনের জন্য চার্জ প্রযোজ্য হয়।

যখন আপনি অ্যানালাইজ অপশনসহ কোয়েরি এক্সপ্লেইন ব্যবহার করেন, তখন ইনডেক্স এবং রিড অপারেশন সম্পাদিত হয়, তাই কোয়েরিটির জন্য আপনাকে যথারীতি চার্জ করা হয়। এই অ্যানালাইসিস কার্যক্রমের জন্য কোনো অতিরিক্ত চার্জ নেই, শুধুমাত্র কোয়েরিটি এক্সিকিউট করার জন্য স্বাভাবিক চার্জটিই প্রযোজ্য।

ডিফল্ট বিকল্প সহ Query Explain ব্যবহার করুন

আপনি ক্লায়েন্ট লাইব্রেরিগুলো ব্যবহার করে একটি ডিফল্ট অপশন অনুরোধ জমা দিতে পারেন।

উল্লেখ্য যে, সাধারণ কোয়েরি অপারেশনের জন্য ব্যবহৃত একই অনুমতি ব্যবহার করে IAM-এর মাধ্যমে অনুরোধগুলি প্রমাণীকৃত হয়। Firebase Authentication মতো অন্যান্য প্রমাণীকরণ পদ্ধতি উপেক্ষা করা হয়। আরও তথ্যের জন্য, সার্ভার ক্লায়েন্ট লাইব্রেরির জন্য 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)"},
    ]
}

আরও তথ্যের জন্য, কোয়েরি এক্সপ্লেইন রিপোর্ট রেফারেন্স দেখুন।

অ্যানালাইজ অপশনের সাথে কোয়েরি এক্সপ্লেইন ব্যবহার করুন

আপনি ক্লায়েন্ট লাইব্রেরিগুলো ব্যবহার করে একটি বিশ্লেষণ বিকল্পের অনুরোধ জমা দিতে পারেন।

উল্লেখ্য যে, সাধারণ কোয়েরি অপারেশনের জন্য ব্যবহৃত একই অনুমতি ব্যবহার করে IAM-এর মাধ্যমে অনুরোধগুলি প্রমাণীকৃত হয়। Firebase Authentication মতো অন্যান্য প্রমাণীকরণ পদ্ধতি উপেক্ষা করা হয়। আরও তথ্যের জন্য, সার্ভার ক্লায়েন্ট লাইব্রেরির জন্য 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;

    

নিম্নলিখিত উদাহরণটি planInfo এর পাশাপাশি ফেরত আসা stats অবজেক্টটি দেখায়। প্রতিক্রিয়ার সঠিক বিন্যাস এক্সিকিউশন এনভায়রনমেন্টের উপর নির্ভর করে। উদাহরণ প্রতিক্রিয়াটি JSON ফরম্যাটে রয়েছে।

{
    "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",
               }
    }

}

আরও তথ্যের জন্য, কোয়েরি এক্সপ্লেইন রিপোর্ট রেফারেন্স দেখুন।

ফলাফল ব্যাখ্যা করুন এবং প্রয়োজনীয় পরিবর্তন আনুন।

চলুন এমন একটি উদাহরণ দেখি যেখানে আমরা সিনেমার ধরণ এবং প্রযোজনা দেশ অনুসারে অনুসন্ধান করি।

উদাহরণস্বরূপ, এই SQL কোয়েরিটির সমতুল্য বিষয়টি ধরে নিন।

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

যদি আমরা অ্যানালাইজ অপশনটি ব্যবহার করি, তাহলে প্রাপ্ত মেট্রিক্স থেকে দেখা যায় যে কোয়েরিটি দুটি একক-ফিল্ড ইনডেক্স, (category ASC, __name__ ASC) এবং (country ASC, __name__ ASC) এর উপর চলে। এটি ১৬৫০০টি ইনডেক্স এন্ট্রি স্ক্যান করে, কিন্তু মাত্র ১২০০টি ডকুমেন্ট ফেরত দেয়।

// 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",
               }
    }
}