Вот, наконец, с системными, объектами мы немного разобрались, теперь пора переходить к объектам, которые имеют названия "пользовательские объекты БД". Пользовательские объекты это те объекты, которые содержатся в контексте БД, собственно для них сама БД и создавалась. Этот тип объектов не находится в исключительном ведении самой БД, а скорее в ведении пользователей самой БД. К такого рода объектам в частности, относятся и файлы данных, так как при создании табличных пространств, создаются и файлы данных, но файлы данных являются так же "физическими объектами БД", об этом не следует забывать. Итак, рассмотрим первое понятие - "файлы данных".
Файл данных БД, представляет собой реальный файл, операционной системы. Он доступен для просмотра, но выполнять с ним какие либо действия рекомендуется только с помощью средств БД! Файлы данных хранят "табличные пространства", что это такое чуть позже, а пока скажу только, что один файл данных хранит только одно "табличное пространство"! А создаются файлы данных с помощью, команд 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-ть файлов данных, или - "табличные пространства".
Итак, что это такое? Это собственно и есть те самые файлы данных, основные табличные пространства, которые создаются при автоматической установке БД, хорошо видно из предыдущего запроса, а именно:
Вспомогательные:
Данная классификация весьма не полная, но пока это, для того чтобы было понятнее. Табличные пространства, это еще одна сущность сервера БД 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! Но как это делается "ручками" тоже полезно знать, если вы истинный администратор БД! Вот собственно, что такое "расширение":
Вот такое приближенное изображение РАСШИРЕНИЯ в структуре БД. Так же если, дать запрос вот такого вида, то можно получить характеристику расширений для пользователя 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
Пока с этим все. В следующий раз займемся в плотную сегментами БД.