मैं postgres 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 , SQL Fiddle में, मैंने स्कीमा, सटीक क्वेरी और अपेक्षित परिणाम को परिभाषित किया है।
संदेश तालिका बड़ी हो जाने पर क्वेरी का प्रदर्शन धीमा हो जाता है। मैंने कई सॉर्टिंग इंडेक्स जोड़ने की कोशिश की, लेकिन यह इंडेक्स का उपयोग नहीं करता है। यहाँ व्याख्या है: http://explain.depesz.com/s/Sv2
मैं एक सही सूचकांक कैसे बना सकता हूं?
feed_idऔर posted_atऔर आप का उल्लेख नहीं था metadataसब पर है, जो एक JSON प्रकार हो रहा है? कृपया इसे सुसंगत बनाने के लिए अपने प्रश्न की मरम्मत करें। आप सीटीई में 500k पंक्तियों का चयन करें ... तालिका में कितनी पंक्तियाँ हैं? आप आमतौर पर सीटीई में कितनी प्रतिशत पंक्तियों का चयन करते हैं? पंक्तियों का प्रतिशत कितना है parent_id IS NULL? प्रदर्शन के प्रश्नों के लिए [postgresql-performance] टैग में जानकारी पर विचार करें ।
parent_id? (मिनट /
metadata। वर्तमान में संदेश तालिका में 10 सैन्य डेटा हैं, लेकिन तेजी से बढ़ रहा है। मुझे लगता है कि प्रत्येक feed_id के लिए विभाजन तालिकाओं में अलग होना चाहिए। चूंकि मैं केवल फ़ीड आईडी प्रति प्राप्त कर रहा हूं। पेरेंट_ड नल बनाम शून्य नहीं का प्रतिशत लगभग 60% / 40% है। एक सामान्य प्रकार की मेज लगभग 1-2% है। (लगभग 100K संदेश) 100K के लिए प्रदर्शन 1s के आसपास है, लेकिन एक बार 500K + करने के लिए यह बिटमैप सूचकांक और सामान्य रूप से 10s का उपयोग करता है।
ORDER BYमें, उपनगर में पूरी तरह से बेकार है। इसके अलावा, लिंक की गई योजना पोस्ट किए गए क्वेरी का परिणाम नहीं हो सकती है -metadataउदाहरण के लिए, इसका कोई उल्लेख नहीं है ।