Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle को OR-कनेक्टेड विधेय को UNION ALL ऑपरेशंस में बदलने दें

मेरा मानना ​​है कि इसका आपके द्वारा OR . में उपयोग किए जाने वाले कॉलम पर मौजूद इंडेक्स से कुछ लेना-देना हो सकता है विधेय।

मैंने 11gR2 में निम्न का उपयोग करके परीक्षण किया।

create table scott.test as 
select level l, 
       decode(mod(level,2), 1, 1, 2) x, 
       decode(mod(level,2), 1, 2, 1) y, 
       dbms_random.value(1, 3) z from dual 
connect by level < 1000;
/

begin
   dbms_stats.gather_table_stats('scott', 'test');
end;
/

फिर मैंने TOAD में निम्नलिखित प्रश्नों की व्याख्या की, (EXPLAIN PLAN FOR )

select x, y, z from scott.test
    where (floor(z) = 1 and x = 1) or (floor(z) = 2 and y = 1)
    ;

SELECT STATEMENT Optimizer Mode=ALL_ROWS        10          4                                
  TABLE ACCESS FULL COS_DM.TEST 10      280     4   

select /*+ USE_CONCAT */ x, y, z from scott.test
where (floor(z) = 1 and x = 1) or (floor(z) = 2 and y = 1)
;

SELECT STATEMENT Optimizer Mode=ALL_ROWS        10          4                                
  TABLE ACCESS FULL COS_DM.TEST 10      280     4                                


select x, y, z from test where (floor(z) = 1 and x = 1)
union all
select x, y, z from test where (floor(z) = 2 and y = 1)
;

SELECT STATEMENT Optimizer Mode=ALL_ROWS        10          8                                
  UNION-ALL                                              
    TABLE ACCESS FULL   COS_DM.TEST 5   140     4                                
    TABLE ACCESS FULL   COS_DM.TEST 5   140     4                                

तो ऐसा प्रतीत होता है कि संकेत काम नहीं कर रहा है। फिर मैंने x और y कॉलम में एक इंडेक्स जोड़ा:

create index test_x on test (x, y);

begin
   dbms_stats.gather_table_stats('scott', 'test');
end;
/

अब प्रश्नों को फिर से चलाना:

select x, y, z from scott.test
    where (floor(z) = 1 and x = 1) or (floor(z) = 2 and y = 1)
    ;

SELECT STATEMENT Optimizer Mode=ALL_ROWS        10          4                                
  TABLE ACCESS FULL COS_DM.TEST 10      280     4   

select /*+ USE_CONCAT */ x, y, z from scott.test
where (floor(z) = 1 and x = 1) or (floor(z) = 2 and y = 1)
;

SELECT STATEMENT Optimizer Mode=ALL_ROWS        10          8                                
  CONCATENATION                                              
    TABLE ACCESS FULL   COS_DM.TEST 5   140     4                                
    TABLE ACCESS FULL   COS_DM.TEST 5   140     4                                

select x, y, z from test where (floor(z) = 1 and x = 1)
union all
select x, y, z from test where (floor(z) = 2 and y = 1)
;

SELECT STATEMENT Optimizer Mode=ALL_ROWS        10          8                                
  UNION-ALL                                              
    TABLE ACCESS FULL   COS_DM.TEST 5   140     4                                
    TABLE ACCESS FULL   COS_DM.TEST 5   140     4                                

ऐसा प्रतीत होता है कि अनुक्रमणिका जोड़ने के बाद (भले ही इसका उपयोग नहीं किया जा रहा हो ) अनुकूलक ने आखिर संकेत का उपयोग करने का निर्णय लिया!

शायद आप इसे आजमा सकते हैं?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. COLLATION () Oracle में फंक्शन

  2. Windows सर्वर पर Oracle 32-बिट क्लाइंट स्थापित करना पहले से ही 64-बिट Oracle डेटाबेस सर्वर चला रहा है

  3. ओरा-30926 त्रुटि

  4. Oracle में एक चर घोषित और प्रदर्शित कैसे करें

  5. अवधि के अनुसार Oracle SQL पंक्ति संयोजन