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

Oracle यहाँ एक छिपा हुआ कॉलम क्यों जोड़ता है?

Oracle रिलीज़ में 11g Oracle ने DDL संचालन के प्रदर्शन में सुधार के लिए एक नई अनुकूलन तकनीक पेश की है। NOT NULL . जोड़ते समय यह नई सुविधा अत्यंत तीव्र निष्पादन समय देती है मौजूदा तालिका में डिफ़ॉल्ट मान वाला कॉलम। रिलीज 12c के बाद से DDL अनुकूलन को NULL . शामिल करने के लिए बढ़ा दिया गया है डिफ़ॉल्ट मान वाले कॉलम।

1.000.000 पंक्तियों के साथ निम्नलिखित परीक्षण तालिका पर विचार करें:

sql> create table xxy
as select rownum a from dual connect by level <= 1e6
;
sql> select /*+ gather_plan_statistics */ count(1) from xxy;
sql> select * from table(dbms_xplan.display_cursor); 

अब हम 11g और 12c के लिए अलग-अलग सत्रों में डिफ़ॉल्ट मान वाला एक अतिरिक्त नॉट नल कॉलम जोड़ने जा रहे हैं:

11g> alter table xxy add b number default 1;
     --Table XXY altered. Elapsed: 00:01:00.998

12c> alter table xxy add b number default 1;
     --Table XXY altered. Elapsed: 00:00:00.052

निष्पादन समय में अंतर पर ध्यान दें:1M पंक्तियों को 5 ms में अपडेट किया गया!?

निष्पादन योजना से पता चलता है:

11g> select count(1) from xxy where b = 1;
  COUNT(1)
----------
   1000000
11g> select * from table(dbms_xplan.display_cursor);
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |  1040 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |    13 |            |          |
|*  2 |   TABLE ACCESS FULL| XXY  |   898K|    11M|  1040   (1)| 00:00:13 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("B"=1)
Note
-----
   - dynamic sampling used for this statement (level=2)

12c> select count(1) from xxy where b = 1;
12c> select * from table(dbms_xplan.display_cursor);
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |   429 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |     5 |            |          |
|*  2 |   TABLE ACCESS FULL| XXY  |  1000K|  4882K|   429   (2)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00002$",0)),NULL,NVL("
              B",1),'0',NVL("B",1),'1',"B")=1)
Note
-----
   - statistics feedback used for this statement

12c पर निष्पादन योजना 11g के विपरीत एक जटिल विधेय भाग दिखाती है जिसमें एक नया आंतरिक स्तंभ शामिल होता है SYS_NC00006$ .

यह विधेय इंगित करता है कि, आंतरिक रूप से, Oracle अभी भी B कॉलम को संभावित रूप से गैर डिफ़ॉल्ट मान रखने में सक्षम होने पर विचार कर रहा है। इसका अर्थ है - Oracle पहली बार में प्रत्येक पंक्ति को डिफ़ॉल्ट मान के साथ भौतिक रूप से अपडेट नहीं करता है।

एक नया आंतरिक कॉलम क्यों SYS_NC00006$ बनाया गया है?

12c> select column_name, virtual_column, hidden_column, user_generated 
from user_tab_cols
where table_name = 'XXY'
;
COLUMN_NAME      VIR HID USE
---------------- --- --- ---
B                NO  NO  YES
SYS_NC00002$     NO  YES NO 
A                NO  NO  YES

12c> select a, b, SYS_NC00002$ hid from xxy where a in (1,10);

        A          B HID            
---------- ---------- ----------------
         1          1                 
        10          1                 

12c> update xxy set b=1 where a=10 and b=1;
1 row updated.

12c> select a, b, SYS_NC00002$ hid from xxy where a in (1,10);
         A          B HID            
---------- ---------- ----------------
         1          1                 
        10          1 01              

बी और संबंधित आंतरिक कॉलम के मूल्यों में अंतर पर ध्यान दें। Oracle बस अपने सिस्टम द्वारा उत्पन्न आंतरिक कॉलम (जैसे SYS_NC00006$) के माध्यम से जाँच कर रहा है ) और SYS_OP_VECBIT . के माध्यम से कार्य करता है कि क्या बी कॉलम के डिफ़ॉल्ट मान पर विचार करना है या एक स्पष्ट डीएमएल स्टेटमेंट के माध्यम से संशोधित वास्तविक मूल्य पर विचार करना है।

दो अलग-अलग परिवर्तन कथनों के साथ क्या है?

12c> alter table xxy add (b integer);
12c> alter table xxy modify b default 1;

12c> select count(b), count(coalesce(b,0)) nulls  from xxy where b = 1 or b is null;

  COUNT(B)      NULLS
---------- ----------
         0    1000000

सभी पंक्तियों के लिए नए कॉलम का मान 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. Oracle sql में IPv4 एड्रेस को 4 नंबरों में विभाजित करें

  3. सभी रिकॉर्ड देखने के लिए Oracle SQL डेवलपर में बफर आकार कैसे बढ़ाएं?

  4. फ़ील्ड के सबस्ट्रिंग मानों के आधार पर दो तालिकाओं में कैसे शामिल हों?

  5. plsql में प्रक्रिया निकाय के अंदर कर्सर कैसे बनाएं