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

ओरेकल में ज्ञात विभाजन कुंजी मान दिए जाने पर कैसे बताएं कि एक पंक्ति किस विभाजन में जाएगी?

इस परीक्षण डेटा के साथ

INSERT INTO foos VALUES (1234, SYSDATE);
INSERT INTO foos VALUES (1235, SYSDATE);
INSERT INTO foos VALUES (1236, SYSDATE);

जैसा कि यहां बताया गया है https://jonathanlewis.wordpress.com/2009/11 /21/ora_hash-function/

आपको मिलता है

with hsh as (
select  BATCH_ID, ora_hash(BATCH_ID, 3)+1 subpartition_position  from foos)
select BATCH_ID, SUBPARTITION_POSITION,
(select subpartition_name from   user_tab_subpartitions where   table_name = 'FOOS' and SUBPARTITION_POSITION = hsh.SUBPARTITION_POSITION) subpartition_name
from hsh;

  BATCH_ID SUBPARTITION_POSITION SUBPARTITION_NAME            
---------- --------------------- ------------------------------
      1236                     1 R0_H0                          
      1235                     3 R0_H2                          
      1234                     4 R0_H3   

ध्यान दें कि पैरामीटर 3 ora_hash . में (उप) विभाजनों की संख्या 1 से घटाई जाती है। (=4-1)। यदि संदर्भ में वर्णित विभाजन की संख्या दो की शक्ति (जो अनुशंसित नहीं है) नहीं है, तो आपको अतिरिक्त प्रसंस्करण करना होगा।

आप नीचे दिए गए स्पष्टीकरण विभाजन क्वेरी के साथ परिणाम सत्यापित कर सकते हैं

select * from foos subpartition( R0_H0 ); --   1236
select * from foos subpartition( R0_H1 ); --   empty
select * from foos subpartition( R0_H2 ); --   1235
select * from foos subpartition( R0_H3 ); --   1234

और निश्चित रूप से यह नई चाबियों के लिए भी काम करता है, 1237 . के लिए नया जो तालिका में नहीं है।

with hsh as (
select  1237 BATCH_ID, ora_hash(1237, 3)+1 subpartition_position  from dual)
select BATCH_ID, SUBPARTITION_POSITION,
(select subpartition_name from   user_tab_subpartitions where   table_name = 'FOOS' and SUBPARTITION_POSITION = hsh.SUBPARTITION_POSITION) subpartition_name
from hsh;

  BATCH_ID SUBPARTITION_POSITION SUBPARTITION_NAME            
---------- --------------------- ------------------------------
      1237                     2 R0_H1 

"अनुमानित" उप-विभाजन R0_H1 . है , आइए * देखें कि INSERT कहाँ जाएगा:

INSERT INTO foos VALUES (1237, SYSDATE);      
select * from foos subpartition( R0_H1 ); --  1237

लेकिन सावधानी के साथ प्रयोग करें, क्योंकि यह IMO दस्तावेज़ीकृत विशेषता नहीं है ...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पीएल/एसक्यूएल, पीएलएस त्रुटि 00363 से टेक्स्ट फ़ाइल में कैसे लिखें

  2. Oracle तालिका को गतिशील रूप से पिवट करना

  3. sysdate पर आधारित ट्रिगर

  4. मुझे ऑरैकल 12c . में ब्लॉब कॉलम में छवि आकार बदलने में समस्या है

  5. Oracle 19c Open_cursor समस्या से आगे निकल गया