यह सामान्य है, हाँ। दस्तावेज़ीकरण 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 मानों को कैश नहीं बना लेते हैं, या कुछ ऐसा होता है जो इसे प्रभावित करता है - डेटाबेस बाउंस किया जा रहा है , अनुक्रम फिर से बदला जा रहा है, आदि।