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

ROWNUM=1 किन परिस्थितियों में किसी मौजूदा syle क्वेरी में प्रदर्शन में उल्लेखनीय वृद्धि करता है

यह उन प्रश्नों पर प्रदर्शन में उल्लेखनीय रूप से सुधार करता है (प्रतिशत औसत का दसियों) जिन्हें साधारण सिंगल इंडेक्स लुकअप द्वारा हल नहीं किया जा सकता है उदा। तालिका जुड़ती है। हालाँकि इसमें डेटा/एप्लिकेशन त्रुटि को छिपाने की क्षमता है।

आइए एक टेबल लें:

create table t (id number(10,0), padding varchar2(1000));  

- उदाहरण को यथासंभव सरल बनाने के लिए जानबूझकर PK का उपयोग न करें। प्रत्येक रिकॉर्ड में वास्तविक डेटा लोड को अनुकरण करने के लिए पैडिंग का उपयोग किया जाता है

कई रिकॉर्ड के साथ:

insert into t (id, padding)
select rownum, rpad(' ', 1000) from dual connect by level < 10000

अब अगर आप कुछ ऐसा पूछते हैं

select 1 into ll_exists
from t where id = 5;

डीबी को पूरी तालिका के माध्यम से जाना चाहिए कि क्या उसे पहले डेटा ब्लॉक में एकमात्र मिलान रिकॉर्ड मिला है (जिस तरह से हम नहीं जान सकते क्योंकि इसे कई अलग-अलग तरीकों से डाला जा सकता है) या आखिरी में। ऐसा इसलिए है क्योंकि यह नहीं जानता कि मिलान करने वाला केवल एक रिकॉर्ड है। दूसरी ओर यदि आप ... और rownum =1 का उपयोग करते हैं, तो यह रिकॉर्ड मिलने के बाद डेटा के माध्यम से ट्रैवर्स करना बंद कर सकता है क्योंकि आपने उसे बताया था कि कोई अन्य मिलान रिकॉर्ड नहीं है (या आवश्यक नहीं है)।

दोष यह है कि यदि डेटा में एक से अधिक संभावित रिकॉर्ड हैं तो पंक्तिबद्ध बाधा के साथ आपको अनिश्चित परिणाम मिल सकते हैं। यदि क्वेरी थी

select id into ll_id
from t where mod (id, 2) = 1
and rownum = 1;

तो मैं डीबी उत्तर 1 के साथ-साथ 3 और साथ ही 123 प्राप्त कर सकता हूं ... आदेश की गारंटी नहीं है और यह परिणाम है। (राउनम क्लॉज के बिना मुझे TOO_MANY_ROWS अपवाद मिलेगा। यह स्थिति पर निर्भर करता है कि कौन सा बदतर है)

यदि आप वास्तव में ऐसी क्वेरी चाहते हैं जो अस्तित्व का परीक्षण करे तो इसे इस तरह लिखें।

begin

select 'It does' 
  into ls_exists
from dual where
exists (your_original_query_without_rownum);

do_something_when_it_does_exist
exception
  when no_data_found then
    do_something_when_it_doesn't_exist
end;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. विभिन्न Oracle प्रकार के लिए NULL मान खोज रहे हैं

  2. PDB अनप्लग ORA-17528 त्रुटि

  3. विभिन्न स्कीमाओं के माध्यम से कैसे लूप करें और प्रत्येक पर कुछ एसक्यूएल निष्पादित करें?

  4. एंटिटी फ्रेमवर्क कोर - टेक (1), सिंगल (), फर्स्ट ()... Oracle प्रोवाइडर के साथ काम नहीं कर रहा है (ORA-00933:SQL कमांड ठीक से समाप्त नहीं हुआ)

  5. Oracle PL SQL में किसी xml तत्व का मान प्राप्त करें