2011-09-23 15 views
10

Pg's Window function say के लिये दस्तावेज:पोस्टग्रेर्स एक विंडो फंक्शन (कुल) के साथ एक दृश्य में एक WHERE खंड को धक्का देगा?

पंक्तियों एक खिड़की समारोह द्वारा विचार "आभासी तालिका" द्वारा उत्पादित के हैं क्वेरी के FROM खंड यदि कोई हो के रूप में अपनी कहां, ग्रुप द्वारा, और होने खंड द्वारा फ़िल्टर। उदाहरण के लिए, एक पंक्ति हटा दी गई है क्योंकि यह किसी भी विंडो फ़ंक्शन द्वारा WHERE स्थिति को नहीं देखती है। एक क्वेरी में कई विंडो फ़ंक्शंस हो सकते हैं जो अलग-अलग तरीकों से अलग-अलग तरीकों से डेटा को टुकड़ा करते हैं, लेकिन वे सभी इस आभासी तालिका द्वारा परिभाषित पंक्तियों के समान संग्रह पर कार्य करते हैं।

हालांकि, मैं इसे नहीं देख रहा हूं। ऐसा लगता है कि चयन फ़िल्टर बाएं मार्जिन के बहुत पास है और शीर्ष (आखिरी चीज)।

=# EXPLAIN SELECT * FROM chrome_nvd.view_options where fkey_style = 303451; 
                 QUERY PLAN              
---------------------------------------------------------------------------------------------------------------------- 
Subquery Scan view_options (cost=2098450.26..2142926.28 rows=14825 width=180) 
    Filter: (view_options.fkey_style = 303451) 
    -> Sort (cost=2098450.26..2105862.93 rows=2965068 width=189) 
     Sort Key: o.sequence 
     -> WindowAgg (cost=1446776.02..1506077.38 rows=2965068 width=189) 
       -> Sort (cost=1446776.02..1454188.69 rows=2965068 width=189) 
        Sort Key: h.name, k.name 
        -> WindowAgg (cost=802514.45..854403.14 rows=2965068 width=189) 
          -> Sort (cost=802514.45..809927.12 rows=2965068 width=189) 
           Sort Key: h.name 
           -> Hash Join (cost=18.52..210141.57 rows=2965068 width=189) 
             Hash Cond: (o.fkey_opt_header = h.id) 
             -> Hash Join (cost=3.72..169357.09 rows=2965068 width=166) 
              Hash Cond: (o.fkey_opt_kind = k.id) 
              -> Seq Scan on options o (cost=0.00..128583.68 rows=2965068 width=156) 
              -> Hash (cost=2.21..2.21 rows=121 width=18) 
                -> Seq Scan on opt_kind k (cost=0.00..2.21 rows=121 width=18) 
             -> Hash (cost=8.80..8.80 rows=480 width=31) 
              -> Seq Scan on opt_header h (cost=0.00..8.80 rows=480 width=31) 
(19 rows) 

इन दो WindowAgg के अनिवार्य रूप से कुछ करने के लिए योजना है कि बहुत तेजी से

                 QUERY PLAN                  
-------------------------------------------------------------------------------------------------------------------------------------------------------- 
Subquery Scan view_options (cost=329.47..330.42 rows=76 width=164) (actual time=20.263..20.403 rows=42 loops=1) 
    -> Sort (cost=329.47..329.66 rows=76 width=189) (actual time=20.258..20.300 rows=42 loops=1) 
     Sort Key: o.sequence 
     Sort Method: quicksort Memory: 35kB 
     -> Hash Join (cost=18.52..327.10 rows=76 width=189) (actual time=19.427..19.961 rows=42 loops=1) 
       Hash Cond: (o.fkey_opt_header = h.id) 
       -> Hash Join (cost=3.72..311.25 rows=76 width=166) (actual time=17.679..18.085 rows=42 loops=1) 
        Hash Cond: (o.fkey_opt_kind = k.id) 
        -> Index Scan using options_pkey on options o (cost=0.00..306.48 rows=76 width=156) (actual time=17.152..17.410 rows=42 loops=1) 
          Index Cond: (fkey_style = 303451) 
        -> Hash (cost=2.21..2.21 rows=121 width=18) (actual time=0.432..0.432 rows=121 loops=1) 
          -> Seq Scan on opt_kind k (cost=0.00..2.21 rows=121 width=18) (actual time=0.042..0.196 rows=121 loops=1) 
       -> Hash (cost=8.80..8.80 rows=480 width=31) (actual time=1.687..1.687 rows=480 loops=1) 
        -> Seq Scan on opt_header h (cost=0.00..8.80 rows=480 width=31) (actual time=0.030..0.748 rows=480 loops=1) 
Total runtime: 20.893 ms 
(15 rows) 

क्या चल रहा है से खत्म कभी नहीं रहा है बदलने के लिए, और मैं इसे कैसे ठीक करूं? मैं Postgresql 8.4.8 का उपयोग कर रहा हूँ। यहां बताया गया है वास्तविक दृश्य कर रहा है:

SELECT o.fkey_style, h.name AS header, k.name AS kind 
    , o.code, o.name AS option_name, o.description 
    , count(*) OVER (PARTITION BY h.name) AS header_count 
    , count(*) OVER (PARTITION BY h.name, k.name) AS header_kind_count 
    FROM chrome_nvd.options o 
    JOIN chrome_nvd.opt_header h ON h.id = o.fkey_opt_header 
    JOIN chrome_nvd.opt_kind k ON k.id = o.fkey_opt_kind 
    ORDER BY o.sequence; 
+1

क्षमा को शामिल नहीं करता एक दृश्य पर एक फिल्टर हालत देखने के उत्पादन पर लागू होता है और केवल नीचे धक्का दे दिया जाता है, मैं अपने प्रश्न में एक खिड़की समारोह नहीं दिख रहा। क्या कोई दृश्य शामिल है? कृपया प्रासंगिक तालिका/दृश्य/अनुक्रमणिका परिभाषाएं जोड़ें। – wildplasser

+0

हां, मैंने अब दृश्य सामग्री चिपका दी है। –

+1

वास्तव में यह हो रहा है कि क्या हो रहा है। पोस्टग्रेस विंडो फ़ंक्शन निष्पादित करने से पहले दृश्य के अंदर 'WHERE' खंड का प्रचार नहीं कर रहा है। दिलचस्प। –

उत्तर

3

नहीं, PostgreSQL केवल एक राय यह है कि एक समग्र नहीं है पर एक कहां खंड नीचे आ जाएगी। (विंडो फ़ंक्शंस को समेकित माना जाता है)।

< x> मुझे लगता है कि सिर्फ एक कार्यान्वयन सीमा है

< EvanCarroll> x: मुझे आश्चर्य है कि पुश करने के लिए किया जा करने के लिए होगा क्या जहां इस मामले में नीचे खंड।

< इवान कैरोल> योजनाकार को यह जानना होगा कि विंडोएग खुद को चुनिंदाता नहीं जोड़ता है और इसलिए WHERE को नीचे धक्का देना सुरक्षित है?

< x> EvanCarroll; योजनाकार के साथ बहुत जटिल बहुत काम है, मैं

और,

< अनुमान था एक> EvanCarroll: नहीं। अगर दृश्य समुच्चय

+0

.. जो समझ में आता है, क्योंकि यह परिणाम बदल सकता है। यह 'कहां' और 'हैविंग' के बीच के अंतर की तरह है। –

+0

हाँ, लेकिन इस मामले में यह नहीं होगा।यह मुझे लगता है कि एक खिड़की समारोह की तरह थोड़ा सा खिंचाव है। मैं वैसे भी नहीं सोच सकता कि WHERE को दबाए जाने पर एक गैर-संदर्भित विंडो फ़ंक्शन परिणाम बदल सकता है। –

+0

ऐसा लगता है कि कुछ चालाक अनुकूलन के लिए संभावित है। इस बीच, आपको खुद को WHERE क्लॉज को धक्का देना होगा। यदि आपको सामान्यीकृत फॉर्म की आवश्यकता है, तो आप संग्रहित प्रक्रियाओं का सहारा ले सकते हैं। क्या आपको एक उदाहरण की आवश्यकता होगी? –