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

ओरेकल अनुक्रम पर LAST_NUMBER

यह सामान्य है, हाँ। दस्तावेज़ीकरण all_sequences से डेटा शब्दकोश दृश्य , last_number है:

इसे एक नए क्रम के साथ फिर से बनाया जा सकता है:

SQL> create sequence SEQ_PAGE_ID start with 2222292436 increment by 1 cache 20;

sequence SEQ_PAGE_ID created.

SQL> select sequence_name, increment_by, cache_size, last_number
  2  from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID                               1         20  2222292436 

SQL> select SEQ_PAGE_ID.nextval from dual;

   NEXTVAL
----------
2222292436 

SQL> select sequence_name, increment_by, cache_size, last_number
  2  from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID                               1         20  2222292456 

last_number कैश आकार से ऊपर कूद गया, जो सामान्य है।

SQL> alter sequence SEQ_PAGE_ID CACHE 5000;

sequence SEQ_PAGE_ID altered.

SQL> select sequence_name, increment_by, cache_size, last_number
  2  from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID                               1       5000  2222292437 

last_number नीचे चला जाता है, लेकिन अब उत्पन्न वास्तविक अंतिम अनुक्रम संख्या को दर्शाता है। डीडीएल ने (जाहिरा तौर पर) डिस्क पर लिखे गए डेटा को अद्यतन करने के लिए अद्यतन किया है ताकि यह दर्शाया जा सके कि कैश के शीर्ष के बजाय वर्तमान मूल्य क्या होता है - या तो पुराना 20-मान कैश या नया 5000-मूल्य कैश। आपके मामले में आपको 2222292447 . मिला है , जिसका मतलब है कि जब मैं alter चला रहा था, तब आप कैश के माध्यम से दस मान आगे थे। ।

डिस्क में सहेजा गया मान काफी हद तक वहां होता है ताकि यदि डेटाबेस क्रैश हो जाए तो यह जान सके कि कहां से लेना है। पुनः आरंभ करने पर अनुक्रम रिकॉर्ड किए गए last_number . से संख्याएं उत्पन्न करना शुरू कर देगा . सामान्य चलने के दौरान इसे वापस संदर्भित करने की आवश्यकता नहीं होती है, यह केवल डिस्क पर मान को अपडेट करता है जब नए मान कैश किए जाते हैं। यह वास्तविक समय में मूल्य को बनाए रखने के लिए महंगी (धीमी) लॉकिंग करने की आवश्यकता के बिना, क्रैश के बाद अनुक्रम संख्याओं को फिर से जारी करने से रोकता है - आखिरकार बचने के लिए कैश क्या है।

समस्या तभी होगी जब last_value वास्तविक उत्पन्न अनुक्रम से कम था, लेकिन ऐसा नहीं हो सकता। (ठीक है, जब तक कि अनुक्रम चक्र पर सेट न हो)।

SQL> select SEQ_PAGE_ID.nextval from dual;

   NEXTVAL
----------
2222292437 

उत्पन्न अगली अनुक्रम संख्या कैश आकार परिवर्तन से पहले पिछले एक से आगे बढ़ती है; इसने पुराने मान का पुन:उपयोग नहीं किया है क्योंकि आप शब्दकोश मूल्य से चिंतित हो सकते हैं।

SQL> select sequence_name, increment_by, cache_size, last_number
  2  from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID                               1       5000  2222297437 

last_number अब पिछले संग्रहीत मूल्य को 5000 के कैश आकार से बढ़ा हुआ दिखाता है। डेटा डिक्शनरी में जो है वह अब फिर से नहीं बदलेगा जब तक कि हम सभी 5000 मानों को कैश नहीं बना लेते हैं, या कुछ ऐसा होता है जो इसे प्रभावित करता है - डेटाबेस बाउंस किया जा रहा है , अनुक्रम फिर से बदला जा रहा है, आदि।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कौन सा डाउनलोड करना है:JDK या JRE?

  2. Oracle:PL/SQL में सबसे तेज़ तरीका यह देखने के लिए कि क्या मूल्य मौजूद है:सूची, VARRAY, या Temp तालिका

  3. एसक्यूएल में विस्मयादिबोधक चिह्न (ओरेकल)

  4. किसी दृश्य के विरुद्ध क्वेरी करते समय, दृश्य की परिभाषा में फ़िल्टरिंग क्लॉज़ को नज़रअंदाज़ किया जा रहा है

  5. SQL Oracle - फ़िल्टर के साथ लगातार पंक्तियों का संयोजन