चयनात्मक विधेय Pushdown देखने के लिए

0

सवाल

मैं एक बड़े स्तंभ दुकान मेज है कि लगातार अद्यतन हो जाता है. मैं नहीं निगलना अद्यतन में सीधे स्रोत तालिका वजह से पैदा होता है कि, ज्यादातर मामलों में, एक छोटे से अद्यतन की संख्या पैदा करने के लिए एक पूर्ण तालिका सूक्ष्म विभाजन के पुनर्निर्माण. इसके बजाय मैं स्ट्रीम करने के लिए अद्यतन एक अद्यतन तालिका, और, पर क्वेरी समय मैं दोनों गठबंधन. व्यवहार में यह बाहर काम करता है अच्छी तरह से.

तो चीजों को आसान बनाने में, मैं फेंक देंगे इस में एक दृश्य users_view.

CREATE OR REPLACE VIEW users_view AS (
    SELECT * FROM users
    UNION ALL 
    SELECT * FROM user_changes
    QUALIFY ROW_NUMBER() OVER(
        PARTITION BY id 
        ORDER BY last_updated_at DESC
    ) = 1
)

दोनों users मेज और user_changes मेज है, एक ही योजना के रूप में अच्छी तरह के रूप में कुछ विभाजन विन्यास. इस तरह से मैं उपयोग कर सकते हैं विधेय pushdown देखने पर केवल चयन करने के लिए उपयोगकर्ताओं के भीतर सही विभाजन. चलो कहना है कि यह है account_id.

SELECT * FROM users_view
WHERE account_id = 1234

लेकिन users तालिका काफी की तुलना में थोड़ा बड़ा user_changes तालिका, और मैं की तरह होता पुश करने के लिए और भी अधिक predicates के लिए नीचे users टेबल पर धकेलने के बिना अतिरिक्त predicates के लिए नीचे user_changes तालिका. क्यों? क्योंकि मिलान पर users मेज, जबकि 98% सही है, झूठी सकारात्मक/नकारात्मक. विवरण से user_changes कर रहे हैं की जरूरत करने के लिए रिकॉर्ड सीधे सेट. क्या यह की तरह लग जाएगा के बाहर एक दृश्य यह है:

SELECT * FROM (
    SELECT * FROM users
    WHERE account_id = 1234 AND city = 'Chicago'
    UNION ALL 
    SELECT * FROM user_changes
    WHERE account_id = 1234
    QUALIFY ROW_NUMBER() OVER(
        PARTITION BY id 
        ORDER BY last_updated_at DESC
    ) = 1
)
WHERE account_id = 1234 AND city = 'Chicago'

के रूप में बुरा के रूप में यह लग रहा है, यह एक बहुत अधिक performant. सभी स्थितियों में लागू किया जा सकता करने के लिए बहुत बड़ा users तालिका, लेकिन केवल अपरिवर्तनीय स्थिति में लागू किया जा सकता करने के लिए users_changes तालिका. यानी एक उपयोगकर्ता बदल सकता है शहरों, लेकिन एक उपयोगकर्ता परिवर्तन नहीं कर सकते हैं खातों. दूसरी चलाने के लिए सभी की स्थिति के बाद संघ को पकड़ने के लिए किसी भी परिवर्तन के user_changes शुरू की.

इस बोझिल है लिखने के लिए, और भी अधिक ताकि के रूप में क्वेरी जटिल हो जाता है और क्वेरी बिल्डरों में शामिल हो. तो मैं देख रहा हूँ के लिए तरह तरह से समझाने के लिए sql योजनाकार को छोड़ करने के लिए विधेय pushdown के कुछ predicates पर user_changes मेज की जरूरत के बिना प्रारूप करने के लिए क्वेरी इस तरह. आदर्श रूप में, एक दृश्य के साथ.

छद्म SQL. छद्म SQL. छद्म SQL

मेरी wildest सपनों में मैं बता सकता है क्वेरी योजनाकार यह कहाँ का उपयोग कर सकते हैं विभाजन predicates, और यह कहाँ का उपयोग कर सकते हैं गैर-विभाजन predicates.

CREATE OR REPLACE VIEW users_view AS (
    SELECT * FROM (
        SELECT * FROM users
        %PARTITION_PREDICATES%
        %NON_PARTITION_PREDICATES%

        UNION ALL 

        SELECT * FROM user_changes
        %PARTITION_PREDICATES%

        QUALIFY ROW_NUMBER() OVER(
            PARTITION BY id 
            ORDER BY last_updated_at DESC
        ) = 1
    )
    %PARTITION_PREDICATES%
    %NON_PARTITION_PREDICATES%
)

SELECT * FROM users_view
WHERE account_id = 1234 AND city = 'Chicago'

किसी भी पागल विचार है?

1

सबसे अच्छा जवाब

1

आप जोड़ सकते हैं अतिरिक्त स्तंभ src का निर्धारण करने के लिए स्रोत तालिका और चादर predicates मामले में:

select * from
(
SELECT u.*, 'users' as src FROM users u
union all
SELECT uc.*, 'users_changes' as src FROM users_changes uc
) 
WHERE --applied only to users
      case when src  = 'users' 
                 then city = 'Chicago' --predicate wrapped in case
           else true
       end
  --applied to all
  AND account=12345 
2021-11-23 14:58:40

बहुत अच्छा विचार है! धन्यवाद!
micah

@मीका आप लपेट कर सकते हैं सभी predicates में भी मामले का उपयोग कर और या या: then city = 'Chicago' AND one_more_condition AND some_other_condition
leftjoin

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में