PostgreSQL (और क्वेरी क्रम) में एक यौगिक सूचकांक में स्तंभों का क्रम


10

मेरे पास 50K पंक्तियों वाली एक तालिका है। यह वास्तव में एक PostGIS टेबल है।

क्वेरी के 4 भाग हैं (1 अनिवार्य) (3 वैकल्पिक)

  1. चौराहा बॉक्स (एक भूगोल आयत) जिसमें 4 लाट, लंबे (मैं st_intersects का उपयोग करता हूं) [अनिवार्य]
  2. दिनांक सीमा (न्यूनतम, अधिकतम) दिनांक फ़ील्ड पर
  3. फ़ाइल प्रकार (अप करने के लिए 8 पाठ मानों का एक सेट) वर्तमान में IN (.....) का उपयोग कर रहा है, लेकिन मैं जरूरत पड़ने पर एक अस्थायी तालिका बना सकता हूं। मुझे लगता है कि बहुत सारे लोग IN को पसंद नहीं करते हैं।
  4. देश (एक पाठ मान)।

मैं लगभग 100 - 4,000 लौटी पंक्तियों की उम्मीद करता हूं

यदि मैं टेबल पर एक कंपाउंड इंडेक्स बनाता हूं, तो मुझे किस कॉलम का उपयोग करना चाहिए। ठीक अनाज शायद स्थान (डेटा दुनिया भर में फैला हुआ है)। वर्तमान में मेरे पास इसे GIST इंडेक्स के रूप में है।

अन्य सूचकांक बीटीआरईई होंगे।

मेरा अंतर्ज्ञान कहता है कि ठीक दाने का उपयोग करें, और निश्चित रूप से अंतिम। उदाहरण के लिए केवल 12 फ़ाइल प्रकार हैं, इसलिए यह सूचकांक के लिए बहुत बड़ी बाल्टी होगी।

PostgreSQL और PostGIS गुरु (जो सिस्टम के आंतरिक भाग को जानते हैं) क्या कहते हैं?


अपडेट करें:

मुझे इस प्रश्न को तेज करें।

  1. मैं नहीं चाहता कि किसी को वह काम करना चाहिए जो मुझे करना चाहिए। मैं आपके समय का बहुत सम्मान करता हूं। तो मैं बाद में व्याख्या विश्लेषण करने के लिए मिल जाएगा।
  2. मैं सभी कुछ संकेत और युक्तियां और दिशानिर्देश देख रहा था।
  3. मैंने इस उत्कृष्ट छोटी पोस्टिंग को पढ़ा: https://devcenter.heroku.com/articles/postgresql-indexes#managing-and-maintain-indexes इंडेक्स के बारे में
  4. मैं सामान्य रूप से 4 अलग-अलग इंडेक्स (जियो-बॉक्स, देश का नाम, file_type, और दिनांक) बनाता हूं, लेकिन एक समग्र क्वेरी क्या करना चाहते हैं, यह देखना चाहते हैं।

मुझे बताओ कि क्या इनमें से कोई भी धारणा गलत है। (मैं यौगिक अनुक्रमित के विचार के लिए बहुत नया हूं)

  1. आदेश महत्वपूर्ण है। पहले इंडेक्स के रूप में चुनें जो सबसे नीचे की पंक्तियों को काट देगा (मेरे मामले में स्थान (भूगोल) जो एक साधारण बहुभुज है या बहु-बहुभुज सबसे अच्छा करेगा)।
  2. कभी-कभी क्वेरीज़ अनुक्रमित छोड़ देंगी। लेकिन अगर मैं कुंजी (# 1, # 2, # 3, # 4) के साथ एक यौगिक क्वेरी बनाता हूं, तो भले ही उपयोगकर्ता कुछ ऐसा बनाता है जो # 1, # 3 के लिए पूछता है, योजनाकार अभी भी एकल मिश्रित क्वेरी का उपयोग करेंगे, क्योंकि वे आदेश देते हैं कायम रखा है।
  3. आम तौर पर मैं तीन बीटीआरई प्रश्न बनाऊंगा, और एक जीआईएसटी (भूगोल प्रकार के लिए)। PostGIS कई इंडेक्स-प्रकारों में से एक कंपाउंड बनाने का समर्थन नहीं करता है। इसलिए मुझे GIST को कंपाउंड इंडेक्स का उपयोग करना होगा। लेकिन इससे चीजों को नुकसान नहीं पहुंचना चाहिए।
  4. अगर मैं कुछ अतिरिक्त कंपाउंड या सिंगल वैल्यू इंडेक्स बनाता हूं, तो प्लानर सबसे बुद्धिमान होने के लिए पर्याप्त स्मार्ट है .....
  5. देश के नाम में लगभग 250 विभिन्न मूल्य हो सकते हैं, और यह स्पष्ट रूप से स्थान (जियोबॉक्स) से दृढ़ता से जुड़ा हुआ है, लेकिन यदि पंक्ति आकार को काटने के लिए अगला सबसे अच्छा सूचकांक file_type है, तो मुझे अगले का उपयोग करना चाहिए। मुझे उम्मीद नहीं है कि उपयोगकर्ता अक्सर अपने क्वेरी सेट में देश या दिनांक का उपयोग करते हैं।
  6. मुझे 4 कुंजी का एक कंपाउंड इंडेक्स बनाने के बारे में चिंता करने की ज़रूरत नहीं है, जिससे इंडेक्स डेटा का आकार बढ़ जाएगा। यानी अगर एक-कुंजी सूचकांक प्रदर्शन को बढ़ावा देने का 90% होगा, तो इसे बनाने के लिए 3 और आइटम जोड़ने के लिए चोट नहीं लगती है। इसके विपरीत, मुझे वास्तव में दोनों सूचकांक बनाने चाहिए। एक एकल भूगोल सूचकांक, और एक यौगिक सूचकांक भी, और योजनाकार को यह पता लगाने दें कि कौन सबसे अच्छा है, और यह सूचकांक तालिका के आकार को ध्यान में रखेगा।

फिर से, मैं किसी को अपना समाधान डिजाइन करने के लिए नहीं कह रहा हूं, मैं दूसरों के काम का समर्थन नहीं करता हूं। लेकिन मुझे ऐसे सामान की आवश्यकता है जो PostGreSQL प्रलेखन मुझे कार्यान्वयन के बारे में नहीं बताता है

[इसका कारण यह है कि मेरे पास अभी तक दिखाने के लिए एक उत्कृष्ट परिणाम नहीं है, यह है कि मुझे इस 25K पंक्ति तालिका को 24M पंक्ति तालिका से बनाना होगा। जितना मैंने सोचा था उससे अधिक समय लग रहा है। मैं 1,000 आइटम समूहों में चीजों को क्लस्टर कर रहा हूं, और 25K पंक्ति तालिका के खिलाफ उपयोगकर्ता क्वेरी दे रहा हूं। लेकिन मेरा अगला प्रश्न, मास्टर 25M पंक्ति तालिका में जाने और चीजों को बाहर निकालने के लिए उस क्वेरी के परिणामों का उपयोग करना शामिल होगा, और यही वह जगह है जहां यौगिक सूचकांक का प्रदर्शन वास्तव में प्रभावित होगा]।


नीचे नमूना नमूना:


SELECT
    public.product_list_meta_mv.cntry_name       AS country,
    public.product_list_meta_mv.product_producer AS producer,
    public.product_list_meta_mv.product_name     AS prod_name,
    public.product_list_meta_mv.product_type     AS ptype,
    public.product_list_meta_mv.product_size     AS size,
    ST_AsGeoJSON(public.product_list_meta_mv.the_geom, 10, 2)          AS outline
FROM
    public.product_list_meta_mv 
WHERE
    public.product_list_meta_mv.cntry_name = 'Poland' 
AND
    ST_Intersects(public.product_list_meta_mv.the_geom,
    st_geogfromtext('SRID=4326;POLYGON((21.23107910156250 51.41601562500000,
                                        18.64379882812500 51.41601562500000,
                                        18.64379882812500 48.69415283203130,
                                        21.23107910156250 48.69415283203130,
                                        21.23107910156250 51.41601562500000))')) 
AND (date >= '1/2/1900 5:00:00 AM' 
 AND date <= '2/26/2014 10:26:44 PM')
AND (public.product_list_meta_mv.product_type in
    ('CIB10','DTED0','DTED1','DTED2','CIB01','CIB05')) ;

विश्लेषण परिणाम (मैंने किसी भी कंपाउंड इंडेक्स में नहीं डाला था, और जिस गति से मैं देख रहा हूं, मुझे नहीं पता कि मुझे इसकी आवश्यकता है)।

"Bitmap Heap Scan on catalog_full cat  (cost=4.33..37.49 rows=1 width=7428) (actual time=1.147..38.051 rows=35 loops=1)"
"  Recheck Cond: ('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography && outline)"
"  Filter: (((type)::text = ANY ('{CADRG,CIB10,DTED1,DTED2}'::text[])) AND (_st_distance('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography, outline, 0::double precision, false) < 1e-005::double precision))"
"  Rows Removed by Filter: 61"
"  ->  Bitmap Index Scan on catalog_full_outline_idx  (cost=0.00..4.33 rows=8 width=0) (actual time=0.401..0.401 rows=96 loops=1)"
"        Index Cond: ('0103000020E61000000100000005000000000000005838354000000000AEB0494000000000A0A7324000000000AEB0494000000000A0A73240000000006C5D48400000000058383540000000006C5D4840000000005838354000000000AEB04940'::geography && outline)"
"Total runtime: 38.109 ms"

EXPLAIN ANALYZE SELECT pid,product_name,type,country,date,size,cocom,description,egpl_date,ST_AsGeoJSON(outline, 10, 2) AS outline 
FROM portal.catalog_full AS cat 
WHERE ST_Intersects(st_geogfromtext('SRID=4326;POLYGON((21.2200927734375 51.38031005859375, 18.65478515625 51.38031005859375, 18.65478515625 48.7298583984375, 21.2200927734375 48.7298583984375, 21.2200927734375 51.38031005859375))'), cat.outline) 
AND (cat.type in ('CADRG','CIB10','DTED1','DTED2'))

2
कृपया वास्तविक क्वेरी प्रदान करें।
ypercube y

क्या "3 वैकल्पिक" का मतलब है कि क्वेरी में 8 भिन्न भिन्नताएं हो सकती हैं (यह निर्भर करता है कि 2,3,4 विकल्प सक्रिय हैं या नहीं)?
ypercube y

WHERE के 4 और घटक हैं। St_intersects की आवश्यकता होने पर, अन्य वहां हो सकते हैं, या वे नहीं हो सकते हैं। लेकिन मैं उस मामले से निपटना चाहता हूं जहां वे मौजूद हैं।

2
मैंने प्रश्न को dba.se में माइग्रेट करने के लिए मतदान किया, यह एक जटिल क्वेरी है जिसमें कई रेंज स्थितियां हैं।
ypercube y 17

1
EXPLAIN ANALYZEक्वेरी के लिए दिखाएँ ।
क्रेग रिंगर

जवाबों:


4

अपने काम के एक हिस्से के रूप में मैं एक काफी बड़े PostgreSQL डेटाबेस (डिस्क पर लगभग 120 जीबी, कई बहु-मिलियन-पंक्ति तालिकाओं) को बनाए रखता हूं और प्रश्नों को गति देने के लिए कुछ ट्रिक्स एकत्र किए हैं। अपनी मान्यताओं पर पहले कुछ टिप्पणियाँ:

  1. हां, आदेश महत्वपूर्ण है, लेकिन यह केवल पहला है जो वास्तव में अलग है, बाकी दूसरे वर्ग के सूचकांक हैं।
  2. मुझे यकीन नहीं है कि यह हमेशा दोनों का उपयोग करेगा, मेरा अनुमान है कि क्वेरी प्लानर # 1 का उपयोग करेगा, फिर बाकी के साथ कुछ चतुर करें।
  3. मुझे GIST का कोई अनुभव नहीं है।
  4. हां, सभी इंडेक्स पहले जोड़ें, देखें कि सबसे अधिक क्या उपयोग किया जाता है और सबसे अच्छा प्रदर्शन क्या देता है।
  5. मैं पूरी कोशिश करूंगा कि आप दोनों कोशिश करें और मापें कि सबसे अच्छा क्या है। अलग-अलग उपश्रेणियों के साथ एसक्यूएल को फिर से लिखने का प्रयास करें, शायद देश और समय एक में, फिर इंटरसेक्ट-क्वेरी के साथ जुड़ें। मैंने IN-clauses के साथ किसी भी प्रदर्शन समस्या पर ध्यान नहीं दिया है, जब तक कि IN-list हजारों तत्वों की लंबी नहीं है। मेरा अनुमान है कि उपलब्ध इनपुट मानदंडों के आधार पर विशेष रूप से ट्यून किए गए कुछ अलग-अलग प्रश्न सर्वोत्तम परिणाम देंगे।
  6. मैं 4-वे इंडेक्स बनाने के खिलाफ सुझाव दूंगा। एक बनाने की कोशिश करें और फिर आकार की जांच करें, वे वास्तव में विशाल हो सकते हैं। मेरे अनुभव में, चार 1-कुंजी इंडेक्स एक एकल 4-वे इंडेक्स के रूप में लगभग तेज़ हो गए हैं। एक चाल जो कुछ विशिष्ट प्रश्नों के लिए अच्छी तरह से काम करती है, वह आंशिक अनुक्रमणिका होती है, अर्थात ऐसा कुछ:

    तालिका_x (Key1, key2, key3) पर INDATE CREATE करें, जहां some_x_column = 'XXXX' हो;

मैंने अपने .psqlrc-file में क्वेरीज़ बनाई हैं, जो प्रश्नों को जोड़ने या हटाने के लिए अनुक्रमणिका खोजने में मदद करता है। GitHub पर उन पर एक नज़र रखने के लिए स्वतंत्र महसूस करें: .psql

मैं का उपयोग करें: seq_scans और: एक बहुत बड़ा, और फिर तालिका के बारे में विवरण प्राप्त करने के लिए \ d table_name। कुछ परिवर्तन करने के बाद आँकड़े रीसेट करना न भूलें, pg_stat_reset () चुनें;


1
ये बेहतरीन टिप्स हैं। मैंने आपकी सलाह ली, और फिर इसका उपयोग एक बहुत बड़ी मेज पर एक प्रयोग करने के लिए किया जिसे हम बनाए रखते हैं (43 मिलियन पंक्तियाँ)। परिणाम इस प्रकार हैं: dba.stackexchange.com/questions/61084/…
Dr.YSG

1

मुझे लगता है कि इस चीज में मदद करने की सबसे अधिक संभावना है (अगर कुछ भी) gist सूचकांक में 2 कॉलम के रूप में product_type जोड़ना होगा। लेकिन बिना यह जाने कि आपके विशिष्ट / समस्याग्रस्त प्रश्नों के लिए प्रत्येक (और अलगाव में) कितनी पंक्तियाँ मेल खाती हैं, हम केवल अनुमान लगा सकते हैं।

जब मैं यह दृष्टिकोण करता हूं, तो सबसे पहले मैं क्वेरी को सरलीकृत रूप में चलाता हूं, जहां केवल एक शर्त होती है, प्रत्येक को बदले में लिया जाता है, उदाहरण के लिए। दोनों अनुमानित पंक्तियों और प्रत्येक के लिए वास्तविक पंक्तियों को देखें।


मेरे अपडेट को ऊपर देखें, लेकिन मुझे लगता है कि आप मुझे एक अच्छा नेतृत्व दे रहे हैं, उन इंडेक्सों को ऑर्डर करने के बारे में सोचें जिनके द्वारा पंक्ति आउटपुट को सबसे तेजी से कम किया जाता है। क्या वह सही है?
डॉ.वाईएसजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.