2012-09-06 12 views
8

ओरेकल 11 जी के अपग्रेड के बाद मुझे ओरेकल क्वेरी को अनुकूलित करने में समस्या हो रही है और यह समस्या मुझे थोड़ा पागल ड्राइव करने शुरू कर रही है।वितरित प्रश्नों पर बाध्य दिख रहा है?

नोट, यह प्रश्न अब पूरी तरह से संपादित किया गया है क्योंकि मेरे पास एक साधारण परीक्षण केस बनाने के बाद अधिक जानकारी है। मूल प्रश्न यहां उपलब्ध है: https://stackoverflow.com/revisions/12304320/1

यह समस्या यह है कि दो टेबलों में शामिल होने पर, जिसमें से एक दिनांक कॉलम पर between स्थिति है, यदि क्वेरी रिमोट टेबल में शामिल हो जाती है, तो बाइंडिंग नहीं होती है।

समस्या का पुनरुत्पादन करने में सहायता के लिए यहां एक परीक्षण केस है। पहले दो स्रोत टेबल सेट अप करें। पहले तिथियों की सूची, महीने के पहले किया जा रहा है तीस साल

create table mike_temp_etl_control 
as 
select 
    add_months(trunc(sysdate, 'MM'), 1-row_count) as reporting_date 
from (
    select level as row_count 
    from dual 
    connect by level < 360 
); 

तो कुछ डेटा dba_objects से प्राप्त वापस जा रहा है:

create table mike_temp_dba_objects as 
select owner, object_name, subobject_name, object_id, created 
from dba_objects 
union all 
select owner, object_name, subobject_name, object_id, created 
from dba_objects; 

तब में डेटा को चलाने के लिए एक खाली टेबल बना प्रति:

create table mike_temp_1 
as 
select 
    a.OWNER, 
    a.OBJECT_NAME, 
    a.SUBOBJECT_NAME, 
    a.OBJECT_ID, 
    a.CREATED, 
    b.REPORTING_DATE 
from 
    mike_temp_dba_objects a 
    join mike_temp_etl_control b on (
     b.reporting_date between add_months(a.created, -24) and a.created) 
    where 1=2; 

फिर कोड चलाएं। क्वेरी को धीमा करने के लिए आपको एक बड़ा संस्करण mike_temp_dba_objects बनाने की आवश्यकता हो सकती है (या निष्पादन योजना प्राप्त करने के लिए किसी अन्य विधि का उपयोग करें)। जबकि क्वेरी चल रही है, मुझे एक अलग सत्र से select * from table(dbms_xplan.display_cursor(sql_id => 'xxxxxxxxxxx')) चलाकर सत्र से निष्पादन योजना मिलती है।

declare 
    pv_report_start_date date := date '2002-01-01'; 
    v_report_end_date date := date '2012-07-01'; 

begin 

    INSERT /*+ APPEND */ 
    INTO mike_temp_5 
    select 
    a.OWNER, 
    a.OBJECT_NAME, 
    a.SUBOBJECT_NAME, 
    a.OBJECT_ID, 
    a.CREATED, 
    b.REPORTING_DATE 
from 
    mike_temp_dba_objects a 
    join mike_temp_etl_control b on (
    b.reporting_date between add_months(a.created, -24) and a.created) 
    cross join [email protected] -- This line causes problems... 
where 
    b.reporting_date between add_months(pv_report_start_date, -12) and v_report_end_date; 

    rollback; 
end; 

क्वेरी में एक दूरस्थ तालिका होने से, mike_temp_etl_control तालिका के लिए प्रमुखता अनुमान पूरी तरह से गलत है और बाँध देखना हो रहा हो प्रतीत नहीं होता है।

ऊपर क्वेरी के लिये कार्य योजना नीचे दिखाया गया है:

------------------------------------------------------------------------------------- 
| Id | Operation    | Name     | Rows | Bytes | Cost (%CPU)| 
------------------------------------------------------------------------------------- 
| 0 | INSERT STATEMENT  |      |  |  | 10682 (100)| 
| 1 | LOAD AS SELECT  |      |  |  |   | 
|* 2 | FILTER    |      |  |  |   | 
| 3 | MERGE JOIN   |      | 152K| 19M| 10682 (3)| 
| 4 |  SORT JOIN   |      | 438K| 51M| 10632 (2)| 
| 5 |  NESTED LOOPS  |      | 438K| 51M| 369 (20)| 
| 6 |  FAST DUAL  |      |  1 |  |  2 (0)| 
|* 7 |  TABLE ACCESS FULL| MIKE_TEMP_DBA_OBJECTS | 438K| 51M| 367 (20)| 
|* 8 |  FILTER    |      |  |  |   | 
|* 9 |  SORT JOIN   |      | 139 | 1251 |  3 (34)| 
|* 10 |  TABLE ACCESS FULL| MIKE_TEMP_ETL_CONTROL | 139 | 1251 |  2 (0)| 
------------------------------------------------------------------------------------- 
:

--------------------------------------------------------------------------------------- 
| Id | Operation    | Name     | Rows | Bytes | Cost (%CPU)| 
--------------------------------------------------------------------------------------- 
| 0 | INSERT STATEMENT   |      |  |  | 373 (100)| 
| 1 | LOAD AS SELECT   |      |  |  |   | 
|* 2 | FILTER     |      |  |  |   | 
| 3 | MERGE JOIN   |      |  5 | 655 | 373 (21)| 
| 4 |  SORT JOIN   |      | 1096 | 130K| 370 (20)| 
| 5 |  MERGE JOIN CARTESIAN|      | 1096 | 130K| 369 (20)| 
| 6 |  REMOTE    | DUAL     |  1 |  |  2 (0)| 
| 7 |  BUFFER SORT  |      | 1096 | 130K| 367 (20)| 
|* 8 |  TABLE ACCESS FULL | MIKE_TEMP_DBA_OBJECTS | 1096 | 130K| 367 (20)| 
|* 9 |  FILTER    |      |  |  |   | 
|* 10 |  SORT JOIN   |      |  2 | 18 |  3 (34)| 
|* 11 |  TABLE ACCESS FULL | MIKE_TEMP_ETL_CONTROL |  2 | 18 |  2 (0)| 
--------------------------------------------------------------------------------------- 

अगर मैं तो स्थानीय संस्करण के साथ दूरदराज के dual की जगह मैं सही प्रमुखता (139 2 के बजाय) मिलता है

तो, मुझे लगता है कि सवाल यह है कि मुझे सही कार्डिनालिटी का आकलन कैसे किया जा सकता है? क्या यह ओरेकल बग है या यह अपेक्षित व्यवहार है?

+0

आसान सामान से छुटकारा पाने के लिए आपने टेबल पर [आंकड़े] (http://docs.oracle.com/cd/E11882_01/server.112/e25494/general002.htm#ADMIN11525) फिर से इकट्ठा किया है? – Ben

+0

हां, आंकड़े सभी ताजा होना चाहिए। हालांकि कल उस पर दोबारा जांच करेंगे। यह डेटा वेयरहाउस ईटीएल लोड का हिस्सा है, जिसमें –

+0

पर सब कुछ इकट्ठा आंकड़े हैं, मुझे पता है कि संस्करणों में एक बग था> 11.1 जिसमें एक कार्य-एक-दौर था जिसमें "_optim_peek_user_binds" पैरामीटर को गलत पर सेट करना शामिल था। यह अनुकूलक को प्रभावित कर सकता है लेकिन मुझे बिल्कुल नहीं पता कि कैसे। आप यह जांच सकते हैं कि यह पैरामीटर सत्य या गलत पर सेट है या नहीं, यह अधिकतम प्रदर्शन के लिए सच होना चाहिए। बग ओआरए -3137 त्रुटियों का कारण बनता है। – Gisli

उत्तर

1

मुझे लगता है कि आपको गतिशील नमूनाकरण के बारे में गड़बड़ करनी चाहिए। यह 11 जी अलग-अलग काम करता है, इसलिए यह आपकी परेशानियों का कारण हो सकता है।

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