powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
16 сообщений из 16, страница 1 из 1
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174116
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Специфика приложения такова, что в схеме пользователя постоянно создаются и удаляются таблицы. (Не будем жужжать насчет того, провильно или нет).
Но факт в том, что этот тэйблспэйс, в котором обитают эти таблицы растет бесконтрольно. Казалось бы почему?
Ведь по-идее при удалении таблицы все занятые ей экстенты маркируются как свободные и оракл начинает сканировать tablespace на наличие свободных подходящих блоков/экстентов с начала (то есть с первого блока), что гарантирует при многократном удалении одной таблицы и создании ее снова постоянный размер tablespace'а.
Ан нет. Оракл пользуется каким-то магическим алгоритмом и выбирает свободные блоки не в начале tablespace'а, а вообще где угодно, вплоть до того, что может увидеть, что в данном куске tablespace'а нет свободных блоков и он, используя параметр AUTOEXTEND расширит tablespace.
Например:

Из под привелигированного пользователя (например sys'a), создадим tablespace и пользователя, кидающего свои таблицы в этот tablespace:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLESPACE TEST_TData_TSpace 
DATAFILE 'TEST_TData_TSpace_DATA.DAT' SIZE 5M REUSE
AUTOEXTEND ON NEXT 5M
MAXSIZE UNLIMITED 
DEFAULT STORAGE 
(
INITIAL 64K
NEXT 64K
MINEXTENTS  1 
MAXEXTENTS UNLIMITED
PCTINCREASE  0  
);

CREATE USER TEST IDENTIFIED BY TEST_PASSWORD
DEFAULT TABLESPACE TEST_TData_TSpace;

GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE, QUERY REWRITE, CREATE TABLE, CREATE TYPE TO TEST; 



Смотрю на созданный tablespace и записываю его размер:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880          640      5234688           639 

В общем 5 мег, все как и должно быть.

Теперь запускаю тестовый пример (от пользователя TEST):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> BEGIN
   2    FOR Index1$ IN  1 .. 30  LOOP
   3     EXECUTE IMMEDIATE 
   4     '
  5     CREATE TABLE TEST'||Index1$||'
  6     (
  7     ID NUMBER(10),
  8     SomeParam VARCHAR2(10)
  9     )
 10     PCTFREE 10
 11     PCTUSED 80
 12    '; 
  13    END LOOP; 
  14    FOR Index1$ IN  1 .. 30  LOOP
  15     EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
  16    END LOOP;
  17   END;
  18   /

PL/SQL procedure successfully completed.


И смотрю чего у меня там со свободным местом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SQL> set pagesize  100 ;
SQL> SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
   2   FROM DBA_FREE_SPACE 
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                        2        81920           10 
TEST_TDATA_TSPACE                       12        81920           10 
TEST_TDATA_TSPACE                       22        81920           10 
TEST_TDATA_TSPACE                       32        81920           10 
TEST_TDATA_TSPACE                       42        81920           10 
TEST_TDATA_TSPACE                       52        81920           10 
TEST_TDATA_TSPACE                       62        81920           10 
TEST_TDATA_TSPACE                       72        81920           10 
TEST_TDATA_TSPACE                       82        81920           10 
TEST_TDATA_TSPACE                       92        81920           10 
TEST_TDATA_TSPACE                      102        81920           10 
TEST_TDATA_TSPACE                      112        81920           10 
TEST_TDATA_TSPACE                      122        81920           10 
TEST_TDATA_TSPACE                      132        81920           10 
TEST_TDATA_TSPACE                      142        81920           10 
TEST_TDATA_TSPACE                      152        81920           10 
TEST_TDATA_TSPACE                      162        81920           10 
TEST_TDATA_TSPACE                      172        81920           10 
TEST_TDATA_TSPACE                      182        81920           10 
TEST_TDATA_TSPACE                      192        81920           10 
TEST_TDATA_TSPACE                      202        81920           10 
TEST_TDATA_TSPACE                      212        81920           10 
TEST_TDATA_TSPACE                      222        81920           10 
TEST_TDATA_TSPACE                      232        81920           10 
TEST_TDATA_TSPACE                      242        81920           10 
TEST_TDATA_TSPACE                      252        81920           10 
TEST_TDATA_TSPACE                      262        81920           10 
TEST_TDATA_TSPACE                      272        81920           10 
TEST_TDATA_TSPACE                      282        81920           10 
TEST_TDATA_TSPACE                      292        81920           10 
TEST_TDATA_TSPACE                      302      2777088          339 

Вопрос по ходу: почему оракл делает один экстент размером 10 блоков, а не 8, что равно 64К??? (но это не основной вопрос).

Теперь снова тест:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> BEGIN
   2    FOR Index1$ IN  1 .. 30  LOOP
   3     EXECUTE IMMEDIATE 
   4     '
  5     CREATE TABLE TEST'||Index1$||'
  6     (
  7     ID NUMBER(10),
  8     SomeParam VARCHAR2(10)
  9     )
 10     PCTFREE 10
 11     PCTUSED 80
 12    '; 
  13    END LOOP; 
  14   END;
  15   /

PL/SQL procedure successfully completed.


И смотрю, какое же место в свободном пространстве tablespac'а заняли таблицы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
SQL> SELECT SUBSTR(SEGMENT_NAME, 1 , 15 ) AS SEGMENT_NAME, TABLESPACE_NAME, BLOCK_ID
   2   FROM DBA_EXTENTS
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

SEGMENT_NAME    TABLESPACE_NAME                  BLOCK_ID
 --------------- ------------------------------ ----------
 
TEST12          TEST_TDATA_TSPACE                        2 
TEST24          TEST_TDATA_TSPACE                       12 
TEST19          TEST_TDATA_TSPACE                       22 
TEST28          TEST_TDATA_TSPACE                       32 
TEST23          TEST_TDATA_TSPACE                       42 
TEST11          TEST_TDATA_TSPACE                       52 
TEST1           TEST_TDATA_TSPACE                       62 
TEST7           TEST_TDATA_TSPACE                       72 
TEST30          TEST_TDATA_TSPACE                       82 
TEST15          TEST_TDATA_TSPACE                       92 
TEST29          TEST_TDATA_TSPACE                      102 
TEST10          TEST_TDATA_TSPACE                      112 
TEST17          TEST_TDATA_TSPACE                      122 
TEST14          TEST_TDATA_TSPACE                      132 
TEST22          TEST_TDATA_TSPACE                      142 
TEST8           TEST_TDATA_TSPACE                      152 
TEST25          TEST_TDATA_TSPACE                      162 
TEST21          TEST_TDATA_TSPACE                      172 
TEST20          TEST_TDATA_TSPACE                      182 
TEST6           TEST_TDATA_TSPACE                      192 
TEST16          TEST_TDATA_TSPACE                      202 
TEST5           TEST_TDATA_TSPACE                      212 
TEST9           TEST_TDATA_TSPACE                      222 
TEST3           TEST_TDATA_TSPACE                      232 
TEST18          TEST_TDATA_TSPACE                      242 
TEST27          TEST_TDATA_TSPACE                      252 
TEST13          TEST_TDATA_TSPACE                      262 
TEST2           TEST_TDATA_TSPACE                      272 
TEST26          TEST_TDATA_TSPACE                      282 
TEST4           TEST_TDATA_TSPACE                      292 


Вижу, что оракл раздал каждой вновь создаваемой таблице свободный экстент почти от балды (первой - 62-й, второй 272-й и тд).
Вопрос первый: каким образом оракл сканирует tablespace чтобы раздать таблицам именно такое пространство, то биш как оракл ищет свободные экстенты???

Из этого примера не видно, что оракал также может не найти свободные экстенты, даже если они очевидно присутствуют, что показывает следующий пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SQL> BEGIN
   2    BEGIN
   3     FOR Index1$ IN  1 .. 30  LOOP
   4      EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
   5     END LOOP;
   6    EXCEPTION WHEN  OTHERS THEN NULL;
   7    END; 
   8   
   9    FOR Index2$ IN  1 .. 50  LOOP
  10     FOR Index1$ IN  1 .. 30  LOOP
  11      EXECUTE IMMEDIATE 
  12      '
 13      CREATE TABLE TEST'||Index1$||'
 14      (
 15      ID NUMBER(10),
 16      SomeParam VARCHAR2(10)
 17      )
 18      PCTFREE 10
 19      PCTUSED 80
 20     '; 
  21     END LOOP; 
  22     FOR Index1$ IN  1 .. 30  LOOP
  23      EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
  24     END LOOP;
  25    END LOOP; 
  26   END;
  27   /


Много раз вызвав удаление и создание таблиц получаю что мой tablespace раздулся аж до 125 мегабайт. "Умный" оракл!!! Либо я дурак.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
   2   FROM DBA_DATA_FILES 
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                125829120        15360    125820928         15359 


Поэтому вопрос второй: при явном наличии свободных экстентов оракл не может их найти, выделяет в незанятой области а уже после и наращивает tablespace???


Далее...
Знаю, что решить мою проблему может "слитие" свободных экстентов с момощью комманды:

Код: plaintext
ALTER TABLESPACE TEST_TDATA_TSPACE COALESCE;


Экстенты сливаются и роста tablespace не происходит. Оракл становится по-настоящему умным и выбирает блоки последовательно с начала tablespac'а.

Ну и естественно напрашивается решение для приложения: почему бы после каждого DROP TABLE не далать ALTER TABLESPACE ... COALESCE?
А вот здесь начинается настоящее шаманство: COALESCE не сливает эктенты, если вызывать его в процедуре с коммандами CREATE/DROP и именно только из SQL+'а.
Такой пример:

Это из под sys:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
SQL> CREATE OR REPLACE PROCEDURE COALESCE_TABLESPACE(TABLESPACE_NAME$ IN VARCHAR2) AS
   2    TABLESPACE_DOES_NOT_EXIST EXCEPTION;
   3    PRAGMA EXCEPTION_INIT(TABLESPACE_DOES_NOT_EXIST,- 00959 ); 
   4   BEGIN
   5    IF TABLESPACE_NAME$ IS NULL THEN
   6     RETURN;
   7    END IF;
   8    IF TABLESPACE_NAME$=TRIM('TEST_TDATA_TSPACE') THEN
   9     BEGIN
  10      EXECUTE IMMEDIATE 'ALTER TABLESPACE '||TABLESPACE_NAME$||' COALESCE';
  11      DBMS_OUTPUT.PUT_LINE('COALESCED OK');
  12     EXCEPTION 
  13      WHEN TABLESPACE_DOES_NOT_EXIST THEN NULL;
  14     END; 
  15    END IF; 
  16   END;
  17   /

Procedure created.

SQL> GRANT EXECUTE ON COALESCE_TABLESPACE TO TEST;

Grant succeeded.

SQL> ALTER TABLESPACE TEST_TDATA_TSPACE COALESCE;

Tablespace altered.

SQL> SELECT BLOCK_ID, BYTES, BLOCKS
   2   FROM DBA_FREE_SPACE
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

  BLOCK_ID      BYTES     BLOCKS
 ---------- ---------- ----------
 
          2    125820928        15359 


Все чинно, видим одим длинный экстент.

А это из под пользователя:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> BEGIN
   2    FOR Index1$ IN  1 .. 5  LOOP
   3     EXECUTE IMMEDIATE 
   4     '
  5     CREATE TABLE TEST'||Index1$||'
  6     (
  7     ID NUMBER(10),
  8     SomeParam VARCHAR2(10)
  9     )
 10     PCTFREE 10
 11     PCTUSED 80
 12    '; 
  13    END LOOP; 
  14    FOR Index1$ IN  1 .. 5  LOOP
  15     EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
  16    END LOOP;
  17    SYS.COALESCE_TABLESPACE('TEST_TDATA_TSPACE'); 
  18   END;
  19   /
COALESCED OK
PL/SQL procedure successfully completed.



"COALESCED OK" говорит о том, что экстенты слились, однако:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> SELECT BLOCK_ID, BYTES, BLOCKS
   2   FROM DBA_FREE_SPACE
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

  BLOCK_ID      BYTES     BLOCKS
 ---------- ---------- ----------
 
          2        81920           10 
         12        81920           10 
         22        81920           10 
         32        81920           10 
         42        81920           10 
         52    125411328        15309 


говорит о том, что хоть комманда ALTER TABLESPACE TEST_TDATA_TSPACE COALESCE хоть и отработалась, но экстенты не слились.

Поэтому вопрос третий: почему, черт возьми, не случилось того, что должно было случится - почему не слились экстенты.

Но, если я снова просто вызову SYS.COALESCE_TABLESPACE('TEST_TDATA_TSPACE') - то свободные экстенты благополучно сольются.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> BEGIN
   2    SYS.COALESCE_TABLESPACE('TEST_TDATA_TSPACE'); 
   3   END;
   4   /
COALESCED OK

PL/SQL procedure successfully completed.

SQL> SELECT BLOCK_ID, BYTES, BLOCKS
   2   FROM DBA_FREE_SPACE
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

  BLOCK_ID      BYTES     BLOCKS
 ---------- ---------- ----------
 
          2    125820928        15359 


И самое забавное, если верхнюю процедуру я вызову не из SQL+ а, например из SQL Navigator - то процедура обработается как надо. То есть экстенты сольются благополучно.
В чем, черт возьми, тут дело то?

PS - Oracle 8.1.7 без патчей и под Windows 2000 AdvServer
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174129
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай EXTENT MANAGEMENT LOCAL. При этом не требуется сращивания свободных экстентов.
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174189
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, софтбильдер, даже при

CREATE TABLESPACE TEST_TData_TSpace
DATAFILE 'TEST_TData_TSpace_DATA.DAT' SIZE 5M REUSE
AUTOEXTEND ON NEXT 5M
MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K;

происходит рост tablespace при многократном удалении-создании таблиц.
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174215
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты табличную область создаёшь из существующего файла. А в нём уже имеется какое-то определённое распределение экстентов. В данном случае нет чистоты экспериментов.
Создай новый.
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174231
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И попробуй сделать:
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174281
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, таже самая фигня.
EXTENT MANAGEMENT LOCAL AUTOALLOCATE - не помогает.

PS - я всегда дропал tablespace, потом удалял файл средствами ОС. Так что эксперимент чист. Видно нечист Оракл.
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174284
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А размеры таблиц какие?
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174311
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
None
Вот результаты тестов на моем
Код: plaintext
1.
2.
SQL*Plus: Release  9 . 2 . 0 . 1 . 0  - Production on Mon Jun  2   15 : 19 : 03   2003 

Copyright (c)  1982 ,  2002 , Oracle Corporation.  All rights reserved.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
 -------------------------------------------------------------------
 
 1 . SYS
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST';

 -------------------------------------------------------------------
 

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880         1280      5177344          1264 

 1  row selected.


no rows selected

 -------------------------------------------------------------------
 
 2 . TEST
 -------------------------------------------------------------------
 

BEGIN
   FOR Index1$ IN  1 .. 30  LOOP
    EXECUTE IMMEDIATE 
    '
     CREATE TABLE TEST'||Index1$||'
     (
     ID NUMBER(10),
     SomeParam VARCHAR2(10)
     )
     PCTFREE 10
     PCTUSED 80
    '; 
   END LOOP;
  END;
/

 -------------------------------------------------------------------
 

PL/SQL procedure successfully completed.

 -------------------------------------------------------------------
 
 3 . SYS
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880         1280      5177344          1264 

 1  row selected.


SEGMENT_NAME                                                                      SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
 --------------------------------------------------------------------------------- ------------------ ------------------------------ ---------- ---------- ----------
 
TEST28                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST25                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST26                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST27                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST13                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST14                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST15                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST16                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST21                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST22                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST23                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST24                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST9                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST10                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST11                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST12                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST17                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST18                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST19                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST20                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST5                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST6                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST7                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST8                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST1                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST2                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST3                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST4                                                                             TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST29                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 
TEST30                                                                            TABLE              TEST_TDATA_TSPACE                    65536           16            1 

 30  rows selected.


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                      497      3211264          784 

 1  row selected.

 -------------------------------------------------------------------
 
 4 . TEST
 -------------------------------------------------------------------
 

BEGIN
   FOR Index1$ IN  1 .. 30  LOOP
    EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
   END LOOP;
  END;
/

 -------------------------------------------------------------------
 

PL/SQL procedure successfully completed.

 -------------------------------------------------------------------
 
 5 . SYS
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 


TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880         1280      5177344          1264 

 1  row selected.


no rows selected


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                       17      5177344         1264 

 1  row selected.


Как видно Oracle честно освобождает все сегменты, а говорить надо именно про них. Ведь:
Код: plaintext
1.
2.
3.
Oracle9i Database Concepts
Release  1  ( 9 . 0 . 1 )
Part Number A88856- 02 
 3  - Data Blocks, Extents, and Segments

Код: plaintext
1.
2.
A segment is a set of extents, each of which has been allocated for a specific data structure and all of which are stored in the same tablespace. For example, each table's data is stored in its own data segment, while each index's data is stored in its own index segment.

Oracle allocates space for segments in units of one extent. When the existing extents of a segment are full, Oracle allocates another extent for that segment. Because extents are allocated as needed, the extents of a segment may or may not be contiguous on disk.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
A single data segment in an Oracle database holds all of the data for one of the following: 

A table that is not partitioned or clustered 

A partition of a partitioned table 

A cluster of tables 

Oracle creates this data segment when you create the table or cluster with the CREATE statement.


Итак, видно, что для каждой таблицы создается отдельный сегмент, размером в один экстент. Размер этого экстента зависит только от конкретных настроек твоей базы.

Вопрос в другом. Почему при удалении таблицы ее сегмент все же остается (первая выборка из DBA_FREE_SPACE) - это явный глюк. Т.е. видно, что весь сегмент пустой, но не понятно откуда вообще взялся тот сегмент, если таблицы уже нет.

Поэтому при создании новых таблиц выделяются сегменты из оставшегося свободного места, т.к. нет возможности создания сегмента по верх другого (обрати внимание на мои дампы - в обоих случаях выборка из DBA_FREE_SPACE вернула одну строку!!!)
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174406
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Итак, видно, что для каждой таблицы создается отдельный сегмент, размером в один экстент. Размер этого экстента зависит только от конкретных настроек твоей базы.

Согласен и не поддается сомнению.

>>Вопрос в другом. Почему при удалении таблицы ее сегмент все же остается (первая выборка из DBA_FREE_SPACE) - это явный глюк. Т.е. видно, что весь сегмент пустой, но не понятно откуда вообще взялся тот сегмент, если таблицы уже нет.

Итак, насколько я понимаю что творится при удалении:
1) Удалется таблица
2) Удаляются записи о ее экстентах во вьюшке DBA_EXTENTS
3) Эти записи переносятся в DBA_FREE_SPACE. DBA_FREE_SPACE - очевидно вьюшка, которая говорит ораклу о "дырах" свободного пространства в tablespac'e, которые позже можно заюзать.
Поэтому никакого глюка нет. Вопрос в другом, почему Оракл так криво использует для поиска свободных экстентов DBA_FREE_SPACE. Почему бы тупо не взять первый пустой подходящий по размеру экстент (так как написано в доке) - и разместить данные в нем. Нет же, выхватывает по одному ему ведомому алгоритму. Так же (наверно) и при EXTENT MANAGEMENT LOCAL - из битовой карты выхватывется не первый (напримр нулевой) бит, а хз какой.

>>Поэтому при создании новых таблиц выделяются сегменты из оставшегося свободного места, т.к. нет возможности создания сегмента по верх другого (обрати внимание на мои дампы - в обоих случаях выборка из DBA_FREE_SPACE вернула одну строку!!!)
Думаю это не верно. Сегмент - есль логическое объединение экстентов (таблица, индекс и прочее). А экстент - это непрерывный участок блоков - то биш физически живет на диске.
В общем я делаю вывод что в девятке все умнее и экстенты сливаются автоматом про DROP TABLE. Или у тебя просто у Вас EXTENT MANAGEMENT LOCAL - в нем всегда DBA_FREE_SPACE возвращает одну строку.

to softbuilder@inbox.ru
>>А размеры таблиц какие?
А какая разница то? В данном случае они пустые. Но даже пустые занимают по одному экстенту, что абсолютно естественно.
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174455
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так... Нашел 8.1.5 и провел на ней тест:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
 -------------------------------------------------------------------
 
 --1. SYS
 
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 


TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880          640      5234688           639 

 1  row selected.


no rows selected


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                        2      5234688          639 

 1  row selected.

 -------------------------------------------------------------------
 
 --2. TEST
 
 -------------------------------------------------------------------
 

BEGIN
   FOR Index1$ IN  1 .. 30  LOOP
    EXECUTE IMMEDIATE 
    '
     CREATE TABLE TEST'||Index1$||'
     (
     ID NUMBER(10),
     SomeParam VARCHAR2(10)
     )
     PCTFREE 10
     PCTUSED 80
    '; 
   END LOOP;
  END;
/

 -------------------------------------------------------------------
 

PL/SQL procedure successfully completed.

 -------------------------------------------------------------------
 
 --3. SYS
 
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 


TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880          640      5234688           639 

 1  row selected.


SEGMENT_NAME                                                                      SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
 --------------------------------------------------------------------------------- ------------------ ------------------------------ ---------- ---------- ----------
 
TEST21                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST22                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST23                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST16                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST17                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST18                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST19                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST20                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST1                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST2                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST3                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST4                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST5                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST6                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST7                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST8                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST9                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST10                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST11                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST12                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST13                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST14                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST15                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST24                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST25                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST26                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST27                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST28                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST29                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST30                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 

 30  rows selected.


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                      302      2777088          339 

 1  row selected.

 -------------------------------------------------------------------
 
 --4. TEST
 
 -------------------------------------------------------------------
 

BEGIN
   FOR Index1$ IN  1 .. 30  LOOP
    EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
   END LOOP;
  END;
/

 -------------------------------------------------------------------
 

PL/SQL procedure successfully completed.

 -------------------------------------------------------------------
 
 --5. SYS
 
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 


TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880          640      5234688           639 

 1  row selected.


no rows selected


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                        2        81920           10 
TEST_TDATA_TSPACE                       12        81920           10 
TEST_TDATA_TSPACE                       22        81920           10 
TEST_TDATA_TSPACE                       32        81920           10 
TEST_TDATA_TSPACE                       42        81920           10 
TEST_TDATA_TSPACE                       52        81920           10 
TEST_TDATA_TSPACE                       62        81920           10 
TEST_TDATA_TSPACE                       72        81920           10 
TEST_TDATA_TSPACE                       82        81920           10 
TEST_TDATA_TSPACE                       92        81920           10 
TEST_TDATA_TSPACE                      102        81920           10 
TEST_TDATA_TSPACE                      112        81920           10 
TEST_TDATA_TSPACE                      122        81920           10 
TEST_TDATA_TSPACE                      132        81920           10 
TEST_TDATA_TSPACE                      142        81920           10 
TEST_TDATA_TSPACE                      152        81920           10 
TEST_TDATA_TSPACE                      162        81920           10 
TEST_TDATA_TSPACE                      172        81920           10 
TEST_TDATA_TSPACE                      182        81920           10 
TEST_TDATA_TSPACE                      192        81920           10 
TEST_TDATA_TSPACE                      202        81920           10 
TEST_TDATA_TSPACE                      212        81920           10 
TEST_TDATA_TSPACE                      222        81920           10 
TEST_TDATA_TSPACE                      232        81920           10 
TEST_TDATA_TSPACE                      242        81920           10 
TEST_TDATA_TSPACE                      252        81920           10 
TEST_TDATA_TSPACE                      262        81920           10 
TEST_TDATA_TSPACE                      272        81920           10 
TEST_TDATA_TSPACE                      282        81920           10 
TEST_TDATA_TSPACE                      292        81920           10 
TEST_TDATA_TSPACE                      302      2777088          339 

 31  rows selected.


Прекрасно видно, что вместо одного свободного сегмента имеем 30 свободных сегментов от удаленных таблиц и сегмент остаточного свободного места.

А теперь фишка! При повторном прогоне этого же теста таблицы размещаются в тех же сегментах, что и их предшественники!!! Проверь :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
 -------------------------------------------------------------------
 
 --6. TEST
 
 -------------------------------------------------------------------
 

BEGIN
   FOR Index1$ IN  1 .. 10  LOOP
    EXECUTE IMMEDIATE 
    '
     CREATE TABLE TEST'||Index1$||'
     (
     ID NUMBER(10),
     SomeParam VARCHAR2(10)
     )
     PCTFREE 10
     PCTUSED 80
    '; 
   END LOOP;
  END;
/

 -------------------------------------------------------------------
 

PL/SQL procedure successfully completed.

 -------------------------------------------------------------------
 
 --7. SYS
 
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880          640      5234688           639 

 1  row selected.


SEGMENT_NAME                                                                      SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
 --------------------------------------------------------------------------------- ------------------ ------------------------------ ---------- ---------- ----------
 
TEST1                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST2                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST3                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST4                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST5                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST6                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST7                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST8                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST9                                                                             TABLE              TEST_TDATA_TSPACE                    81920           10            1 
TEST10                                                                            TABLE              TEST_TDATA_TSPACE                    81920           10            1 

 10  rows selected.


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                        2        81920           10 
TEST_TDATA_TSPACE                       12        81920           10 
TEST_TDATA_TSPACE                       22        81920           10 
TEST_TDATA_TSPACE                       32        81920           10 
TEST_TDATA_TSPACE                       62        81920           10 
TEST_TDATA_TSPACE                       72        81920           10 
TEST_TDATA_TSPACE                       82        81920           10 
TEST_TDATA_TSPACE                      112        81920           10 
TEST_TDATA_TSPACE                      122        81920           10 
TEST_TDATA_TSPACE                      172        81920           10 
TEST_TDATA_TSPACE                      182        81920           10 
TEST_TDATA_TSPACE                      192        81920           10 
TEST_TDATA_TSPACE                      202        81920           10 
TEST_TDATA_TSPACE                      212        81920           10 
TEST_TDATA_TSPACE                      222        81920           10 
TEST_TDATA_TSPACE                      232        81920           10 
TEST_TDATA_TSPACE                      242        81920           10 
TEST_TDATA_TSPACE                      252        81920           10 
TEST_TDATA_TSPACE                      282        81920           10 
TEST_TDATA_TSPACE                      292        81920           10 
TEST_TDATA_TSPACE                      302      2777088          339 

 21  rows selected.

 -------------------------------------------------------------------
 
 --8. TEST
 
 -------------------------------------------------------------------
 

BEGIN
   FOR Index1$ IN  1 .. 10  LOOP
    EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
   END LOOP;
  END;
/

 -------------------------------------------------------------------
 

PL/SQL procedure successfully completed.

 -------------------------------------------------------------------
 
 --9. SYS
 
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 


TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880          640      5234688           639 

 1  row selected.


no rows selected


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                        2        81920           10 
TEST_TDATA_TSPACE                       12        81920           10 
TEST_TDATA_TSPACE                       22        81920           10 
TEST_TDATA_TSPACE                       32        81920           10 
TEST_TDATA_TSPACE                       42        81920           10 
TEST_TDATA_TSPACE                       52        81920           10 
TEST_TDATA_TSPACE                       62        81920           10 
TEST_TDATA_TSPACE                       72        81920           10 
TEST_TDATA_TSPACE                       82        81920           10 
TEST_TDATA_TSPACE                       92        81920           10 
TEST_TDATA_TSPACE                      102        81920           10 
TEST_TDATA_TSPACE                      112        81920           10 
TEST_TDATA_TSPACE                      122        81920           10 
TEST_TDATA_TSPACE                      132        81920           10 
TEST_TDATA_TSPACE                      142        81920           10 
TEST_TDATA_TSPACE                      152        81920           10 
TEST_TDATA_TSPACE                      162        81920           10 
TEST_TDATA_TSPACE                      172        81920           10 
TEST_TDATA_TSPACE                      182        81920           10 
TEST_TDATA_TSPACE                      192        81920           10 
TEST_TDATA_TSPACE                      202        81920           10 
TEST_TDATA_TSPACE                      212        81920           10 
TEST_TDATA_TSPACE                      222        81920           10 
TEST_TDATA_TSPACE                      232        81920           10 
TEST_TDATA_TSPACE                      242        81920           10 
TEST_TDATA_TSPACE                      252        81920           10 
TEST_TDATA_TSPACE                      262        81920           10 
TEST_TDATA_TSPACE                      272        81920           10 
TEST_TDATA_TSPACE                      282        81920           10 
TEST_TDATA_TSPACE                      292        81920           10 
TEST_TDATA_TSPACE                      302      2777088          339 

 31  rows selected.


Это определенно глюк Oracle 8i. Сейчас залезу в доку именно по нему и посмотрю подробнее.

To be continued... :)
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174481
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Па-ба! Ту-ру-ру!!!
Смотри:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Oracle8i Concepts
Release  8 . 1 . 5 
A67781- 01 
 3  - Tablespaces and Datafiles[src]
[src]Space Management in Tablespaces 
Tablespaces allocate space in extents (see  "Extents" ). Tablespaces can use two different methods to keep track of their free and used space: 

extent management by the data dictionary (dictionary-managed tablespaces) 

extent management by the tablespace (locally-managed tablespaces) 

When you create a tablespace, you choose one of these methods of space management. You cannot alter the method at a later time. 

Dictionary-Managed Tablespaces 
For a tablespace that uses the data dictionary to manage its extents, Oracle updates the appropriate tables in the data dictionary whenever an extent is allocated or freed for reuse. Oracle also stores rollback information about each update of the dictionary tables. (See  "Rollback Segments" .) Because dictionary tables and rollback segments are part of the database, the space that they occupy is subject to the same space management operations as all other data. 

This is the default method of space management in a tablespace. It was the only method available in Oracle releases  8 . 0  and earlier. 

Locally-Managed Tablespaces 
A tablespace that manages its own extents maintains a bitmap in each datafile to keep track of the free or used status of blocks in that datafile. Each bit in the bitmap corresponds to a block or a group of blocks. When an extent is allocated or freed for reuse, Oracle changes the bitmap values to show the new status of the blocks. These changes do not generate rollback information because they do not update tables in the data dictionary (except for special cases such as tablespace quota information). 

Locally-managed tablespaces have the following advantages over dictionary-managed tablespaces: 

Local management of extents avoids recursive space management operations, which can occur in dictionary-managed tablespaces if consuming or releasing space in an extent results in another operation that consumes or releases space in a rollback segment or data dictionary table. 

Local management of extents automatically tracks adjacent free space, eliminating the need to coalesce free extents. 

The sizes of extents that are managed locally can be determined automatically by the system. Alternatively, all extents can have the same size in a locally-managed tablespace. See  "Extents Managed Locally"  for more information. 

The LOCAL option of the EXTENT MANAGEMENT clause specifies this method of space management in various CREATE commands: 

For the SYSTEM tablespace, you can specify EXTENT MANGEMENT LOCAL in the CREATE DATABASE command. If the SYSTEM tablespace is locally managed, other tablespaces in the database can be dictionary-managed but you must create all rollback segments in locally-managed tablespaces. 

For a permanent tablespace other than SYSTEM, you can specify EXTENT MANGEMENT LOCAL in the CREATE TABLESPACE command.


Вот ключевая фраза:
Dictionary-Managed Tablespaces
This is the default method of space management in a tablespace. It was the only method available in Oracle releases 8.0 and earlier.

Проверяем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
 -------------------------------------------------------------------
 
 --1. SYS
 
 -------------------------------------------------------------------
 

CREATE TABLESPACE TEST_TData_TSpace_LA
DATAFILE 'TEST_TData_TSpace_DATA_LA.DAT' SIZE 5M REUSE
AUTOEXTEND ON NEXT 5M
MAXSIZE UNLIMITED 
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

CREATE USER TEST_LA IDENTIFIED BY test_la
DEFAULT TABLESPACE TEST_TData_TSpace_LA;

GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE, QUERY REWRITE, CREATE TABLE, CREATE TYPE TO TEST_LA;

 -------------------------------------------------------------------
 

Tablespace created.


User created.


Grant succeeded.

 -------------------------------------------------------------------
 
 --2. SYS
 
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE_LA';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST_LA';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE_LA' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE_LA               5242880          640      5177344           632 

 1  row selected.


no rows selected


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE_LA                     9      5177344          632 

 1  row selected.

 -------------------------------------------------------------------
 
 --3. TEST_LA
 
 -------------------------------------------------------------------
 

BEGIN
   FOR Index1$ IN  1 .. 30  LOOP
    EXECUTE IMMEDIATE 
    '
     CREATE TABLE TEST'||Index1$||'
     (
     ID NUMBER(10),
     SomeParam VARCHAR2(10)
     )
     PCTFREE 10
     PCTUSED 80
    '; 
   END LOOP;
  END;
/

 -------------------------------------------------------------------
 

PL/SQL procedure successfully completed.

 -------------------------------------------------------------------
 
 --4. SYS
 
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE_LA';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST_LA';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE_LA' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 


TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE_LA               5242880          640      5177344           632 

 1  row selected.


SEGMENT_NAME                                                                      SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS    EXTENTS
 --------------------------------------------------------------------------------- ------------------ ------------------------------ ---------- ---------- ----------
 
TEST21                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST22                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST23                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST24                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST25                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST26                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST27                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST28                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST29                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST30                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST11                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST12                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST13                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST14                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST15                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST16                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST17                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST18                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST19                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST20                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST1                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST2                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST3                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST4                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST5                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST6                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST7                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST8                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST9                                                                             TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 
TEST10                                                                            TABLE              TEST_TDATA_TSPACE_LA                 65536            8            1 

 30  rows selected.


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE_LA                   249      3211264          392 

 1  row selected.

 -------------------------------------------------------------------
 
 --5. TEST
 
 -------------------------------------------------------------------
 

BEGIN
   FOR Index1$ IN  1 .. 30  LOOP
    EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
   END LOOP;
  END;
/

 -------------------------------------------------------------------
 

PL/SQL procedure successfully completed.

 -------------------------------------------------------------------
 
 --6. SYS
 
 -------------------------------------------------------------------
 

SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
FROM DBA_DATA_FILES 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE_LA';

select SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
from DBA_SEGMENTS
where owner='TEST_LA';

SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
FROM DBA_FREE_SPACE 
WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE_LA' ORDER BY BLOCK_ID;

 -------------------------------------------------------------------
 


TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE_LA               5242880          640      5177344           632 

 1  row selected.


no rows selected


TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE_LA                     9      5177344          632 

 1  row selected.


Итог: нефиг использовать Dictionary-Managed Tablespaces, которые являются default в 8i! Переходи на Locally-Managed Tablespaces - default в 9i.

Так что это может быть и глюк, но так как он документирован, то перерастает в фичу :)
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174578
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Fedorchenko Aleksey:

Алексей, еще раз повторюсь - нету здесь накакого бага. Все аккуратно. А баг вот в чем, и пусть большие люди мне объяснят почему такое происходит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SQL> SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
   2   FROM DBA_DATA_FILES 
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880          640      5234688           639 

То есть имею размер tablespace-а 5Метров.

Из-под юзера делаю следующее:

BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'CREATE TABLE TEST'||Index1$||' ( ID NUMBER(10), SomeParam VARCHAR2(10) ) PCTFREE 10 PCTUSED 80';	 END LOOP;	END;
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$; END LOOP; END; 
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'CREATE TABLE TEST'||Index1$||' ( ID NUMBER(10), SomeParam VARCHAR2(10) ) PCTFREE 10 PCTUSED 80';	 END LOOP;	END;
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$; END LOOP; END; 
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'CREATE TABLE TEST'||Index1$||' ( ID NUMBER(10), SomeParam VARCHAR2(10) ) PCTFREE 10 PCTUSED 80';	 END LOOP;	END;
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$; END LOOP; END; 
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'CREATE TABLE TEST'||Index1$||' ( ID NUMBER(10), SomeParam VARCHAR2(10) ) PCTFREE 10 PCTUSED 80';	 END LOOP;	END;
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$; END LOOP; END; 
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'CREATE TABLE TEST'||Index1$||' ( ID NUMBER(10), SomeParam VARCHAR2(10) ) PCTFREE 10 PCTUSED 80';	 END LOOP;	END;
/
BEGIN FOR Index1$ IN  1 .. 30  LOOP EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$; END LOOP; END; 
/
Просто пать раз создаю 30 таблиц и удаляю. Смотрю системные вьюшки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS 
   2   FROM DBA_DATA_FILES 
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                  5242880          640      5234688           639 


Все осталось по прежнему! И другая виюшка, фри-спэйсная:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SQL> SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
   2   FROM DBA_FREE_SPACE 
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                        2        81920           10 
TEST_TDATA_TSPACE                       12        81920           10 
TEST_TDATA_TSPACE                       22        81920           10 
TEST_TDATA_TSPACE                       32        81920           10 
TEST_TDATA_TSPACE                       42        81920           10 
TEST_TDATA_TSPACE                       52        81920           10 
TEST_TDATA_TSPACE                       62        81920           10 
TEST_TDATA_TSPACE                       72        81920           10 
TEST_TDATA_TSPACE                       82        81920           10 
TEST_TDATA_TSPACE                       92        81920           10 
TEST_TDATA_TSPACE                      102        81920           10 
TEST_TDATA_TSPACE                      112        81920           10 
TEST_TDATA_TSPACE                      122        81920           10 
TEST_TDATA_TSPACE                      132        81920           10 
TEST_TDATA_TSPACE                      142        81920           10 
TEST_TDATA_TSPACE                      152        81920           10 
TEST_TDATA_TSPACE                      162        81920           10 
TEST_TDATA_TSPACE                      172        81920           10 
TEST_TDATA_TSPACE                      182        81920           10 
TEST_TDATA_TSPACE                      192        81920           10 
TEST_TDATA_TSPACE                      202        81920           10 
TEST_TDATA_TSPACE                      212        81920           10 
TEST_TDATA_TSPACE                      222        81920           10 
TEST_TDATA_TSPACE                      232        81920           10 
TEST_TDATA_TSPACE                      242        81920           10 
TEST_TDATA_TSPACE                      252        81920           10 
TEST_TDATA_TSPACE                      262        81920           10 
TEST_TDATA_TSPACE                      272        81920           10 
TEST_TDATA_TSPACE                      282        81920           10 
TEST_TDATA_TSPACE                      292        81920           10 
TEST_TDATA_TSPACE                      302      2777088          339 

 31  rows selected.

Откуда видно, что Оракл размещает таблицы аккурат на место свободных экстентов. (Даже полсе 5 проходов. Очевидно что и после 1000 все будет также). А как он там это уж делает - черт с ним. Главное остается в пределах заданного пространства.


А теперь забава. Оракл утирает мне нос:
Для читоты сливаю экстенты:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> alter tablespace TEST_TDATA_TSPACE COALESCE;

Tablespace altered.

SQL> SELECT TABLESPACE_NAME, BLOCK_ID, BYTES, BLOCKS 
   2   FROM DBA_FREE_SPACE 
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE' ORDER BY BLOCK_ID;

TABLESPACE_NAME                  BLOCK_ID      BYTES     BLOCKS
 ------------------------------ ---------- ---------- ----------
 
TEST_TDATA_TSPACE                        2      5234688          639 


И запускаю процедуру, которая казалось бы ничем не отличается от верхних 10 блоков:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> BEGIN
   2    FOR Index2$ IN  1 .. 5  LOOP
   3     FOR Index1$ IN  1 .. 30  LOOP
   4      EXECUTE IMMEDIATE 
   5      '
  6      CREATE TABLE TEST'||Index1$||'
  7      (
  8      ID NUMBER(10),
  9      SomeParam VARCHAR2(10)
 10      )
 11      PCTFREE 10
 12      PCTUSED 80
 13     '; 
  14     END LOOP; 
  15     FOR Index1$ IN  1 .. 30  LOOP
  16      EXECUTE IMMEDIATE 'DROP TABLE TEST'||Index1$;
  17     END LOOP;
  18    END LOOP; 
  19   END;
  20   /

PL/SQL procedure successfully completed.


Смотрю место:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> SELECT TABLESPACE_NAME, BYTES, BLOCKS, USER_BYTES, USER_BLOCKS
   2   FROM DBA_DATA_FILES 
   3   WHERE TABLESPACE_NAME='TEST_TDATA_TSPACE';

TABLESPACE_NAME                     BYTES     BLOCKS USER_BYTES USER_BLOCKS
 ------------------------------ ---------- ---------- ---------- -----------
 
TEST_TDATA_TSPACE                 15728640         1920     15720448          1919 

Файл раздулся до 15Мегов.

ИТОГ: В пределах одного PL/SQL блока вновь созданные объекты (таблицы, индексы), могут размещаться только выше последнего выделенного экстента.
ЧТД писать совсем не хочется. Потому, что нужно много что переписывать.
Аминь.
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174854
X-Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть еще одна тонкая фишка: если на tablespace в default storage (pctincrease N) N>0, то процесс SMON будет сам сливать свободные экстенты.
Почему он не делает этого при pctincrease = 0? Логика тут железная: если pctincrease = 0, то считается, что в этом tablespace все экстенты имеют одинаковый размер, т.е. сегменты могут без проблем пользоваться освобожденными экстентами друг друга без всяких там слияний, и, соответственно, сливать освобожденные экстенты незачем. Естественно, в этом случае любые отклонения storage для отдельных экстентов от default параметров tablespace приводят.. к тому, к чему они приводят.
Если pctincrease = 1 (например), то smon будет периодически просыпаться и собирать свободное место. ВОВСЕ НЕ ФАКТ, что он проснется тогда, когда надо, и успеет вовремя. По этому поводу есть какие-то недокументированные параметры (на память не помню).
Вполне возможно, что в последнем блоке после удаления таблиц надо было разбудить smon, и все бы отработало. Вот тут кое-что объясняется: http://www.dbazine.com/hordila3.html.
Просто в Oracle никто не подумал, что кто-то попробует сделать 1000 create/drop table в секунду :-)
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174955
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
None
еще раз повторюсь - нету здесь накакого бага. Все аккуратно.
Ну да, если используется Dictionary-Managed Tablespaces, то это действительно "аккуратно" - не всегда сегмент из-под таблицы присоединяется к сегменту неиспользованного пространства. В случае с Locally-Managed Tablespaces не остаются пустые сегменты после таблиц - создается одно нефрагментированное свободное пространство. Это можно отнести к особенностям управления распределения места в табличных пространствах.

ИТОГ: В пределах одного PL/SQL блока вновь созданные объекты (таблицы, индексы), могут размещаться только выше последнего выделенного экстента.
Похоже, что так. Причем это актуально и для Locally-Managed Tablespaces - в 30 циклах создания/удаления 30 таблиц файл разросся до 60 Мб, хотя по завершении теста табличное пространство было пустым. Это похоже на багофичу :(

X-Max
Вот тут кое-что объясняется
Интересная статья, только она применима к ручной сборке на Dictionary-Managed Tablespaces, а как показали опыты и на Locally-Managed Tablespaces виден рост табличного пространства, хотя там если память освобождается, то она сразу без помощи SMON возвращается Oracle как свободная.

Да... Надо бы у Тома спросить :)
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32174970
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем вывод такой из всей этой бадяги - нех... создавать таблицы в PL/SQL.
А делать по человечески в скриптах.
...
Рейтинг: 0 / 0
Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
    #32177984
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИТОГ: В пределах одного PL/SQL блока вновь созданные объекты (таблицы, индексы), могут размещаться только выше последнего выделенного экстента.

Похоже, что так. Причем это актуально и для Locally-Managed Tablespaces - в 30 циклах создания/удаления 30 таблиц файл разросся до 60 Мб, хотя по завершении теста табличное пространство было пустым. Это похоже на багофичу :(


Вполне, кстати, ожидаемая. После чтения о ... freelists! Там примерно тоже самое -- блоки, которые освободила сессия, становятся доступными другим только по окончании транзакции.

Кстати, о кратности числа блоков пяти -- это вполне описанная фича. Если не ошибаюсь, в девятке её пофиксили.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопросы о том, как Оракл ищет/выделяет экстенты. И COALESCE впридачу.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]