क्या ओरेकल फ़ंक्शन के परिणाम को पुन: उपयोग करने के लिए संभव है जब इसे फ़ंक्शन परिणाम कैश के उपयोग के बिना एक ही क्वेरी (लेनदेन?) में कहा जाता है?ओरेकल प्रदर्शन: एकाधिक समान फ़ंक्शन कॉल निष्पादित करने वाली क्वेरी
जिस एप्लिकेशन के साथ मैं काम कर रहा हूं वह ओरेकल कार्यों पर काफी निर्भर है। कई प्रश्न एक ही सटीक कार्यों को कई बार निष्पादित करते हैं।
एक विशिष्ट उदाहरण होगा:
SELECT my_package.my_function(my_id),
my_package.my_function(my_id)/24,
my_package.function_also_calling_my_function(my_id)
FROM my_table
WHERE my_table.id = my_id;
मैं देखा है कि ओरेकल हमेशा इन कार्यों में से प्रत्येक को निष्पादित करता है, नहीं एहसास है कि एक ही समारोह में एक ही प्रश्न में सिर्फ एक सेकंड पहले बुलाया गया था। यह संभव है कि फ़ंक्शन में कुछ तत्व कैश हो जाएं, जिसके परिणामस्वरूप थोड़ा तेज वापसी हो जाएगी। यह मेरे प्रश्न के लिए प्रासंगिक नहीं है क्योंकि मैं पूरे दूसरे या तीसरे निष्पादन से बचना चाहता हूं।
मान लें कि फ़ंक्शंस काफी संसाधन-उपभोग करने वाले हैं और ये फ़ंक्शंस अधिक फ़ंक्शंस कॉल कर सकते हैं, जो उनके परिणाम को उचित रूप से बड़े और लगातार अपडेट (दस लाख रिकॉर्ड, प्रति घंटा 1000 अपडेट के साथ अपडेट) पर आधारित करते हैं। इस कारण से ओरेकल के फ़ंक्शन परिणाम कैश का उपयोग करना संभव नहीं है।
हालांकि डेटा अक्सर बदल रहा है, मुझे उम्मीद है कि इन कार्यों के परिणाम एक ही प्रश्न से बुलाए जाने पर ही वही होंगे।
क्या ओरेकल के लिए इन कार्यों के परिणाम का पुन: उपयोग करना संभव है और कैसे? मैं Oracle11g और Oracle12c का उपयोग कर रहा हूँ।
-- Takes 200 ms
SELECT test_package.testSpeed('STANDARD', 'REGEXP_COUNT')
FROM dual;
-- Takes 400ms
SELECT test_package.testSpeed('STANDARD', 'REGEXP_COUNT')
, test_package.testSpeed('STANDARD', 'REGEXP_COUNT')
FROM dual;
प्रयुक्त कार्य::
CREATE OR REPLACE PACKAGE test_package IS
FUNCTION testSpeed (p_package_name VARCHAR2, p_object_name VARCHAR2)
RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY test_package IS
FUNCTION testSpeed (p_package_name VARCHAR2, p_object_name VARCHAR2)
RETURN NUMBER
IS
ln_total NUMBER;
BEGIN
SELECT SUM(position) INTO ln_total
FROM all_arguments
WHERE package_name = 'STANDARD'
AND object_name = 'REGEXP_COUNT';
RETURN ln_total;
END testSpeed;
END;
/
तुम अब भी तालिका परिवर्तनों को संभाल परिणाम कैशिंग और "relies_on" कीवर्ड का उपयोग कर सकते हैं - http://www.oracle.com/technetwork/issue-archive/2010/10-sep/o57plsql-088600.html एक बार क्लॉज का उपयोग कर फ़ंक्शन को कॉल क्यों न करें, फिर संदर्भ में आपकी क्वेरी का संदर्भ लें? – OldProgrammer
12 सी में आप एसक्यूएल स्टेटमेंट के अंदर फ़ंक्शन घोषित कर सकते हैं जो कि पीएल/एसक्यूएल (लेनदेन संबंधी परिप्रेक्ष्य से) से बहुत अलग है – ibre5041
एक खंड का उपयोग करने से यह मदद नहीं करता है क्योंकि यह दुर्भाग्य से दो बार फ़ंक्शन निष्पादित करता है। मैं नहीं देखता कि RELIES_ON कीवर्ड कुछ भी कैसे बदलता है, 11 जीआर 2 निर्भरताओं में स्वचालित रूप से पहचाना जाता है और तालिका को डेटा को कई बार बदलता है, कैश को अमान्य कर देता है। मैं विशेष रूप से एक ही प्रश्न के भीतर कैशिंग के लिए देख रहा हूँ। समारोह खंड के साथ 12 सी दिलचस्प है और मैं इसे यहां और वहां लागू करने में सक्षम हो सकता हूं, यह बड़ी समस्या का समाधान नहीं करता है, हालांकि जब नेस्टेड फ़ंक्शंस वाले फ़ंक्शन वास्तव में जटिल होते हैं और मैं जिस अनुप्रयोग ढांचे में काम कर रहा हूं उसका लाभ उठाता हूं। – jmuntingh