একাধিক ফিল্ডে রেঞ্জ ও ইনইকুয়ালিটি ফিল্টার সহ কোয়েরি অপ্টিমাইজ করুন

এই পৃষ্ঠায় ইনডেক্সিং স্ট্র্যাটেজির উদাহরণ দেওয়া হয়েছে যা আপনি রেঞ্জ ও একাধিক ফিল্ডে অসমতা ফিল্টার সহ কোয়েরির জন্য ব্যবহার করতে পারবেন। এর ফলে কোয়েরি করার অভিজ্ঞতা আরও ভাল হবে।

আপনার কোয়েরি অপ্টিমাইজ করার আগে, সম্পর্কিত ধারণা সম্পর্কে পড়ুন।

কোয়েরি এক্সপ্লেন ব্যবহার করে কোয়েরি অপ্টিমাইজ করা

আপনার কোয়েরি ও ইন্ডেক্স অপ্টিমাল কিনা তা নির্ধারণ করতে, আপনি কোয়েরি প্ল্যানের সারসংক্ষেপ ও কোয়েরির এক্সিকিউশন পরিসংখ্যান পেতে Query Explain ব্যবহার করতে পারেন:

জাভা

Query q = db.collection("employees").whereGreaterThan("salary",
100000).whereGreaterThan("experience", 0);

ExplainResults<QuerySnapshot> explainResults = q.explain(ExplainOptions.builder().analyze(true).build()).get();
ExplainMetrics metrics = explainResults.getMetrics();

PlanSummary planSummary = metrics.getPlanSummary();
ExecutionStats executionStats = metrics.getExecutionStats();

System.out.println(planSummary.getIndexesUsed());
System.out.println(stats.getResultsReturned());
System.out.println(stats.getExecutionDuration());
System.out.println(stats.getReadOperations());
System.out.println(stats.getDebugStats());

Node.js

let q = db.collection("employees")
      .where("salary", ">", 100000)
      .where("experience", ">",0);

let options = { analyze : 'true' };
let explainResults = await q.explain(options);

let planSummary = explainResults.metrics.planSummary;
let stats = explainResults.metrics.executionStats;

console.log(planSummary);
console.log(stats);

নিম্নলিখিত উদাহরণ থেকে বোঝা যায় যে সঠিক ইন্ডেক্স অর্ডারিং ব্যবহার করলে কীভাবে Cloud Firestore-এর স্ক্যান করা ইন্ডেক্স এন্ট্রির সংখ্যা কমে যায়।

সহজ কোয়েরি

কর্মচারীদের কালেকশনের আগের উদাহরণ থেকে, (experience ASC, salary ASC) ইন্ডেক্সের সাথে রান করা সহজ কোয়েরি নিম্নলিখিত:

জাভা

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .whereGreaterThan("experience", 0)
  .orderBy("experience")
  .orderBy("salary");

কোয়েরিটি ৯৫০০০ ইনডেক্স এন্ট্রি স্ক্যান করে মাত্র পাঁচটি ডকুমেন্ট দেখায়। কোয়েরি প্রেডিকেট পূরণ না হওয়ার কারণে, অনেক বেশি সংখ্যক ইন্ডেক্স এন্ট্রি পড়া হলেও সেগুলি ফিল্টার করে বাদ দেওয়া হয়েছে।

// Output query planning info
{
    "indexesUsed": [
        {
            "properties": "(experience ASC, salary ASC, __name__ ASC)",
            "query_scope": "Collection"
        }
    ],

    // Output Query Execution Stats
    "resultsReturned": "5",
    "executionDuration": "2.5s",
    "readOperations": "100",
    "debugStats": {
        "index_entries_scanned": "95000",
        "documents_scanned": "5",
        "billing_details": {
            "documents_billable": "5",
            "index_entries_billable": "95000",
            "small_ops": "0",
            "min_query_cost": "0"
        }
    }
}

আপনি ডোমেন এক্সপার্টাইজ থেকে অনুমান করতে পারেন যে বেশিরভাগ কর্মচারীর অন্তত কিছু অভিজ্ঞতা থাকবে তবে খুব কম জনের বেতন ১,০০,০০০-এর বেশি হবে। এই ইনসাইট থেকে আপনি দেখতে পাবেন যে experience সীমাবদ্ধতার তুলনায় salary সীমাবদ্ধতা আরও বেশি বেছে নেওয়া হয়েছে। কোয়েরি এক্সিকিউট করার জন্য Cloud Firestore যে ইন্ডেক্স ব্যবহার করে, সেটিকে প্রভাবিত করতে, একটি orderBy ক্লজ উল্লেখ করুন যা experience কনস্ট্রেন্টের আগে salary কনস্ট্রেন্টকে সাজায়।

জাভা

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .whereGreaterThan("experience", 0)
  .orderBy("salary")
  .orderBy("experience");

আপনি যখন প্রেডিকেট যোগ করার জন্য স্পষ্টভাবে orderBy() ক্লজ ব্যবহার করেন, Cloud Firestore কোয়েরি চালানোর জন্য (salary ASC, experience ASC) ইন্ডেক্স ব্যবহার করে। এই কোয়েরিতে প্রথম রেঞ্জ ফিল্টারের সিলেক্টিভিটি আগের কোয়েরির তুলনায় বেশি হওয়ার কারণে, কোয়েরি আরও দ্রুত রান করে এবং আরও সাশ্রয়ী হয়।

// Output query planning info
{
    "indexesUsed": [
        {
            "properties": "(salary ASC, experience ASC, __name__ ASC)",
            "query_scope": "Collection"
        }
    ],

    // Output Query Execution Stats
    "resultsReturned": "5",
    "executionDuration": "0.2s",
    "readOperations": "6",
    "debugStats": {
        "index_entries_scanned": "1000",
        "documents_scanned": "5",
        "billing_details": {
            "documents_billable": "5",
            "index_entries_billable": "1000",
            "small_ops": "0",
            "min_query_cost": "0"
        }
    }
}

এর পরে কী করতে হবে