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

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

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

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);

নিম্নলিখিত উদাহরণ দেখায় কিভাবে সঠিক সূচী ক্রম ব্যবহার ক্লাউড ফায়ারস্টোর স্ক্যান করে এমন সূচক এন্ট্রির সংখ্যা হ্রাস করে।

সহজ প্রশ্ন

কর্মচারীদের সংগ্রহের পূর্ববর্তী উদাহরণের সাথে, (experience ASC, salary ASC) সূচকের সাথে চলা সহজ প্রশ্নটি নিম্নরূপ:

জাভা

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

ক্যোয়ারীটি শুধুমাত্র 5টি নথি ফেরত দিতে 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 সীমাবদ্ধতার চেয়ে বেশি নির্বাচনী। ক্লাউড ফায়ারস্টোর ক্যোয়ারী চালানোর জন্য যে সূচীটি ব্যবহার করে সেটিকে প্রভাবিত করতে, একটি orderBy ধারা উল্লেখ করুন যা experience সীমাবদ্ধতার আগে salary সীমাবদ্ধতার আদেশ দেয়।

জাভা

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

আপনি যখন প্রেডিকেট যোগ করার জন্য orderBy() ক্লজটি স্পষ্টভাবে ব্যবহার করেন, তখন ক্লাউড ফায়ারস্টোর ক্যোয়ারী চালানোর জন্য (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"
        }
    }
}

এরপর কি