ধীরগতির কোয়েরির সমস্যার সমাধান করতে, কোয়েরি ব্যাখ্যা ব্যবহার করে কোয়েরি এক্সিকিউশন প্ল্যান ও রানটাইম এক্সিকিউশন প্রোফাইল পান। নিম্নলিখিত বিভাগে সেইসব ধাপের বর্ণনা দেওয়া হয়েছে যা আপনি এক্সিকিউশন প্রোফাইলের উপর নির্ভর করে কোয়েরি পারফর্ম্যান্স অপ্টিমাইজ করার জন্য নিতে পারেন:
ফলাফলের সংখ্যা সীমিত করুন
কোয়েরি অনেক ডকুমেন্ট রিটার্ন করছে কিনা তা শনাক্ত করতে
এক্সিকিউশন ট্রিতে রিটার্ন করা রেকর্ডের ফিল্ড ব্যবহার করুন। limit(...) স্টেজ ব্যবহার করে
ফেরত আসা ডকুমেন্টের সংখ্যা
সীমিত করার কথা বিবেচনা করুন। এটি নেটওয়ার্কের মাধ্যমে ক্লায়েন্টদের কাছে ফেরত দেওয়ার সময় ফলাফলের সিরিয়ালাইজড বাইট সাইজ কমিয়ে দেয়। যেসব ক্ষেত্রে
Limit নোডের আগে MajorSort নোড থাকে, সেখানে কোয়েরি ইঞ্জিন
Limit ও MajorSort নোডকে একত্রিত করতে পারে এবং সম্পূর্ণ ইন-মেমরি
মেটেরিয়ালাইজেশন ও সর্টকে TopN সর্ট দিয়ে প্রতিস্থাপন করে, যার ফলে কোয়েরির জন্য
মেমরির প্রয়োজনীয়তা কমে যায়।
ফলাফল ডকুমেন্টের সাইজ সীমিত করুন
ফেরত পাঠানো ডকুমেন্টের সাইজ সীমিত করার কথা বিবেচনা করুন।
এটি করতে select(...) ব্যবহার করে শুধু প্রয়োজনীয় ফিল্ড ফেরত পাঠান
অথবা remove_fields(...) ব্যবহার করে অতিরিক্ত বড় ফিল্ড
বাতিল করুন। এটি ইন্টারমিডিয়েট ফলাফল প্রসেস করার কম্পিউট ও মেমরি খরচ এবং নেটওয়ার্কের মাধ্যমে ক্লায়েন্টকে ফলাফল ফেরত পাঠানোর সময় ফলাফলের সিরিয়ালাইজ করা বাইট সাইজ কমাতে সাহায্য করে। কোয়েরিতে উল্লেখ করা সব ফিল্ড রেগুলার ইন্ডেক্সের মাধ্যমে কভার করা হলে, এটি ইন্ডেক্স স্ক্যানের মাধ্যমে কোয়েরি সম্পূর্ণভাবে কভার করার অনুমতি দেয়, যার ফলে প্রাইমারি স্টোরেজ থেকে ডকুমেন্ট আনার প্রয়োজন হয় না।
ইনডেক্স ব্যবহার করুন
ইনডেক্স সেট-আপ ও অপ্টিমাইজ করতে নিম্নলিখিত নির্দেশাবলী ব্যবহার করুন।
কোয়েরি কোনও ইনডেক্স ব্যবহার করছে কিনা তা শনাক্ত করুন
এক্সিকিউশন ট্রিতে লিফ নোড চেক করে আপনি শনাক্ত করতে পারবেন যে কোয়েরিটি কোনও ইন্ডেক্স ব্যবহার করছে কিনা। এক্সিকিউশন ট্রির লিফ নোড যদি TableScan নোড হয়, তাহলে বুঝতে হবে যে কোয়েরি কোনও ইন্ডেক্স ব্যবহার করছে না এবং প্রাইমারি স্টোরেজ থেকে ডকুমেন্ট স্ক্যান করছে। কোনও ইন্ডেক্স ব্যবহার করা হলে, এক্সিকিউশন ট্রির লিফ নোড ইন্ডেক্সের ইন্ডেক্স আইডি ও ইন্ডেক্স ফিল্ড দেখাবে।
আরও ভাল ইন্ডেক্স শনাক্ত করুন
কোনও কোয়েরির জন্য ইনডেক্স তখনই উপযোগী হয় যখন এটি প্রাইমারি স্টোরেজ থেকে কোয়েরি ইঞ্জিনের মাধ্যমে ফেচ করা ডকুমেন্টের সংখ্যা কমাতে পারে অথবা এর ফিল্ড অর্ডারিং কোয়েরির সর্ট করার প্রয়োজনীয়তা পূরণ করতে পারে।
কোনও কোয়েরির জন্য ইন্ডেক্স ব্যবহার করা হলেও, কোয়েরি ইঞ্জিন এখনও অনেক ডকুমেন্ট ফেচ ও বাতিল করছে, যেমন, স্ক্যান নোড দ্বারা শনাক্ত করা হয়েছে যে, এটি অনেক রেকর্ড রিটার্ন করে, যার পরে ফিল্টার নোড কিছু রেকর্ড রিটার্ন করে, এটি থেকে বোঝা যায় যে, ইন্ডেক্স ব্যবহার করে কোয়েরি প্রেডিকেট সন্তুষ্ট করা বেছে নেওয়া হয়নি। আরও উপযুক্ত ইন্ডেক্স তৈরি করতে, ইন্ডেক্স তৈরি করুন দেখুন।
কোনও কোয়েরির জন্য ইন্ডেক্স ব্যবহার করা হলেও, কোয়েরি ইঞ্জিন যদি এখনও ফলাফল সেটের ইন-মেমরি রিঅর্ডারিং করে, যেমন কোয়েরি এক্সিকিউশন ট্রিতে MajorSort নোড দ্বারা শনাক্ত করা হয়, তাহলে এটি ইঙ্গিত করে যে ব্যবহৃত ইন্ডেক্সটি কোয়েরির Sort সংক্রান্ত প্রয়োজনীয়তা পূরণ করতে ব্যবহার করা যাবে না। আরও উপযুক্ত ইনডেক্স তৈরি করতে, পরবর্তী বিভাগ দেখুন।
ইনডেক্স তৈরি করুন
ইনডেক্স তৈরি করতে ইনডেক্স ম্যানেজমেন্ট ডকুমেন্টেশন ফলো করুন। আপনার কোয়েরি যাতে ইন্ডেক্স ব্যবহার করতে পারে তা নিশ্চিত করতে, নিম্নলিখিত ক্রমে ফিল্ড সহ রেগুলার (মাল্টিকি নয়) ইন্ডেক্স তৈরি করুন:
- ইকুয়ালিটি অপারেটরে ব্যবহার করা হবে এমন সব ফিল্ড। কোয়েরি জুড়ে আবার ব্যবহার করার সম্ভাবনা সর্বাধিক করতে, কোয়েরি জুড়ে ইকুয়ালিটি অপারেটরে ফিল্ডের উপস্থিতির নিম্নক্রম অনুসারে ফিল্ডগুলি সাজান।
- যেসব ফিল্ড সাজানো হবে (একই ক্রমে)।
- কোয়েরি কনস্ট্রেন্ট সিলেক্টিভিটির নিম্নক্রম অনুযায়ী রেঞ্জ বা ইনইকুয়ালিটি অপারেটরে ব্যবহার করা হবে এমন ফিল্ড।
- ইনডেক্সে কোয়েরির অংশ হিসেবে যেসব ফিল্ড ফেরত পাঠানো হবে: ইনডেক্সে এই ধরনের ফিল্ড অন্তর্ভুক্ত করলে, ইনডেক্স কোয়েরি কভার করতে পারে এবং প্রাইমারি স্টোরেজ থেকে ডকুমেন্ট আনার প্রয়োজন হয় না।
ইনডেক্স বা টেবিল স্ক্যান করতে বাধ্য করা
আপনি Cloud Firestore-এ কোয়েরি করলে, এটি অটোমেটিক এমন যেকোনও ইন্ডেক্স ব্যবহার করে যা
কোয়েরিকে আরও দক্ষ করে তুলতে পারে। এর ফলে, আপনার কোয়েরির জন্য কোনও ইন্ডেক্স
উল্লেখ করতে হবে না। তবে, আপনার ওয়ার্কলোডের জন্য গুরুত্বপূর্ণ কোয়েরির ক্ষেত্রে, আরও সামঞ্জস্যপূর্ণ পারফর্ম্যান্সের জন্য আমরা আপনাকে forceIndex বিকল্পটি
ব্যবহার করার সাজেশন দিই।
কিছু ক্ষেত্রে, Cloud Firestore এমন একটি ইন্ডেক্স বেছে নিতে পারে যার ফলে কোয়েরি লেটেন্সি
বেড়ে যায়। আপনি যদি পারফর্ম্যান্স রিগ্রেশনের জন্য সমস্যার সমাধানকরণ ধাপ অনুসরণ করে থাকেন এবং
নিশ্চিত হন যে কোয়েরির জন্য অন্য ইন্ডেক্স ব্যবহার করা যুক্তিযুক্ত, তাহলে আপনি forceIndex বিকল্প ব্যবহার করে ইন্ডেক্স নির্দিষ্ট করতে পারেন।
Cloud Firestore-এর ডিফল্ট কোয়েরি প্ল্যান ওভাররাইড করতে এবং ব্যবহার করার জন্য কোনও ইন্ডেক্স নির্দিষ্ট করতে অথবা কোনও টেবিল স্ক্যান করতে বাধ্য করতে, আপনি Pipeline অপারেশনে যেকোনও ইনপুট স্টেজে forceIndex বিকল্প ব্যবহার করতে পারবেন।
নির্দিষ্ট কোনও ইন্ডেক্সে জোর দিন
কোয়েরিকে নির্দিষ্ট ইন্ডেক্স ব্যবহার করতে বাধ্য করতে, forceIndex বিকল্পে
স্ট্রিং হিসেবে ইন্ডেক্স আইডি দিন। আপনি কনসোল বা সমস্যার মেসেজ থেকে
ইনডেক্স আইডি খুঁজে পেতে পারেন।
নিম্নলিখিত উদাহরণটি প্ল্যানারকে CICAgOi36pgK আইডি সহ ইন্ডেক্স ব্যবহার করতে বাধ্য করে:
Node.js
// Force Planner to use Index ID CICAgOi36pgK await db.pipeline() .collectionGroup({ collectionId: "customers", forceIndex: "CICAgOi36pgK" }) .limit(100) .execute();
জাভা
// Force Planner to use Index ID CICAgOi36pgK Pipeline.Snapshot results1 = firestore.pipeline() .collectionGroup("customers", new CollectionGroupOptions() .withHints(new CollectionHints().withForceIndex("CICAgOi36pgK"))) .limit(100) .execute().get();
Go
// Force Planner to use Index ID CICAgOi36pgK snapshot1 := client.Pipeline(). CollectionGroup("customers", firestore.WithForceIndex("CICAgOi36pgK")). Limit(100). Execute(ctx)
নির্দিষ্ট ইন্ডেক্স ব্যবহার করার জন্য বাধ্য করার কিছু উদাহরণ এখানে দেওয়া হল:
- বিভিন্ন ইনডেক্সের পারফর্ম্যান্স পরীক্ষা করা হচ্ছে।
- কোনও কোয়েরির জন্য নির্দিষ্ট, পরিচিত-অনুকূল ইনডেক্স ব্যবহার করা হচ্ছে কিনা তা নিশ্চিত করা।
- কোনও নির্দিষ্ট কোয়েরির জন্য অপ্টিমাইজারের ডিফল্ট পছন্দ সাবঅপ্টিমাল হলে, অপ্টিমাইজারকে ওভাররাইড করা।
নির্দিষ্ট করা ইন্ডেক্স খুঁজে পাওয়া না গেলে, কোয়েরি কাজ করে না।
টেবিল স্ক্যান করতে বাধ্য করুন
কোনও সেকেন্ডারি ইন্ডেক্স ব্যবহার না করেই টেবিল স্ক্যান কালেকশন বা কালেকশন গ্রুপের ডকুমেন্ট পড়ে। টেবিল স্ক্যান করতে বাধ্য করতে, forceIndex-কে primary-এ সেট করুন।
নিম্নলিখিত উদাহরণটি একটি টেবিল স্ক্যান করতে বাধ্য করে:
// Force Planner to only do a Full-Table Scan
db.pipeline()
.collectionGroup({ collectionId: "customers", forceIndex: "primary" })
.limit(100)
আপনি নিম্নলিখিত ক্ষেত্রে টেবিল স্ক্যান ব্যবহার করতে পারেন:
- খুব ছোট সংগ্রহের জন্য যেখানে ইন্ডেক্স ওভারহেড যুক্তিযুক্ত নয়।
- এমন কোয়েরির জন্য যা কোনও কালেকশনের বেশিরভাগ ডকুমেন্ট অ্যাক্সেস করে।
- ডিবাগিং ও পারফর্ম্যান্সের তুলনা করার জন্য।
কোয়েরি এক্সপ্লেন সহ forceIndex ব্যবহার করুন
forceIndex-এর প্রভাব পর্যবেক্ষণ করতে আপনি explain বা analyze মোডে কোয়েরি ব্যাখ্যা ব্যবহার করতে পারেন:
- Cloud Firestore,
forceIndex-এ নির্দিষ্ট করা ইন্ডেক্স ব্যবহার করেছে কিনা তা যাচাই করতে ইন্ডেক্স আইডির জন্য এক্সিকিউশন ট্রির লিফ নোড চেক করুন। forceIndex: "primary"ব্যবহার করার সময়, প্ল্যানেTableScanনোড দেখা যাচ্ছে কিনা তা কনফার্ম করুন।analyzeমোডের সাহায্যে, কোয়েরি পারফর্ম্যান্স ফাইন-টিউন করতে,forceIndexসহ এবং ছাড়া পারফর্ম্যান্স মেট্রিক্স—যেমন লেটেন্সি, স্ক্যান করা ডকুমেন্ট এবং স্ক্যান করা ইন্ডেক্স এন্ট্রি—তুলনা করুন।
forceIndex-এর পেশাদার পদ্ধতি
forceIndex কোয়েরি এক্সিকিউশনের উপর আরও বেশি কন্ট্রোল প্রদান করলেও,
Cloud Firestore-এর কোয়েরি অপ্টিমাইজার সাধারণত বেশিরভাগ ব্যবহারের ক্ষেত্রে দক্ষ।
forceIndex ব্যবহার করার সময় নিম্নলিখিত পেশাদার পদ্ধতিগুলি বিবেচনা করুন:
forceIndexবিচক্ষণতার সাথে ব্যবহার করুন। ডিফল্ট কোয়েরি প্ল্যানের সাথে সাবঅপ্টিমাল পারফর্ম্যান্স লক্ষ্য করলে, ইনডেক্স প্রয়োগ করার আগে সমস্যা ডায়াগনসিস করতে কোয়েরি ব্যাখ্যা ব্যবহার করুন।forceIndexব্যবহার করার সময়, আপনার কোয়েরির পারফর্ম্যান্স ও খরচ সংক্রান্ত বৈশিষ্ট্য বুঝতে, বাস্তবসম্মত ডেটা ভলিউম দিয়ে সেগুলি পরীক্ষা করতে ভুলবেন না।- প্রোডাকশন এনভায়রনমেন্টে বড় কালেকশনের ক্ষেত্রে
forceIndex: "primary"ব্যবহার করা এড়িয়ে চলুন।
Query Explain-এর মাধ্যমে এক্সিকিউট করা কোয়েরির আউটপুট সম্পর্কে আরও তথ্যের জন্য, কোয়েরি এক্সিকিউশন রেফারেন্স দেখুন।