मेरे पास ओरेकल में एक भौतिक दृश्य है जिसमें एक बाएं जॉइन शामिल है जो अद्यतन करने में बहुत लंबा समय लगता है। जब मैं अंतर्निहित तालिका को अद्यतन करता हूं तो इसे चलाने के लिए 63914.765 एस लगता है (हाँ यह लगभग 17 घंटे है)।ओरेकल - तेज़ रिफ्रेश बाएं जॉइन अपडेट के साथ मटेरियल विचार बहुत धीमे
मैं एक ही टेबल पर एक बाएं जॉइन का उपयोग कर रहा हूं, क्योंकि मैं डेटा से पंक्तियों तक डेटा को पिट करना चाहता हूं। पिवॉट कमांड इस ओरेकल संस्करण में उपलब्ध नहीं है, और एक ग्रुप BY + CASE का उपयोग तेजी से संदर्भित सामग्री पर देखने की अनुमति नहीं है।
materialized देखें लॉग इस तरह दिखता है:
CREATE MATERIALIZED VIEW Mv_Web_Programmes
REFRESH FAST ON COMMIT
AS
SELECT
t1.ProgrammeId,
t1.Title as MainTitle,
t2.Title as SecondaryTitle,
--Primary key
t1.Title_Id as t1_titleId,
t2.Title_Id as t2_titleId,
t1.rowid as t1_rowid,
t2.rowid as t2_rowid
FROM
Programmes_Titles t1,
Programmes_Titles t2
WHERE
t1.Titles_Group_Type = 'mainTitle'
AND t1.Programme_Id = t2.Programme_Id(+) AND t2.Titles_Group_Type(+) = 'secondaryTitle'
अद्यतन बयान:
CREATE MATERIALIZED VIEW LOG ON Programmes_Titles
WITH PRIMARY KEY, rowid
INCLUDING NEW Values;
materialized ही दृश्य इस तरह दिखता है (यह 700000 पंक्तियाँ, Programmes_Titles तालिका 900000 पंक्तियाँ शामिल होता है) मैं इसका उपयोग करता हूं:
UPDATE Programmes_Titles
SET Title = 'New title'
WHERE rowid = 'AAAL4cAAEAAAftTABB'
यह अद्यतन विवरण टा केएस 17 घंटे। एक इनर जॉइन का उपयोग करते समय ((+) को हटाएं) यह मिलीसेकंड लेता है।
मैंने एमवी_वेब_Programmes मटेरियलाइज्ड व्यू पर INDEXES जोड़ने का भी प्रयास किया, लेकिन ऐसा लगता है कि यह भी मदद नहीं करता था। (यह अभी भी एक मिनट से अधिक समय तक चलता है, जो धीमा करने का तरीका है, मैं हर बदलाव के 17 घंटे बाद इंतजार नहीं कर रहा हूं, इसलिए यह अद्यतन में सुधार हो सकता है)
तो मेरा सवाल है: इतने लंबे समय क्यों लेते हैं अंतर्निहित तालिका अद्यतन करने के लिए? मैं इसे कैसे सुधार सकता हूं?
धन्यवाद, सुझाया गया समाधान सही काम करता है। बस एक अतिरिक्त सवाल है। मेरे उदाहरण क्वेरी में मैं केवल जॉइन में एक मानदंड का उपयोग करता हूं, लेकिन मेरी असली क्वेरी दो का उपयोग करती है। क्या मैं अभी भी DECODE फ़ंक्शन का उपयोग कर सकता हूं (यह मेरे लिए एक नया है या मुझे इसके बजाय CASE का उपयोग करना चाहिए?) – Tejo
क्षमा करें, मैं थोड़ा तेज़ था। Programme_Titles तालिका को दूसरे मान के साथ नए मान के साथ अपडेट किया जाता है, लेकिन Mv_Web_Programmes अपडेट नहीं होता है, पुराना मान अभी भी वहां है। कोई विचार? – Tejo
आपको DECODE के बजाय CASE का उपयोग करने में सक्षम होना चाहिए जब तक कि आप अपने केस स्टेटमेंट में उपयोग किए जाने वाले प्रत्येक कॉलम को एमवी लॉग में भी न करें। –