मैं एक बड़े स्तंभ दुकान मेज है कि लगातार अद्यतन हो जाता है. मैं नहीं निगलना अद्यतन में सीधे स्रोत तालिका वजह से पैदा होता है कि, ज्यादातर मामलों में, एक छोटे से अद्यतन की संख्या पैदा करने के लिए एक पूर्ण तालिका सूक्ष्म विभाजन के पुनर्निर्माण. इसके बजाय मैं स्ट्रीम करने के लिए अद्यतन एक अद्यतन तालिका, और, पर क्वेरी समय मैं दोनों गठबंधन. व्यवहार में यह बाहर काम करता है अच्छी तरह से.
तो चीजों को आसान बनाने में, मैं फेंक देंगे इस में एक दृश्य 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'
किसी भी पागल विचार है?