Query Explain আপনাকে ব্যাকএন্ডে Cloud Firestore কোয়েরি জমা দিতে এবং বিনিময়ে ব্যাকএন্ড কোয়েরি এক্সিকিউশন সম্পর্কে বিস্তারিত পারফর্ম্যান্স পরিসংখ্যান পেতে দেয়। এটি অনেক রিলেশনাল ডেটাবেস সিস্টেমে EXPLAIN [ANALYZE] অপারেশনের মতো
কাজ করে।
Firestore সার্ভার ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কোয়েরি ব্যাখ্যা করার অনুরোধ পাঠানো যেতে পারে।
কোয়েরি ব্যাখ্যা করার ফলাফল আপনাকে বুঝতে সাহায্য করে যে আপনার কোয়েরি কীভাবে সম্পন্ন হয়, আপনাকে অদক্ষতা এবং সার্ভার-সাইড বাধার সম্ভাব্য লোকেশন দেখায়।
কোয়েরি ব্যাখ্যা:
- কোয়েরি প্ল্যানিং ফেজে ইনসাইট প্রদান করে যাতে আপনি কোয়েরি ইনডেক্স অ্যাডজাস্ট করতে এবং দক্ষতা বাড়াতে পারেন।
- বিশ্লেষণ করার বিকল্প ব্যবহার করলে, কোয়েরি প্রতি খরচ ও পারফর্ম্যান্স বুঝতে পারবেন এবং ব্যবহার অপ্টিমাইজ করার জন্য বিভিন্ন কোয়েরি প্যাটার্ন দ্রুত পুনরাবৃত্তি করতে পারবেন।
কোয়েরি ব্যাখ্যা করার বিকল্পগুলি বুঝুন: ডিফল্ট এবং বিশ্লেষণ করুন
ডিফল্ট বিকল্প বা বিশ্লেষণ করুন বিকল্প ব্যবহার করে কোয়েরি ব্যাখ্যা করার অপারেশন করা যেতে পারে।
ডিফল্ট বিকল্পের মাধ্যমে, Query Explain কোয়েরি প্ল্যান করে, কিন্তু এক্সিকিউশন স্টেজ এড়িয়ে যায়। এটি প্ল্যানার স্টেজ সংক্রান্ত তথ্য ফিরিয়ে দেবে। আপনি এটি ব্যবহার করে চেক করতে পারেন যে কোনও কোয়েরিতে প্রয়োজনীয় ইনডেক্স আছে কিনা এবং বুঝতে পারেন যে কোন ইনডেক্স ব্যবহার করা হয়েছে। এটি আপনাকে যাচাই করতে সাহায্য করবে, যেমন, একটি নির্দিষ্ট কোয়েরি অনেক বিভিন্ন ইন্ডেক্স জুড়ে ইন্টারসেক্ট করার পরিবর্তে একটি কম্পোজিট ইন্ডেক্স ব্যবহার করছে।
বিশ্লেষণ করার বিকল্পের মাধ্যমে, কোয়েরি ব্যাখ্যা করার ফিচার দুটি প্ল্যানই করে এবং কোয়েরি এক্সিকিউট করে। এটি কোয়েরি এক্সিকিউশন রানটাইম থেকে পাওয়া পরিসংখ্যানের সাথে আগে উল্লেখ করা সব প্ল্যানার তথ্য ফিরিয়ে দেয়। এর মধ্যে কোয়েরির বিলিংয়ের তথ্য এবং কোয়েরি এক্সিকিউশন সম্পর্কে সিস্টেম-লেভেল ইনসাইট অন্তর্ভুক্ত থাকবে। আপনি এই টুলিং ব্যবহার করে বিভিন্ন কোয়েরি ও ইন্ডেক্স কনফিগারেশন পরীক্ষা করতে পারেন যাতে সেগুলির খরচ ও লেটেন্সি অপ্টিমাইজ করা যায়।
Query Explain-এর জন্য কত খরচ হয়?
ডিফল্ট বিকল্পের সাথে 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", } } }