यह उन प्रश्नों पर प्रदर्शन में उल्लेखनीय रूप से सुधार करता है (प्रतिशत औसत का दसियों) जिन्हें साधारण सिंगल इंडेक्स लुकअप द्वारा हल नहीं किया जा सकता है उदा। तालिका जुड़ती है। हालाँकि इसमें डेटा/एप्लिकेशन त्रुटि को छिपाने की क्षमता है।
आइए एक टेबल लें:
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;