fbpx

ניהול ה 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 מגה) חלוקת האקסטנטים שונה לחלוטין.