मेरे पास 50K पंक्तियों वाली एक तालिका है। यह वास्तव में एक PostGIS टेबल है।
क्वेरी के 4 भाग हैं (1 अनिवार्य) (3 वैकल्पिक)
- चौराहा बॉक्स (एक भूगोल आयत) जिसमें 4 लाट, लंबे (मैं st_intersects का उपयोग करता हूं) [अनिवार्य]
- दिनांक सीमा (न्यूनतम, अधिकतम) दिनांक फ़ील्ड पर
- फ़ाइल प्रकार (अप करने के लिए 8 पाठ मानों का एक सेट) वर्तमान में IN (.....) का उपयोग कर रहा है, लेकिन मैं जरूरत पड़ने पर एक अस्थायी तालिका बना सकता हूं। मुझे लगता है कि बहुत सारे लोग IN को पसंद नहीं करते हैं।
- देश (एक पाठ मान)।
मैं लगभग 100 - 4,000 लौटी पंक्तियों की उम्मीद करता हूं
यदि मैं टेबल पर एक कंपाउंड इंडेक्स बनाता हूं, तो मुझे किस कॉलम का उपयोग करना चाहिए। ठीक अनाज शायद स्थान (डेटा दुनिया भर में फैला हुआ है)। वर्तमान में मेरे पास इसे GIST इंडेक्स के रूप में है।
अन्य सूचकांक बीटीआरईई होंगे।
मेरा अंतर्ज्ञान कहता है कि ठीक दाने का उपयोग करें, और निश्चित रूप से अंतिम। उदाहरण के लिए केवल 12 फ़ाइल प्रकार हैं, इसलिए यह सूचकांक के लिए बहुत बड़ी बाल्टी होगी।
PostgreSQL और PostGIS गुरु (जो सिस्टम के आंतरिक भाग को जानते हैं) क्या कहते हैं?
अपडेट करें:
मुझे इस प्रश्न को तेज करें।
- मैं नहीं चाहता कि किसी को वह काम करना चाहिए जो मुझे करना चाहिए। मैं आपके समय का बहुत सम्मान करता हूं। तो मैं बाद में व्याख्या विश्लेषण करने के लिए मिल जाएगा।
- मैं सभी कुछ संकेत और युक्तियां और दिशानिर्देश देख रहा था।
- मैंने इस उत्कृष्ट छोटी पोस्टिंग को पढ़ा: https://devcenter.heroku.com/articles/postgresql-indexes#managing-and-maintain-indexes इंडेक्स के बारे में
- मैं सामान्य रूप से 4 अलग-अलग इंडेक्स (जियो-बॉक्स, देश का नाम, file_type, और दिनांक) बनाता हूं, लेकिन एक समग्र क्वेरी क्या करना चाहते हैं, यह देखना चाहते हैं।
मुझे बताओ कि क्या इनमें से कोई भी धारणा गलत है। (मैं यौगिक अनुक्रमित के विचार के लिए बहुत नया हूं)
- आदेश महत्वपूर्ण है। पहले इंडेक्स के रूप में चुनें जो सबसे नीचे की पंक्तियों को काट देगा (मेरे मामले में स्थान (भूगोल) जो एक साधारण बहुभुज है या बहु-बहुभुज सबसे अच्छा करेगा)।
- कभी-कभी क्वेरीज़ अनुक्रमित छोड़ देंगी। लेकिन अगर मैं कुंजी (# 1, # 2, # 3, # 4) के साथ एक यौगिक क्वेरी बनाता हूं, तो भले ही उपयोगकर्ता कुछ ऐसा बनाता है जो # 1, # 3 के लिए पूछता है, योजनाकार अभी भी एकल मिश्रित क्वेरी का उपयोग करेंगे, क्योंकि वे आदेश देते हैं कायम रखा है।
- आम तौर पर मैं तीन बीटीआरई प्रश्न बनाऊंगा, और एक जीआईएसटी (भूगोल प्रकार के लिए)। PostGIS कई इंडेक्स-प्रकारों में से एक कंपाउंड बनाने का समर्थन नहीं करता है। इसलिए मुझे GIST को कंपाउंड इंडेक्स का उपयोग करना होगा। लेकिन इससे चीजों को नुकसान नहीं पहुंचना चाहिए।
- अगर मैं कुछ अतिरिक्त कंपाउंड या सिंगल वैल्यू इंडेक्स बनाता हूं, तो प्लानर सबसे बुद्धिमान होने के लिए पर्याप्त स्मार्ट है .....
- देश के नाम में लगभग 250 विभिन्न मूल्य हो सकते हैं, और यह स्पष्ट रूप से स्थान (जियोबॉक्स) से दृढ़ता से जुड़ा हुआ है, लेकिन यदि पंक्ति आकार को काटने के लिए अगला सबसे अच्छा सूचकांक file_type है, तो मुझे अगले का उपयोग करना चाहिए। मुझे उम्मीद नहीं है कि उपयोगकर्ता अक्सर अपने क्वेरी सेट में देश या दिनांक का उपयोग करते हैं।
- मुझे 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'))
EXPLAIN ANALYZE
क्वेरी के लिए दिखाएँ ।