2013-05-20 5 views
6

मेरे पास WHERE NOT EXISTS खंड के साथ एक बहुत ही सरल SELECT * क्वेरी है।चयन 100ms लेता है; चयन के रूप में तालिका बनाएं - या - INSERT चुनने में 15 मिनट

SELECT * 
FROM "BMAN_TP3"."TT_SPLDR_55E63A28_59358" SELECT_TABLE 
WHERE NOT EXISTS (SELECT * FROM "BMAN_TP3"."USER_DEF_ATTRIBUTES" EXISTS_TABLE 
        WHERE "SELECT_TABLE"."UDA_NAME" = "EXISTS_TABLE"."UDA_NAME") 

यह प्रश्न निष्पादित करने और < 2000 रिकॉर्ड निष्पादित करने के लिए 100 एमएस के बारे में यह प्रश्न।

इस क्वेरी एक CREATE TABLE AS में या एक INSERT INTO में नीडिंत है यदि यह 15 मिनट में चलता है।

CREATE TABLE BMAN_TP3.TT_UDA_TEST TABLESPACE BMAN_TP3_U AS (
    SELECT * 
    FROM "BMAN_TP3"."TT_SPLDR_55E63A28_59358" SELECT_TABLE 
    WHERE NOT EXISTS (SELECT * FROM "BMAN_TP3"."USER_DEF_ATTRIBUTES" EXISTS_TABLE 
        WHERE "SELECT_TABLE"."UDA_NAME" = "EXISTS_TABLE"."UDA_NAME") 
) 

मैं दोनों USER_DEF_ATTRIBUTES (वैकल्पिक कुंजी) के क्षेत्र एक UNIQUE INDEXUDA_NAME पर और TT_SPLDR_55E63A28_59358 टेबल है।

यदि मैं WHERE NOT EXISTS को हटा देता हूं तो इसमें आधे सेकेंड लगते हैं।


संपादित करें:

अगर मैं

LEFT OUTER JOIN "BMAN_TP3"."USER_DEF_ATTRIBUTES" 
ON "SELECT_TABLE"."UDA_NAME" = "USER_DEF_ATTRIBUTES"."UDA_NAME" 
WHERE "USER_DEF_ATTRIBUTES"."UDA_NAME" IS NULL 
WHERE NOT EXISTS के बजाय

का उपयोग यह आधे सेकंड में चलता है।

मैं समझा नहीं सकता कि WHERE NOT EXISTS इतनी धीमी क्यों है! टेबल बनाने के लिए साथ जहां मौजूद नहीं


व्याख्या: (15 मिनट) वाम बाहरी के साथ के रूप में टेबल बनाएं लिए

enter image description here

व्याख्या में शामिल हों: (500 एमएस)

enter image description here


केवल के साथ कहां मौजूद नहीं है का चयन के लिए समझाएं: (100ms)

enter image description here

केवल वाम बाहरी के साथ चयन के लिए व्याख्या में शामिल हों: (100ms)

enter image description here

यह ऐसा लगता है कि इसे चुनने पर एक ही ऑपरेशन होता है, लेकिन तालिका बनाते समय यहके लिए अलग-अलग संचालन करता हैऔर LEFT OUTER JOIN

+0

['EXPLAIN'] (http://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm) क्या कहता है? –

+0

@ बुरहानखिद – Teejay

+1

से ऊपर मेरी पोस्ट देखें कृपया बाएं बाहरी जॉइन मामले के लिए व्याख्या योजना जोड़ें। धन्यवाद। –

उत्तर

1

ठीक है, मैंने पाया।

यह तालिका USER_DEF_ATTRIBUTES तालिका के लिए UDA_NAME पर वैकल्पिक कुंजी है।

यदि मैं इसे अक्षम करता हूं और मैं उसी क्षेत्र पर UNIQUE INDEX बनाता हूं, तो यह 500 मिलियन में चलता है।

वैसे भी, मुझे इस व्यवहार के कारण के बारे में निश्चित नहीं है।

संबंधित मुद्दे