मैं फ़ायरबर्ड क्वेरी में दो संग्रहीत प्रक्रियाओं में शामिल होने की कोशिश कर रहा हूं। मेरे उदाहरण डेटा में पहला 70 रिकॉर्ड देता है, दूसरा सिर्फ 1 रिकॉर्ड।

select
    --...
from MYSP1('ABC', 123) s1
    left join MYSP2('DEF', 456) s2
         on s1.FIELDA = s2.FIELDA
        and s1.FIELDB = s2.FIELDB

समस्या प्रदर्शन है: इसमें 10 सेकंड लगते हैं, जबकि प्रत्येक प्रक्रिया में 1 सेकंड से भी कम समय लगता है। मुझे संदेह है कि प्रक्रियाओं को केवल एक बार की बजाय कई बार चलाया जाता है। उन्हें केवल एक बार निष्पादित करना समझ में आता है, क्योंकि मैं उन्हें निश्चित पैरामीटर पास करता हूं।

क्या फ़ायरबर्ड को प्रत्येक प्रक्रिया को केवल एक बार निष्पादित करने और फिर उनके परिणामों में शामिल होने के लिए बाध्य करने का कोई तरीका है?

4
bluish 3 अक्टूबर 2017, 12:36

2 जवाब

सबसे बढ़िया उत्तर

चूंकि ऐसा लगता है कि कोई रास्ता नहीं है, इसलिए मैंने इस क्वेरी को एक नई संग्रहीत प्रक्रिया के अंदर चलाकर हल किया, जहां मैं MYSP2 से सभी परिणामों को वैश्विक अस्थायी तालिका में कैश करता हूं और MYSP1 और अस्थायी के बीच जुड़ता हूं टेबल।

यह अस्थायी तालिका परिभाषा है:

create global temporary table MY_TEMP_TABLE
(
    FIELDA varchar(3) not null,
    FIELDB smallint not null,
    FIELDC varchar(10) not null
 );

यह संग्रहीत प्रक्रिया निकाय है:

--cache MYSP2 results
delete from MY_TEMP_TABLE;
insert into MY_TEMP_TABLE
    select *
    from MYSP2('DEF', 456)
    ;

--join data
for
select
    --...
from MYSP1('ABC', 123) s1
    left join MY_TEMP_TABLE s2
         on s1.FIELDA = s2.FIELDA
        and s1.FIELDB = s2.FIELDB
into
    --...
do
    suspend;

लेकिन अगर अस्थायी तालिकाओं के बिना कोई अन्य समाधान है तो यह बहुत अच्छा होगा!

2
bluish 3 अक्टूबर 2017, 16:16

शायद यह मदद कर सकता है:

with MYSP2W as (MYSP2('DEF', 456))
select
    --...
from MYSP1('ABC', 123) s1
    left join MYSP2W s2
    on s1.FIELDA = s2.FIELDA
    and s1.FIELDB = s2.FIELDB
0
Daniel Vidić 3 अक्टूबर 2017, 22:31