Oracle Sequences - מהם ואיך משתמשים בהם - ilDBA Portal

Oracle Sequences – מהם ואיך משתמשים בהם

26/12/2010 | פורסם על ידי

מהם Sequences

  • Sequence הוא אובייקט בבסיס הנתונים המפיק רשימה של מספרים סידוריים ייחודיים עבור עמודות של טבלאות בסיס הנתונים.
  • Sequence מספק את הדרך המהירה ביותר ליצירת מספרים ייחודיים.
  • Sequence  מפשטים קוד של מערכות הדורשים הקצאת מספור אוטומטי ייחודי לצרכי ערכי מפתחות (PK).
  • Sequence מסויים יכול לשמש ליצירת מספרים סדרתיים עבור טבלה אחת או יותר – הוא אינו מוגבל/מוקצה לטבלה בודדת – הוא אובייקט משותף.
  • לרוב, ניצור Sequence נפרד לכל טבלה לצרכי ערכי המפתחות שלה.
  • Sequence מבטיח יצירת רצף של מספרים ייחודיים בסדר עולה או יורד. Sequence אינו מבטיח שכל המספרים העוקבים בהתאם למבנה ה- Sequenceישומשו בפועל.

פקודת יצירת Sequence

CREATE SEQUENCE sequence_name

[INCREMENT BY n]

[START WITH n]

[{MAXVALUE n | NOMAXVALUE}]

[{MINVALUE n | NOMINVALUE}]

[{CYCLE | NOCYCLE}]

[{CACHE n | NOCACHE}];
  • INCREMENT BY n – מציין את המרווח בין המספרים ב- Sequence כאשר n הוא מספר שלם .
    אם סעיף זה מושמט,ה- Sequence יוגדר במרווחים של 1. אם מציינים כאן ערך שלילי, אז ה-Sequnce יהיה בסדר יורד.
  • START WITH n – מציין את מספר ה- Sequence הראשון שנוצר. אם סעיף זה מושמט, הרצף מתחיל עם 1.
  • MAXVALUE n – מציין את הערך המקסימלי ש- Sequence יכול להקצות.
  • NOMAXVALUE – מציין ערך מרבי של  10^27בסדר עולה ו- (1-)עבור סדר יורד (זוהי אפשרות ברירת המחדל)
  • MINVALUE n – מציין את הערך המינימלי ש- Sequence יכול להקצות.
  • NOMINVALUE –  מציין ערך מרבי של 1 בסדר עולה ו-10^26 עבור סדר יורד (זוהי אפשרות ברירת המחדל).
  • CYCLE | NOCYCLE – מציין אם ה- Sequence ממשיך לייצר ערכים לאחר שהגיע לערך המקסימלי/מינימלי (NOCYCLE היא אפשרות ברירת המחדל).
    לעמודות PK מומלץ להגדיר את הSeuqnce כ- NOCYCLE, על מנת שלא נגיע למצב שהמספרים העוקבים ימוחזרו וניתקל בשגיאות של Duplicate values בעת הכנסת נתונים לעמודות.
  • CACHE n | NOCACHE – מציין כמה ערכים אורקל יקצה מראש ויאחסנם בזיכרון (כברירת מחדל, שרת אורקל מאחסן 20 ערכים).

דוגמא ליצירת Sequnce:

ניצור Sequnce שקוראים לו EMP_EMPID_SEQ. נשתמש בו בעמודת הPK של טבלת Employees.
לא נשתמש באופציית Cycle. ה-Sequnce יתחיל מהערך 120 ויגדל בכל פעם ב-10. הערך המקסימלי שלו הוא 9999. לא נגדיר cache.

CREATE SEQUENCE emp_emptid_seq

INCREMENT BY 10

START WITH 120

MAXVALUE 9999

NOCACHE

NOCYCLE;

טבלאות מערכת של Sequnces:

טבלאות USER/ALL/DBA_Sequnces מכילות מידע על גבי הSequnces השונים הקיימים בבסיס הנתונים.
ניתן לשלוף מהן מידע על מנת לדעת מהו מבנה האינדקס.
שאילתה לדוגמא:

SELECT  sequence_name, min_value, max_value, increment_by, last_number
FROM   user_sequences;
  • עמודת LAST_NUMBER מציגה את המספר האחרון בsequnce במידה וה-Sequnce הוגדר עם NOCACHE.

NEXTVAL ו- CURRVAL

כאמור, Sequnce יוצר מספרים עוקבים אוטומטיים, והוא אינו משוייך לטבלה מסויים, אלא הוא אובייקט עצמאי.
אנו משתמשים בערכי הSequnce בעזרת שני Pseudocolumns – NEXTVAL ו-CURRVAL.

NEXTVAL משמש לשליפת מספרים רצופים עתידיים מתוך Sequence מסויים.
תמיד משתמשים ב- NEXTVAL יחד עם שם ה- Sequence , כלומר Sequnce_name.NEXTVAL.
כאשר נשתמש ב- Sequnce_name.NEXTVAL, מספר חדש יוקצה מתוך ה- Sequnce ויעודכן ב- CURRVAL.

CURRVAL משמש לשליפת המספר שכרגע מוגדר ב-Sequence מסויים.
כמו NEXTVAL, משתמשים ב- CURRVALיחד עם שם ה- Sequence , כלומר Sequnce_name. CURRVAL.
כשיוצרים Sequnce בפעם הראשונה, חייבים להשתמש לפחות פעם אחת ב-NEXTVAL , טרם השימוש ב-CURRVAL.
כאשר נשתמש ב- Sequnce_name. CURRVALיחד, נקבל את המספר הנוכחי ב-Sequnce.

שימוש ב-Sequnce.

עכשיו כשלמדנו איך ליצור Sequnce ולמדנו על שני ה Pseudocolumns – NEXTVAL ו-CURRVAL, נלמד איך משתמשים בפועל בSeuqnce.

הפקודה הבאה מכניסה ערך לטבלת employees עםשימוש בsequence יצרנו קודם לכן:

INSERT INTO employees(employee_id, last_name, department_id)
VALUES      (emp_emptid_seq.NEXTVAL,   'ilDBA', 25);

השליפה הבאה שולפת את הערך הנוכחי שקיים ב-Sequnce:

SELECT  emp_emptid_seq.CURRVAL
FROM   dual;
השליפה הבאה שולפת את הערך הבא שיוקצה ב-Sequnce:
SELECT  emp_emptid_seq.NEXTVAL
FROM   dual;

שימוש ב-Cache

ניתן להשתמש באופציה Cache בעת יצירת ה-Sequnce על מנת לספק גישה מהירה יותר הערכים ב-Sequnce.
ה-cache מאוכלס בפעם הראשונה שמשתמשים ב-Sequnce. משם, כל בקשה של ערך מה-Sequnce, יגיע מתוך הcache. ברגע שייגמרו הערכים שהועלו ל-cache, אז רצף של ערכים חדשים יעלה ל-cache.

פערי ערכים ב-Sequence.

ה-Sequence יוצר ערכים במרווחים שהוגדרו בעת יצירת הSequnce. עם זאת, עלולים להיווצר פערים במספרים המוקצים שנכנסים כערכים בטבלאות שמשתמשות ב- Sequence.

סיבות אפשריות לפערי ערכים:

  1. הקצאת ערכי Sequnce מתרחשת בלי קשר לחייה של הטרנזקציה. במידה והוקצה ערך בפעולת DML כלשהי והטרנזקציה עברה rollback, המספר שהוקצה אבד, ובפעם הבאה המספר שיוקצה הוא המספר העוקב ב-sequnce.
  2. במידה ומשתמשים עם אופצית cache, בעת נפילת מערכת כל הערכים שהוקצו ונשמרו בזיכרון הולכים לאיבוד.
  3. במידה ומשתמשים ב-Sequence במספר טבלאות שונות, יכולים להיות פערי ערכים כי כל טבלה טוענת ערכים יחודיים בזמנים שונים.

סיכום

ברשומה זו למדנו מהם Sequnces בבסיס הנתונים Oracle, איך ליצור אותם ואיך להשתמש בהם.
Sequnces הם אובייקטים מאוד שימושים בבסיס הנתונים.

בקרוב נכתוב לכם על new features בהקשר של Sequnces (כן, גם Sequnces מתקדמים עם הגרסאות השונות), יש למה לחכות.

נתראה ברשומה הבאה!
רוני ורד
ניתן ליצור קשר עם רוני דרך עמוד האודות שלה: אודות

תגובה אחת ל- “Oracle Sequences – מהם ואיך משתמשים בהם”

commenter

הייתי רוצה להוסיף טיפה בנוגע לשימוש באופציה CACHE.

ישנה סיבה נוספת לפערי ערכים שיכולים להיווצר ב Sequence :

היות ו sequence cache נשמר ב shared poolבמידה וניגשים אליו לעתים רחוקות, עלול להיווצר מצב שבו sequence יכול לצאת
(age out) מתוך shared pool .

מצד אחד, צריך להבין שאם לא משתמשים הרבה ב sequence , אז אין גם טעם לשימוש ב cache על מנת לשפר ביצועים..

מצד שני, ניתן לפתור את הבעיה של aging על ידי שימוש בפרוצדורה הבאה:DBMS_SHARED_POOL.KEEP אשר מאפשרת לעשות PIN גם ל sequence בדומה לאובייקטים אחרים ומכניסה אותו ל library cache.

לדוגמא,
אם קיים sequence בשם seq , השימוש הוא :

begin

SYS.DBMS_SHARED_POOL.keep(name => 'seq'. flag => 'Q');

end;

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

שחזור טבלה באמצעות RMAN

בפוסט זה אציג פיצ'ר שאורקל הוסיפו בגרסת  12c (12.1.0.1 ליתר דיוק) – שחזור טבלה\טבלאות לנקודת זמן מסוימת באמצעות RMAN. הפיצ'ר יכול להיות שימושי במקרים הבאים: נמחק או השתנה המידע בטבלה ולא ניתן להשתמש [...]
PL/SQL

PL/SQL Injection – The Beginning

עודד רז פותח בסדרת מאמרים על Pl/sql [...]

תיעוד בסיס הנתונים – למה זה טוב?

ישנם מספר נושאים חשובים שיש לתת עליהם את הדעת בפיתוח ותכנון בסיס נתונים. כמובן שצריך לשים לב לנירמול נכון של הטבלאות, וכמובן שצריך להגדיר סטנדרט לכתיבה נכונה של הקוד, וכמובן שאי אפשר בלי [...]

צבעים דינמיים ב-SSRS

כאשר לקוח שלי ולא משנה אם הוא מבוסס אורקל או SQL Server חושב על פתרון Reporting אני ישר מציע לו את ה- Sql Server Reporting Services. שתי סיבות עיקריות להצעה שלי: רישוי ויכולות. איתי בנימין מסביר על צבעים דינמים [...]
Copyright 2020 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: