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

संग्रहीत कार्यविधि SQL निष्पादन योजना

मैंने यहां इसी तरह के एक प्रश्न का उत्तर दिया है https://stackoverflow.com/a/26633820/3989608

NULL मान और INDEX के बारे में कुछ तथ्य:

  • Oracle में पूरी तरह से NULL कुंजियाँ 'सामान्य' B*ट्री में दर्ज नहीं की जाती हैं

  • इसलिए, यदि आपके पास C1 और C2 पर एक सम्मिलित अनुक्रमणिका है, तो आपको इसमें NULL मान मिलने की संभावना है - क्योंकि आपके पास एक पंक्ति हो सकती है जहाँ C1 NULL है लेकिन C2 NULL नहीं है - वह प्रमुख मान सूचकांक में होगा।

उसी के संबंध में थॉमस कायटे के प्रदर्शन का कुछ अंश:

example@sqldat.com> create table t
2  as
3  select object_id, owner, object_name
4    from dba_objects;
Table created.

example@sqldat.com> alter table t modify (owner NOT NULL);
Table altered.

example@sqldat.com> create index t_idx on t(object_id,owner);
Index created.

example@sqldat.com> desc t
Name                    Null?    Type
----------------------- -------- ----------------
OBJECT_ID                        NUMBER
OWNER                   NOT NULL VARCHAR2(30)
OBJECT_NAME                      VARCHAR2(128)

example@sqldat.com> exec dbms_stats.gather_table_stats(user,'T');
PL/SQL procedure successfully completed.

ठीक है, OBJECT_ID पर लागू होने पर उस अनुक्रमणिका का उपयोग निश्चित रूप से "IS NOT NULL" को संतुष्ट करने के लिए किया जा सकता है:

example@sqldat.com> set autotrace traceonly explain
example@sqldat.com> select * from t where object_id is null;

Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=34)
1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3 Card=1 Bytes=34)
2    1     INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=2 Card=1)

वास्तव में - भले ही तालिका में कोई NULL कॉलम न हो, या हम OWNER को शामिल करने वाला एक सम्मिलित सूचकांक नहीं चाहते/चाहते हैं - NULL OBJECT_ID मानों को आसानी से खोजने का एक पारदर्शी तरीका है:

example@sqldat.com> drop index t_idx;
Index dropped.

example@sqldat.com> create index t_idx_new on t(object_id,0);
Index created.

example@sqldat.com> set autotrace traceonly explain
example@sqldat.com> select * from t where object_id is null;

Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=34)
1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3 Card=1 Bytes=34)
2    1     INDEX (RANGE SCAN) OF 'T_IDX_NEW' (NON-UNIQUE) (Cost=2 Card=1)

स्रोत :थॉमस कायटे द्वारा कुछ नहीं के बारे में



  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. ओरेकल एसक्यूएल में जहां स्थिति की गतिशील संख्या

  3. OracleCommandBuilder.DeriveParameters() OracleException फेंकता है:ORA-06564:ऑब्जेक्ट मौजूद नहीं है ORA-06512:SYS.DBMS_UTILITY पर

  4. ऑरैकल में एक स्ट्रिंग के पहले तीन वर्णों को कैसे बदलें?

  5. Oracle SQL में:आप तालिका में वर्तमान दिनांक + समय कैसे सम्मिलित करते हैं?