Как дефрагментировать табличное пространство

_Ildar_
Дата: 29.07.2005 19:01:19
Дорый день уважаемые!

В этом вопросе я пока не рублю. Прошу помощи. ПАМАГИТЕ КТО МОЖЕТ !
Работаю на Oracle 8.1.7. под W2k SP4.

Слышал, что есть самый эффективный способ дефрагментации :
1) Сливать все содержимое БД в файл экспорта
2) Создать заново экземпляар БД
3) Заливать импортом все объекты одним экстентом

Таблицы откликаются быстро.

Еще есть Enterprise Manager. Он может дефрагментировать табличное пространство на подобие Norton Disk Doctor - знаете! Но его использовать не получается, не могу запустить на серваке нужный процесс.

Как можно выполнить дефрагментацию с помощью внешнего приложения, (exe-шник) который дефрагментировал бы мне табличное пространство ?

Хотелось бы получить один экстент, в случае как с экспортом/импортом !

Реально ли это ?

Или как можно максимально дефрагментировать табличное пространство ?

СПАСИБА !
Partos
Дата: 29.07.2005 19:17:02
alter table move
alter index rebuild
123
Дата: 29.07.2005 19:19:33
Use Quest Space Manager
Александр Соколов
Дата: 29.07.2005 19:23:17
Том Кайт
Для того чтобы дефрагментировать табличное пространство, администратору базы данных приходилось сначала экспортировать набор объектов, затем удалить их и после этого импортировать. Администраторы базы данных тратили много времени на регулярное выполнение такой процедуры. Хотя на самом деле не требовалось делать это больше одного раза, а в большинстве случаев — вообще не нужно. Одноразового выполнения этой процедуры было достаточно, чтобы продумать более эффективную организацию хранения, позволяющую избежать фрагментации. В большинстве случаев, однако, никто ничего не менял, и история неизбежно повторялась. В некоторых случаях это делали, поскольку слышали, что "это необходимо", хотя в их случае этого можно было избежать.
Более того, подобное использование утилит EXP/IMP было небезопасно. Вы берете все данные из базы данных, удаляете их, а затем снова вставляете. Определенный промежуток времени данные не защищаются СУБД. Есть опасность, что утилита IMP не сработает (это ведь просто программа). Есть также опасность изменения данных при экспортировании (эти изменения в файл экспорта не попадут) и потери этих изменений. Можно потерять права доступа к объектам и т.д. Все это требует серьезного планирования и приостановки работы на длительное время. В Oracle8i нет необходимости использовать утилиты ЕХР/IМР для реорганизации данных. Если вы действительно думаете, что это нужно (а я свято верю, что делать это надо не более одного раза для исправления неудачной реализации), то можно использовать оператор ALTER TABLE MOVE для переноса таблиц из одного табличного пространства в другое. В ходе такой реорганизации таблица будет доступна для запросов, но не для изменений. Сразу же после переноса индексы становятся недействительными и надо их пересоздать, так что на это время производительность запросов снизится. Но время простоя будет существенно меньше, чем при использовании утилит EXP/IMP, причем ни одной из перечисленных выше проблем не возникает; данные все время защищены СУБД, нет угрозы потери или изменения данных, процесс не затрагивает привилегии и т.д.
В заключение еще раз подчеркну: дни EXP/IMP как средства реорганизации данных сочтены. Даже не пытайтесь использовать их для этой цели.
_Ildar_
Дата: 29.07.2005 19:23:51
А как на счет

truncate table <Имя_таблицы> ?

Это усекает таблицу ? Как вообще работает этак команда ?
Какова эффективность ? В каком случае можно ее применять ?
Александр Соколов
Дата: 29.07.2005 19:30:18
Том Кайт
усечен.
Отметка максимального уровня важна, поскольку сервер Oracle при полном просмотре будет сканировать все блоки до этой отметки, даже если они не содержат данных. Это скажется на скорости выполнения полного просмотра, особенно если большая часть блоков до отметки максимального уровня — пустые. Чтобы убедиться в этом, просто создайте таблицу из 1000000 (или другого большого количества) строк. Выполните запрос SELECT COUNT(*) к этой таблице. Теперь удалите все строки таблицы и убедитесь, что запрос SELECT COUNT(*), не возвращающий строк, работает так же долго, как и в случае возвращения 1000000 строк. Так происходит потому, что сервер Oracle просматривает все блоки до отметки максимального уровня в поисках данных. Сравните это с результатом применения оператора TRUNCATE. При выполнении TRUNCATE отметка максимального уровня будет сброшена "в ноль". Если предполагается удаление всех строк таблицы, именно по этой причине надо использовать оператор TRUNCATE.
_Ildar_
Дата: 29.07.2005 19:30:20
Александр Соколов
Том Кайт

В заключение еще раз подчеркну: дни EXP/IMP как средства реорганизации данных сочтены. Даже не пытайтесь использовать их для этой цели.


Я не хочу использовать механизм EXP/IMP. Действительно это занимает много времени.
У нас работает база ПАРУС 8.5.1.

Хотелось бы узнать как можно дефрагментировать базу без такого механизма ?
_Ildar_
Дата: 29.07.2005 19:34:43
Александр Соколов
Том Кайт
усечен.
Отметка максимального уровня важна, поскольку сервер Oracle при полном просмотре будет сканировать все блоки до этой отметки, даже если они не содержат данных. Это скажется на скорости выполнения полного просмотра, особенно если большая часть блоков до отметки максимального уровня — пустые. Чтобы убедиться в этом, просто создайте таблицу из 1000000 (или другого большого количества) строк. Выполните запрос SELECT COUNT(*) к этой таблице. Теперь удалите все строки таблицы и убедитесь, что запрос SELECT COUNT(*), не возвращающий строк, работает так же долго, как и в случае возвращения 1000000 строк. Так происходит потому, что сервер Oracle просматривает все блоки до отметки максимального уровня в поисках данных. Сравните это с результатом применения оператора TRUNCATE. При выполнении TRUNCATE отметка максимального уровня будет сброшена "в ноль". Если предполагается удаление всех строк таблицы, именно по этой причине надо использовать оператор TRUNCATE.


А если в таблице остаются записи.... truncate можно использовать ? Эффект будет ?
nata1111
Дата: 29.07.2005 19:43:51
_Ildar_

А если в таблице остаются записи.... truncate можно использовать ? Эффект будет ?

о да! эффект будет. Нет данных - нет дефрагментации :)
Александр Соколов
Дата: 29.07.2005 19:50:15
_Ildar_
Хотелось бы получить один экстент, в случае как с экспортом/импортом !


А зачем? Кроме головной боли вы ничего не приобретете... См. http://www.sql.ru/forum/actualthread.aspx?tid=203583.