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

Oracle - वैकल्पिक मापदंडों के साथ सूचकांक का उपयोग

NVL ट्रिक को काम करना चाहिए और इंडेक्स एक्सेस की अनुमति देनी चाहिए। वास्तव में, NVL आमतौर पर ऐसा करने का सबसे अच्छा तरीका है, और आमतौर पर CASE . से जुड़ी अन्य स्थितियों से बेहतर काम करता है या OR . मैंने NVL . का उपयोग किया है कई बार ट्रिक करते हैं और नीचे दिया गया सरल परीक्षण केस दिखाता है कि यह एक इंडेक्स का उपयोग कर सकता है।

स्कीमा

create table xx_people(id_number number, a number, b number);

insert into xx_people
select level, level, level from dual connect by level <= 100000;

commit;

begin
    dbms_stats.gather_table_stats(user, 'xx_people');
end;
/

create index xx_people_idx1 on xx_people(id_number, -1);

निष्पादन योजना तैयार करें

explain plan for
select *
from xx_people
where id_number = nvl(:p_id_number, id_number);

select * from table(dbms_xplan.display);

निष्पादन योजना

Plan hash value: 3301250992

----------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                 |   100K|  3808K|   106   (1)| 00:00:01 |
|   1 |  VIEW                                  | VW_ORE_67373E14 |   100K|  3808K|   106   (1)| 00:00:01 |
|   2 |   UNION-ALL                            |                 |       |       |            |          |
|*  3 |    FILTER                              |                 |       |       |            |          |
|   4 |     TABLE ACCESS BY INDEX ROWID BATCHED| XX_PEOPLE       |     1 |    15 |     3   (0)| 00:00:01 |
|*  5 |      INDEX RANGE SCAN                  | XX_PEOPLE_IDX1  |     1 |       |     2   (0)| 00:00:01 |
|*  6 |    FILTER                              |                 |       |       |            |          |
|*  7 |     TABLE ACCESS FULL                  | XX_PEOPLE       |   100K|  1464K|   103   (1)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter(:P_ID_NUMBER IS NOT NULL)
   5 - access("ID_NUMBER"=:P_ID_NUMBER)
   6 - filter(:P_ID_NUMBER IS NULL)
   7 - filter("ID_NUMBER" IS NOT NULL)

वह योजना पहली बार में थोड़ी भ्रमित करने वाली है। लेकिन यह दोनों दुनियाओं में सर्वश्रेष्ठ है; फ़िल्टर ऑपरेशन ओरेकल को पूर्ण तालिका स्कैन का उपयोग करने के लिए रन टाइम पर निर्णय लेने की अनुमति देता है जब बाइंड वैरिएबल शून्य होता है (और सभी पंक्तियां वापस आती हैं), और एक इंडेक्स जब बाइंड वैरिएबल शून्य नहीं होता है (और केवल कुछ पंक्तियां वापस आती हैं)।

इसका मतलब यह है कि आपके विशिष्ट मामले में शायद कुछ अजीब हो रहा है। हमारे लिए यह पता लगाने के लिए कि किसी अनुक्रमणिका का उपयोग क्यों नहीं किया जाता है, आपको पूरी तरह से प्रतिलिपि प्रस्तुत करने योग्य परीक्षण केस पोस्ट करने की आवश्यकता हो सकती है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल:एक सीमा से अधिक समूह कैसे करें?

  2. PLSQL में वास्तविक डेटाटाइप

  3. Oracle RAC में इनमेमोरी डुप्लीकेट कन्फ्यूजन

  4. सही उपयोगकर्ता नाम और पासवर्ड देकर, ORA-01017 प्राप्त करें:अमान्य उपयोगकर्ता नाम/पासवर्ड; लॉगऑन अस्वीकृत

  5. Oracle स्ट्रिंग से चर संख्या निकालें