আপনি সম্ভবত এটি শুনতে চান না, তবে গতি বাড়ানোর সেরা বিকল্পটি শুরু SELECT DISTINCT
করা এড়ানো DISTINCT
। অনেক ক্ষেত্রে (সমস্ত নয়!) এটি আরও ভাল ডাটাবেস-ডিজাইন বা আরও ভাল ক্যোরিয়াস দিয়ে এড়ানো যেতে পারে।
কখনও কখনও, GROUP BY
দ্রুত হয়, কারণ এটি একটি ভিন্ন কোড পাথ নেয়।
ইন আপনার নির্দিষ্ট ক্ষেত্রে , এটা মনে হয় না মনে হচ্ছে আপনি পরিত্রাণ পেতে পারেন DISTINCT
। তবে আপনার যদি সেই ধরণের অনেক প্রশ্ন থাকে তবে আপনি বিশেষায়িত সূচকের সাহায্যে ক্যোয়ারিকে সমর্থন করতে পারেন:
CREATE INDEX foo ON events (project_id, "time", user_id);
user_id
আপনি কেবলমাত্র সূচি-স্ক্যানগুলি এড়িয়ে পান তবে যোগ করা কেবলমাত্র কার্যকর । বিস্তারিত জানার জন্য লিঙ্কটি অনুসরণ করুন। আপনার ক্যোয়ারী পরিকল্পনা থেকে ব্যয়বহুল বিটম্যাপ হ্যাপ স্ক্যানটি সরিয়ে ফেলবে , যা ক্যোয়ারির 90% সময় ব্যয় করে।
আপনার EXPLAIN
আউটপুট আমাকে বলেছে যে কোয়েরিতে অর্ধ মিলিয়ন মিলিয়ন সারিগুলির মধ্যে 2,491 স্বতন্ত্র ব্যবহারকারীকে ঘনীভূত করতে হবে। আপনি যা-ই করুন না কেন এটি অতি দ্রুত হয়ে উঠবে না, তবে এটি যথেষ্ট দ্রুততর হতে পারে।
যদি আপনার প্রশ্নের মধ্যে সময় ব্যবধানগুলি সর্বদা একই থাকে তবে প্রতি MATERIALIIZED VIEW
ভাঁজটি অনেক বেশি এগিয়ে যেতে পারে। যদিও বিভিন্ন সময়ের ব্যবধানের সুযোগ নেই। হতে পারে আপনি প্রতি ঘন্টা বা অন্য কোনও ন্যূনতম সময় ইউনিটের জন্য কমপক্ষে ব্যবহারকারীদের ভাঁজ করতে পারেন এবং এটি যথেষ্ট পরিমাণে পারফরম্যান্স কিনে যথেষ্ট ওভারহেডের ওয়ারেন্ট দিতে পারে।user_id
(project_id, <fixed time intervall>)
নিতপিক:
সম্ভবত, ভবিষ্যদ্বাণীগুলি "time"
সত্যই হওয়া উচিত:
AND "time" >= '2015-01-11 8:00:00'
AND "time" < '2015-02-10 8:00:00';
পাশে: সনাক্তকারী হিসাবে
ব্যবহার করবেন না time
। এটি স্ট্যান্ডার্ড এসকিউএল এর একটি সংরক্ষিত শব্দ এবং পোস্টগ্রিসে একটি প্রাথমিক ধরণ।