ניהול ה Extents יכול להתבצע בשתי צורות :
Dictionary Managed Tablespace (DMT) – הצורה ההיסטורית לניהול Extents, בצורה זו המידע אודות ה Extents הפנויים והתפוסים ממוקם ב Data Dictionary, כך שכל פניה לבקשת מידע נעשית באמצעות טבלאות המערכת (SYS.FET$ ו – SYS.UET$).
צורה זו נחשבת לפחות יעילה מבחינת ביצועים (בין היתר עלולה ליצר פעולות רקורסיביות רבות ולחץ על טבלאות המערכת)
Locally Managed Tablespace (LMT) – החל מגרסת 8i. בצורה זו המידע אודות ה Extents הפנויים והתפוסים ממוקם במפת ביטים ברמת ה .Tablespaceצורה זו נחשבת ליעילה ביותר ועדיפה על פני ה DMT.
בפוסט זה נתמקד ב LMT.
Locally Managed Tablespace – Autoallocate VS. Uniform
כאשר אנו מנהלים את האקסטנטים שלנו באמצעות ה LMT יש בידינו לבחור את גידלו של כל אקסטנט כאשר קיימות שתי גישות – חלוקה משתנה וחלוקה קבועה.
Autoallocate – חלוקה משתנה. לפי גישה זו, ככל שתדירות בקשת מקום נוסף תגדל כך גודלו של האקסטנט יגדל מפעם לפעם, למשל אם יש לנו שטח אדמה מסויים וקבלנים שונים בונים עליו מבנים, ככל שקבלן יבוא ויגיד לנו שוב ושוב "נגמר לי המקום" אנו נעדיף להביא לו Chunks יותר גדולים של שטח.
Uniform – חלוקה קבועה. לפי גישה זו, גודל האקסטנטים תמיד יהיה קבוע, לא משנה התדירות בה אנו מבקשים עוד מקום. אם אותו קבלן מהדוגמא הקודמת יבוא אלינו גם אלף פעמים ביום ויבקש עוד מקום תמיד הוא יקבל את אותה ההקצאה.
Locally Managed Tablespace – Autoallocate
נייצר Tablespace אשר הניהול שלו לוקאלי וחלוקת האקסטנטים שלו משתנה :
SYS > CREATE TABLESPACE auto_tbs DATAFILE 'C:APPADMINISTRATORORADATAORCLauto_tbs.dbf' SIZE 25M EXTENT MANAGEMENT LOCAL AUTOALLOCATE; Tablespace created.
ניתן לראות את המידע אודות ה Tablespace החדש שנוצר בטבלת המערכת הבאה :
SYS > SELECT TABLESPACE_NAME, CONTENTS, EXTENT_MANAGEMENT, ALLOCATION_TYPE FROM DBA_TABLESPACES; TABLESPACE_NAME CONTENTS EXTENT_MAN ALLOCATIO --------------- --------- ---------- --------- SYSTEM PERMANENT LOCAL SYSTEM SYSAUX PERMANENT LOCAL SYSTEM UNDOTBS1 UNDO LOCAL SYSTEM TEMP TEMPORARY LOCAL UNIFORM USERS PERMANENT LOCAL SYSTEM EXAMPLE PERMANENT LOCAL SYSTEM AUTO_TBS PERMANENT LOCAL SYSTEM 7 rows selected.
נייצר ב Tablespace שבנינו טבלה חדשה :
SYS > CREATE TABLE auto_tab (a VARCHAR2(3000)) TABLESPACE auto_tbs; Table created
ניתן לראות מידע כללי אודות הטבלה באמצעות טבלת המערכת הבאה :
SYS >SELECT TABLE_NAME, TABLESPACE_NAME 2 FROM DBA_TABLES 3 WHERE TABLESPACE_NAME = 'AUTO_TBS'; TABLE_NAME TABLESPACE_NAME ------------------------------ --------------- AUTO_TAB AUTO_TBS
וניתן לראות את מספר האקסטנטים (אשר הוקצו עד כה) וגודלם באמצעות טבלאות המערכת הבאות :
SYS >SELECT SEGMENT_NAME, BYTES/1024, EXTENTS 2 FROM DBA_SEGMENTS 3 WHERE SEGMENT_NAME = 'AUTO_TAB'; SEGMENT_NAME BYTES/1024 EXTENTS ------------------------------ ---------- ---------- AUTO_TAB 64 1 SYS >SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS 2 FROM DBA_EXTENTS 3 WHERE segment_name = 'AUTO_TAB'; SEGMENT_NAME EXTENT_ID BYTES/1024 BLOCKS ------------------------------ ---------- ---------- ---------- AUTO_TAB 0 64 8
נשתמש בלולאת PL/SQL פשוטה ונכניס נתונים לתוך הטבלה :
SYS >BEGIN 2 FOR i IN 1..5000 LOOP 3 INSERT INTO AUTO_TAB VALUES (LPAD('*',3000,'*')); 4 END LOOP; 5 END; 6 / PL/SQL procedure successfully completed.
נשתמש שוב באותן טבלאות מערכת ונראה את השינוי –
SYS >SELECT SEGMENT_NAME, BYTES/1024, EXTENTS 2 FROM DBA_SEGMENTS 3 WHERE SEGMENT_NAME = 'AUTO_TAB'; SEGMENT_NAME BYTES/1024 EXTENTS ------------------------------ ---------- ---------- AUTO_TAB 20480 35 SYS >SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS 2 FROM DBA_EXTENTS 3 WHERE segment_name = 'AUTO_TAB'; SEGMENT_NAME EXTENT_ID BYTES/1024 BLOCKS ------------------------------ ---------- ---------- ---------- AUTO_TAB 0 64 8 AUTO_TAB 1 64 8 AUTO_TAB 2 64 8 AUTO_TAB 3 64 8 AUTO_TAB 4 64 8 ... AUTO_TAB 16 1024 128 AUTO_TAB 17 1024 128 AUTO_TAB 18 1024 128 ...
שימו לב כי גודלו של כל אקסנט השתנה (וגדל) ככל שהחלוקה התקדמה.
Locally Managed Tablespace – Uniform
כעת נייצר Tablespace בניהול לוקאלי עם חלוקת אקסטנטים קבועה, בדוגמא זו בחרתי לייצר Tablespace עם גודל אקסטנט קבוע של 2M
SYS > CREATE TABLESPACE uniform_tbs DATAFILE 'C:APPADMINISTRATORORADATAORCLuni_tbs.dbf' SIZE 25M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M; Tablespace created.
ניתן לראות את המידע אודות ה Tablespace החדש שנוצר בטבלת המערכת הבאה :
SYS > SELECT TABLESPACE_NAME, CONTENTS, EXTENT_MANAGEMENT, ALLOCATION_TYPE, NEXT_EXTENT / 1024 FROM DBA_TABLESPACES; TABLESPACE_NAME CONTENTS EXTENT_MAN ALLOCATIO NEXT_EXTENT/1024 --------------- --------- ---------- --------- ---------------- SYSTEM PERMANENT LOCAL SYSTEM SYSAUX PERMANENT LOCAL SYSTEM ... EXAMPLE PERMANENT LOCAL SYSTEM AUTO_TBS PERMANENT LOCAL SYSTEM UNIFORM_TBS PERMANENT LOCAL UNIFORM 2048
נייצר טבלה חדשה ב Tablespace שבנינו :
SYS > CREATE TABLE uniform_tab (a VARCHAR2(3000)) TABLESPACE uniform_tbs; Table created.
ונראה את מספר האקסטנטים (שהוקצו עד כה) וגודלם באמצעות טבלאות המערכת הבאות
SYS >SELECT SEGMENT_NAME, BYTES/1024, EXTENTS 2 FROM DBA_SEGMENTS 3 WHERE SEGMENT_NAME = 'UNIFORM_TAB'; SEGMENT_NAME BYTES/1024 EXTENTS ------------------------------ ---------- ---------- UNIFORM_TAB 2048 1 SYS >SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS 2 FROM DBA_EXTENTS 3 WHERE segment_name = 'UNIFORM_TAB'; SEGMENT_NAME EXTENT_ID BYTES/1024 BLOCKS --------------- ---------- ---------- ---------- UNIFORM_TAB 0 2048 256
נמלא את הטבלה באמצעות לולאת ה PL/SQL הבאה
SYS >BEGIN 2 FOR i IN 1..5000 LOOP 3 INSERT INTO UNIFORM_TAB VALUES (LPAD('*',3000,'*')); 4 END LOOP; 5 END; 6 / PL/SQL procedure successfully completed.
ונצפה שוב במספר האקסטנטים וגודלם באמצעות טבלאות המערכת הבאות :
SYS >SELECT SEGMENT_NAME, BYTES/1024, EXTENTS 2 FROM DBA_SEGMENTS 3 WHERE SEGMENT_NAME = 'UNIFORM_TAB'; SEGMENT_NAME BYTES/1024 EXTENTS --------------- ---------- ---------- UNIFORM_TAB 20480 10 SYS >SELECT SEGMENT_NAME, EXTENT_ID, BYTES/1024, BLOCKS 2 FROM DBA_EXTENTS 3 WHERE segment_name = 'UNIFORM_TAB'; SEGMENT_NAME EXTENT_ID BYTES/1024 BLOCKS --------------- ---------- ---------- ---------- UNIFORM_TAB 0 2048 256 UNIFORM_TAB 1 2048 256 UNIFORM_TAB 2 2048 256 UNIFORM_TAB 3 2048 256 UNIFORM_TAB 4 2048 256 UNIFORM_TAB 5 2048 256 UNIFORM_TAB 6 2048 256 UNIFORM_TAB 7 2048 256 UNIFORM_TAB 8 2048 256 UNIFORM_TAB 9 2048 256
שימו לב כי הפעם, על אף שטבלת ה UNIFORM_TAB מכילה את אותה כמות נתונים כמו הטבלה AUTO_TAB (שתיהן מכילות 20 מגה) חלוקת האקסטנטים שונה לחלוטין.