একাধিক ক্ষেত্রে পরিসীমা এবং অসমতা ফিল্টার সহ অনুসন্ধানগুলি অপ্টিমাইজ করুন৷

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

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

কোয়েরি ব্যাখ্যা করে কোয়েরি অপ্টিমাইজ করুন

আপনার কোয়েরি এবং ইনডেক্সগুলি সর্বোত্তম কিনা তা নির্ধারণ করতে, আপনি কোয়েরির পরিকল্পনার সারাংশ এবং কার্যকরকরণ পরিসংখ্যান পেতে 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());

নোড.জেএস

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

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

জাভা

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

যখন আপনি স্পষ্টভাবে orderBy() ধারাটি ব্যবহার করে predicates যোগ করেন, তখন 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"
        }
    }
}

এরপর কি?