আমি পোস্টগ্রিজ 9.4 ব্যবহার করছি।
messages
নিম্নলিখিত রূপরেখা রয়েছে: বার্তা feed_id জন্যে, এবং posted_at হয়েছে, এছাড়াও বার্তা একটি পিতা বা মাতা বার্তা (জবাব দেওয়া ক্ষেত্রে) থাকতে পারে।
Table "public.messages"
Column | Type | Modifiers
------------------------------+-----------------------------+-----------
message_id | character varying(255) | not null
feed_id | integer |
parent_id | character varying(255) |
posted_at | timestamp without time zone |
share_count | integer |
Indexes:
"messages_pkey" PRIMARY KEY, btree (message_id)
"index_messages_on_feed_id_posted_at" btree (feed_id, posted_at DESC NULLS LAST)
আমি নির্দেশিত সমস্ত বার্তা ফিরে দিতে চাই share_count
, তবে প্রত্যেকটির জন্য parent_id
আমি কেবল একটি বার্তা দিতে চাই। অর্থাত্ যদি একাধিক বার্তাগুলির একই থাকে parent_id
তবে কেবলমাত্র সর্বশেষতম একটি ( posted_at
) প্রত্যাবর্তন হবে। এই parent_id
নাল হতে পারে, নাল সহ বার্তাগুলি parent_id
সমস্ত ফিরে আসা উচিত।
আমার ব্যবহৃত ক্যোয়ারীটি হ'ল:
WITH filtered_messages AS (SELECT *
FROM messages
WHERE feed_id IN (7)
AND (posted_at >= '2015-01-01 04:00:00.000000')
AND (posted_at < '2015-04-28 04:00:00.000000'))
SELECT *
FROM (SELECT DISTINCT ON(COALESCE(parent_id, message_id)) parent_id,
message_id,
posted_at,
share_count
FROM filtered_messages
ORDER BY COALESCE(parent_id, message_id), posted_at DESC NULLS LAST
) messages
ORDER BY share_count DESC NULLS LAST, posted_at DESC NULLS LAST;
এসকিউএল ফিডল- এ http://sqlfiddle.com/#!15/588e5/1/0 , এখানে আমি স্কিমা, সঠিক জিজ্ঞাসা এবং প্রত্যাশিত ফলাফলটি সংজ্ঞায়িত করেছি।
বার্তাগুলির টেবিলটি বড় হয়ে গেলে ক্যোয়ারীর কার্য সম্পাদন ধীর হয়। আমি একাধিক বাছাই সূচক যুক্ত করার চেষ্টা করেছি, তবে এটি সূচকটি ব্যবহার করে বলে মনে হচ্ছে না। এখানে ব্যাখ্যাটি দেওয়া হয়েছে: http://explain.depesz.com/s/Sv2
আমি কীভাবে সঠিক সূচক তৈরি করতে পারি?
feed_id
এবং posted_at
এবং আপনি উল্লেখ না metadata
এ সব, যা একটি JSON- টাইপ মনে হচ্ছে? আপনার প্রশ্নটি ধারাবাহিক করতে দয়া করে মেরামত করুন। আপনি সিটিইতে> 500k সারি নির্বাচন করুন ... সারণীতে কত সারি রয়েছে? আপনি সাধারণত সিটিইতে কত শতাংশ সারি নির্বাচন করেন? সারি কত শতাংশ আছে parent_id IS NULL
? পারফরম্যান্স প্রশ্নগুলির জন্য [পোস্টগ্রেকএইচএল-পারফরম্যান্স] ট্যাগের তথ্যটি বিবেচনা করুন ।
parent_id
? (মিনিট / গড় / সর্বোচ্চ)
metadata
। বর্তমানে বার্তাগুলির সারণীতে 10 মিলির ডেটা রয়েছে তবে দ্রুত বাড়ছে। আমি প্রতিটি ফিড_আইডির জন্য পার্টিশন সারণিতে পৃথক করার কথা ভাবছি। যেহেতু আমি কেবল প্রতি ফিড আইডি আনছি। নাল না হয়ে প্যারেন্ট_আইডি নলের শতাংশ প্রায় 60% / 40%। একটি সাধারণ আনার টেবিলের প্রায় 1-2% থাকে। (প্রায় 100 কে বার্তাগুলি) 100K এর জন্য পারফরম্যান্স প্রায় 1s এর কাছাকাছি, তবে একবার 500K + এ এটি বিটম্যাপ সূচক ব্যবহার করে এবং সাধারণত 10s লাগে।
ORDER BY
সাবকোয়ারিটি সম্পূর্ণ অকেজো less তদ্ব্যতীত, লিঙ্কযুক্ত পরিকল্পনা পোস্ট করা ক্যোয়ারির ফলাফল হতে পারে না -metadata
উদাহরণস্বরূপ কোনও উল্লেখ নেই ।