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

जहां rownum =1 Oracle में समय लेने वाली क्वेरी

इस प्रश्न का उत्तर पहले ही दिया जा चुका है, मैं केवल एक स्पष्टीकरण प्रदान करूंगा कि क्यों कभी-कभी फ़िल्टर ROWNUM=1 या ROWNUM <=1 के परिणामस्वरूप एक लंबा प्रतिक्रिया समय हो सकता है।

ROWNUM फ़िल्टर (एक टेबल पर) का सामना करते समय, ऑप्टिमाइज़र COUNT STOPKEY के साथ एक पूर्ण स्कैन का उत्पादन करेगा। इसका मतलब है कि ओरेकल पंक्तियों को पढ़ना शुरू कर देगा जब तक कि वह पहली एन पंक्तियों का सामना न करे (यहां एन =1)। एक पूर्ण स्कैन ब्लॉक को पहली सीमा से उच्च जल चिह्न तक पढ़ता है। Oracle के पास यह निर्धारित करने का कोई तरीका नहीं है कि किन ब्लॉकों में पंक्तियाँ हैं और जो पहले से नहीं हैं, इसलिए सभी ब्लॉक तब तक पढ़े जाएंगे जब तक कि N पंक्तियाँ नहीं मिल जातीं। यदि पहले ब्लॉक खाली हैं, तो इसका परिणाम कई बार पढ़ा जा सकता है।

निम्नलिखित पर विचार करें:

SQL> /* rows will take a lot of space because of the CHAR column */
SQL> create table example (id number, fill char(2000));

Table created

SQL> insert into example 
  2     select rownum, 'x' from all_objects where rownum <= 100000;

100000 rows inserted

SQL> commit;

Commit complete

SQL> delete from example where id <= 99000;

99000 rows deleted

SQL> set timing on
SQL> set autotrace traceonly
SQL> select * from example where rownum = 1;

Elapsed: 00:00:05.01

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=1 Bytes=2015)    
   1    0   COUNT (STOPKEY)
   2    1     TABLE ACCESS (FULL) OF 'EXAMPLE' (TABLE) (Cost=7 Card=1588 [..])

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      33211  consistent gets
      25901  physical reads
          0  redo size
       2237  bytes sent via SQL*Net to client
        278  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

जैसा कि आप देख सकते हैं कि संगत की संख्या बहुत अधिक है (एक पंक्ति के लिए)। यह स्थिति कुछ मामलों में सामने आ सकती है, उदाहरण के लिए, आप /*+APPEND*/ के साथ पंक्तियाँ सम्मिलित करते हैं संकेत (इस प्रकार उच्च पानी के निशान से ऊपर), और आप समय-समय पर सबसे पुरानी पंक्तियों को भी हटा देते हैं, जिसके परिणामस्वरूप खंड की शुरुआत में बहुत सी खाली जगह होती है।



  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 में इसके बाहर किसी प्रक्रिया के परिणाम कैसे प्रदर्शित करें?

  2. cx_Oracle:मैं परिणाम सेट पर पुनरावृति कैसे करूं?

  3. अधिकतम कनेक्शन पूल आकार

  4. सी . के माध्यम से ओरेकल डीबी से जुड़ना

  5. क्या मैं Oracle में एक परमाणु MERGE कर सकता हूँ?