Шаг 23 - Основные компоненты БД Oracle - Пользовательские объекты БД

Вот, наконец, с системными, объектами мы немного разобрались, теперь пора переходить к объектам, которые имеют названия "пользовательские объекты БД". Пользовательские объекты это те объекты, которые содержатся в контексте БД, собственно для них сама БД и создавалась. Этот тип объектов не находится в исключительном ведении самой БД, а скорее в ведении пользователей самой БД. К такого рода объектам в частности, относятся и файлы данных, так как при создании табличных пространств, создаются и файлы данных, но файлы данных являются так же "физическими объектами БД", об этом не следует забывать. Итак, рассмотрим первое понятие - "файлы данных".

Файл данных БД, представляет собой реальный файл, операционной системы. Он доступен для просмотра, но выполнять с ним какие либо действия рекомендуется только с помощью средств БД! Файлы данных хранят "табличные пространства", что это такое чуть позже, а пока скажу только, что один файл данных хранит только одно "табличное пространство"! А создаются файлы данных с помощью, команд CREATE TABLESPACE и ALTER TABLESPACE. Размер, этих файлов определяется при создании и может быть изменен в процессе работы, как в сторону увеличения, так и в сторону уменьшения, но не меньше чем объем данных, которые в нем находятся! Так же, если вы создали файл данных (объявив новое табличное пространство), скажем 20Мгб, то файл и будет размером 20Мгб, не смотря на то, что будет в нем, таблица с одной строкой или с миллионом строк! Просмотреть все файлы данных ("табличные пространства") можно заглянув в каталог, C:\Oracle\ORADATA\proba, все файлы с расширением dbf и есть файлы данных или "табличные пространства". Либо можно дать, такой запрос в SQL*Plus, естественно войдя пользователем SYSTEM с паролем MANAGER:

SQL> SELECT tablespace_name, file_name, bytes
  2  FROM dba_data_files
  3  ORDER BY tablespace_name, file_name
  4  /

TABLESPACE_NAME                FILE_NAME                                                    BYTES
------------------------------ ------------------------------------------------------------ ----------
INDX                           C:\ORACLE\ORADATA\PROBA\INDX01.DBF                            2097152
OEM_REPOSITORY                 C:\ORACLE\ORADATA\PROBA\OEMREP01.DBF                          5242880
RBS                            C:\ORACLE\ORADATA\PROBA\RBS01.DBF                             26214400
SYSTEM                         C:\ORACLE\ORADATA\PROBA\SYSTEM01.DBF                          146800640
TEMP                           C:\ORACLE\ORADATA\PROBA\TEMP01.DBF                            2097152
USERS                          C:\ORACLE\ORADATA\PROBA\USERS01.DBF                           3145728

6 rows selected

Отсюда хорошо видно, что мы имеем 6-ть файлов данных, или - "табличные пространства".

Итак, что это такое? Это собственно и есть те самые файлы данных, основные табличные пространства, которые создаются при автоматической установке БД, хорошо видно из предыдущего запроса, а именно:

23_1.gif (1301 b)

  1. SYSTEM - хранит все словари данных и системные объекты.
  2. USERS - для хранения пользовательских объектов.
  3. INDX - табличное пространство для организации индексов БД.
  4. RBS - табличное пространство сегментов отката.

Вспомогательные:

Данная классификация весьма не полная, но пока это, для того чтобы было понятнее. Табличные пространства, это еще одна сущность сервера БД Oracle. То есть вся система собственно и базируется на табличных пространствах. Их основное отличие от файлов данных, это то, что табличное пространство может содержать несколько файлов данных, по этому не путайте эти два понятия! Табличное пространство, следуя строгим определениям, не что иное, как логическая структура, используемая для группировки данных с однотипными методами доступа. Надеюсь это понятно. Так же табличные пространства, это основные объекты операций резервного копирования и восстановления. Кстати, есть скептики, которые считают, что разделение табличных пространств на отдельные файлы системы не очень хорошо, но с этим можно поспорить, если учитывать физическую структуру БД. Хотя в таких БД как InterBase, Access, все хранится в одном физическом файле. Но это не всегда оправдывает себя. И структура организации табличных пространств группой файлов все же имеют свое преимущество. Так же, данные о табличных пространствах можно получить с помощью такого запроса:

SQL> SELECT a.TABLESPACE_NAME, a.PCT_INCREASE, a.STATUS
  2  FROM DBA_TABLESPACES a
  3  ORDER BY TABLESPACE_NAME
  4  /

TABLESPACE_NAME                PCT_INCREASE STATUS
------------------------------ ------------ ---------
INDX                                     50 ONLINE
OEM_REPOSITORY                           50 ONLINE
RBS                                      50 ONLINE
SYSTEM                                   50 ONLINE
TEMP                                     50 ONLINE
USERS                                    50 ONLINE

6 rows selected

Как видите, мы снова, воспользовались, словарем данных, который так же хранится в табличном пространстве SYSTEM. Надеюсь теперь понятно, что же такое табличное пространство. :)

Теперь - "расширения" (extents). Сформулирую сразу. Расширения - это объекты информационной структуры данных, образованные непрерывными блоками БД Oracle, одним или несколькими. Так как каждый сегмент БД состоит из одного или нескольких расширения, "экстентов". Скажу прямо, у меня долго был туман в голове, прежде чем я все-таки понял, что такое расширение. Во-первых, что такое "сегмент", забегая чуть вперед, (это приходится делать постоянно, так как без этого не обойтись!) это созданный пользователем объект БД, а именно таблица, процедура, функция и т.д. Каждый сегмент, имеет одно или несколько расширений, количество расширений для сегмента БД, зависит от параметра CREATE. Так вот объясняю понятнее. Допустим, вы создавали таблицу учета избирателей по округу. Вы создали таблицу, затем стали заливать в нее данные, что-то получилось, что-то не получилось. Вы добавляли записи, удаляли, меняли, структуру таблицы и т.д. в результате у вас получился полный хаос в табличном пространстве, ваша таблица, по мере заполнения и создания, стала занимать скажем 1000000 блоков, в пяти расширениях. Если эта таблица, после того как вы закончили имеет, скажем, 2000000 записей, но находится в таком плачевном состоянии, то сделать к ней производительный запрос вряд ли удастся, если ее даже оптимизировать и проиндексировать. Я поступал так. После того, как моя таблица была готова, я создавал, новое табличное пространство и заливал туда мою готовую таблицу в результате все ложилось, одним расширением ("экстентом")! То есть таблица не имела рваных блоков и расширений. Что собственно неизбежно при создании. Сейчас есть более элегантные методы "переукладки" табличного пространства, например, в Oracle 9i такое средство администрирования, как Enterprise Manager может оптимизировать табличное пространство, как speeddisk в Windows! Но как это делается "ручками" тоже полезно знать, если вы истинный администратор БД! Вот собственно, что такое "расширение":

23_2.gif (1842 b)

Вот такое приближенное изображение РАСШИРЕНИЯ в структуре БД. Так же если, дать запрос вот такого вида, то можно получить характеристику расширений для пользователя MILLER. Здесь к стати сразу ясно, что такое SEGMENT! Именно то, что я и говорил раньше:

SQL> SELECT a.OWNER, a.SEGMENT_NAME, a.SEGMENT_TYPE, a.TABLESPACE_NAME,
  2  a.EXTENT_ID, a.BLOCK_ID, a.BYTES
  3  FROM DBA_EXTENTS a
  4  WHERE OWNER = 'MILLER'
  5  /

OWNER    SEGMENT_NAME     SEGMENT_TYPE       TABLESPACE_NAME     EXTENT_ID  BLOCK_ID  BYTES
-------  --------------   ----------------   ------------------  ---------  --------  -------- 
MILLER   CUSTOMERS        TABLE              USERS                       0       837  81920
MILLER   OFFICES          TABLE              USERS                       0       997  81920
MILLER   ORDERS           TABLE              USERS                       0      1077  81920
MILLER   PRODUCTS         TABLE              USERS                       0      1157  81920
MILLER   SALESREPS        TABLE              USERS                       0      1237  81920
MILLER   SYS_C001257      INDEX              USERS                       0       797  81920
MILLER   SYS_C001258      INDEX              USERS                       0       877  81920
MILLER   SYS_C001259      INDEX              USERS                       0       957  81920
MILLER   SYS_C001263      INDEX              USERS                       0      1037  81920
MILLER   SYS_C001264      INDEX              USERS                       0      1117  81920

10 rows selected

Пока с этим все. В следующий раз займемся в плотную сегментами БД.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 02.09.2003