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

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

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

Query Explain সহ কোয়েরি অপ্টিমাইজ করুন

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

ক্যোয়ারীটি 95000টি ইনডেক্স এন্ট্রি স্ক্যান করে শুধুমাত্র পাঁচটি নথি ফেরত দেয়। যেহেতু ক্যোয়ারী প্রিডিকেট সন্তুষ্ট নয়, তাই প্রচুর সংখ্যক ইনডেক্স এন্ট্রি পড়া হয় কিন্তু ফিল্টার করা হয়।

// 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 ক্যোয়ারী চালানোর জন্য যে সূচীটি ব্যবহার করে সেটিকে প্রভাবিত করতে, একটি 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"
        }
    }
}

এরপর কি