Переименовать таблицу oracle


Выпуск 39 Уважаемые подписчики рассылки! Может, кто-то из вас хотел бы порекламировать результаты своего труда или компанию, в которой работает? Выпуски рассылки читают уже около 6000 человек, а сайт ежедневно посещают до переименовать таблицу oracle человек, в основном, из России и Украины. Хотя, по поисковым запросам и "зарубежных" посетителей бывает немало. Главное - это почти стопроцентно целевая аудитория: разработчики приложений, администраторы баз данных и вообще все, так или иначе интересующиеся технологиями Oracle и базами данных. Перенос таблицы в другое табличное пространство Этот выпуск посвящен сравнению эффективности различных способов переноса таблицы в другое табличное пространство. По мотивам ответа на вопрос, первоначально заданный еще в апреле 2001 года. Как выполняется alter table. Это можно делать в оперативном режиме online и без журнализации с опцией nologging. Но как данные переностяся из одного табличного пространства в другое? Приходится ли серверу формировать операторы insert и передавать данные через буферный кэш как при обычной вставке или происходит что-то типа непосредственной вставки? Я столкнулся со следующей проблемой, для которой хотел бы найти быстрый способ решения: Есть переименовать таблицу oracle размером 2,5 Гбайта. Я хочу перенести ее из табличного пространства a в b. Переименовать таблицу oracle файлы a и b разбиты на полосы и находятся на разных дисках. Эта таблица - независима. Я имею ввиду, что для нее не заданы триггеры и ограничения целостности. Какой сопособ будет работать быстрее, и почему? Допускает ли первый способ распараллеливание? Булет ли существенная разница в использовании сегмента отката и пространства для сортировки? Ответ Тома Кайта Действие move в оперативном режиме может выполняться ТОЛЬКО для таблицы, организованной по индексу index organized table - IOTпереименовать таблицу oracle не для обычной таблицы, организованной в виде кучи. Имеет смысл делать так: alter table T nologging; чтобы изменения таблицы не записывались в журнал alter table T move tablespace b; alter table T logging; чтобы восстановить журнализацию Оператор alter table t move tablespace b nologging; перенесет таблицу с журнализацией, если она была установленаа затем установит атрибут nologging. При выполнении move для переноса таблицы SQL не используется. Никакие вставки не выполняются. Такой перенос хорош тем, что все индексы, привилегии и т. Необходимо только перестроить но не пересоздать индексы после переноса. Но для этого вам придется больше потрудиться. Для таблицы размером 2,5 Гбайт я не уверен, что оно того стоит - может потребоваться больше времени на разработку процедуры переноса, чем на сам перенос. Перенос табличного пространства с опцией nologging В Oracle Переименовать таблицу oracle Edition 8. А в версии Oracle 8. В том контексте, где вы использовали его выше, вы попросили перенос выполнять без журнализации, если объект допускает работу без журналлизации. Как всегда, понять это поможет пример. Итак, есть тестовая таблица. Эту команду можно на русском языке сформулировать так: "Перенести таблицу T в табличное пространство users, и, кстати, если можно, БЕЗ ЖУРНАЛИЗАЦИИ". В частности, эта команда НЕ говорит: "Перенести таблицу изменить режим журнализации". Мы перенесли объект без журнализации всех изменений. Если происходит сбой базы данных и придется восстанавливать ее после использования nologging для переноса, можно ли будет восстановить это действие.? А после восстановления будет ли тавблица в исходном табличном пространстве? Ответ Тома Кайта Это зависит от причины сбоя и других обстоятельств. После выполнения НЕ ЖУРНАЛИЗИРУЕМОГО действия в базе данных, работающей в режиме ARCHIVELOG в котором и должны работать практически все производственные базы данных рекомендуется выполнить горячее резервное копирование затронутых табличных пространств. Это позволит выполнить восстановление после сбоя носителя media recovery для этих табличных пространств. Если этого переименовать таблицу oracle сделать И произойдет сбой носителя переименовать таблицу oracle не просто сбой экземпляра после выполнения не журнализируемого действия - данные будут потеряны. Их нельзя восстановить из архива, поскольку их в архиве нет. При выполнении действий без журнализации следует быть осторожным и согласовать действия с теми, кто отвечает за резервное копирование базы данных. В противном случае, легко потерять данные. В базе данных, работающей в режиме noarchivelog, поскольку переименовать таблицу oracle можно только на момент последней полной резервной копии, выполненной в холодном режиме, при сбое носителя этот вопрос вообще не актуален потому и надо работать в режиме archivelog! Что значит "таблица, огранизованная в виде кучи"? Ответ Тома Кайта Вот небольшая цитата из моей книги на эту тему, подробнее - читайте Я привожу цитату по моему переводу на русский - Таблица, организованная в виде кучи, создается по умолчанию при выполнении оператора CREATE TABLE. Если необходимо создать таблицу другого типа, это надо явно указать в операторе CREATE. Это по сути большая область пространства на диске или в памяти в случае таблицы базы данных, конечно же, на дискеиспользуемая произвольным образом. Данные размещаются там, где для них найдется место, а не в определенном порядке. Многие полагают, что данные будут получены из таблицы в том же порядке, в каком туда записывались, но при организации в виде кучи это не гарантировано. Фактически гарантировано как раз обратное: строки будут возвращаться в абсолютно непредсказуемом порядке. Это очень легко продемонстрировать. Создадим такую таблицу, чтобы в моей базе данных в блоке помещалась одна полная строка я использую блоки размером 8 Кбайт. Совсем не обязательно создавать пример с одной строкой в блоке. Я просто хочу продемонстрировать предсказуемую переименовать таблицу oracle событий. Такое поведение будет наблюдаться для таблиц любых размеров и в базах данных с любым размером блока:. Списки свободных мест Я перенес таблицы в новое локально управляемое табличное пространство, а затем проанализировал таблицы. Во переименовать таблицу oracle таблицах есть неиспользуемые блоки, а в одном блоке - лишь несколько строк. Ответ Тома Кайта Потому, что блоки, в которых НИКОГДА не было данных, будут выше отметки максимального уровня, а не в списках свободных мест. В списки свободных мест блоки попадают после использования - если они никогда не использовались, то в списке свободных мест их не будет. Сразу после пересоздания, как в вашем случае, вполне естественно, что в списке свободных мест блоков МАЛО, если вообще они там есть. Это просто означает, что все существующие блоки данных "упакованы" - в них больше нельзя вставлять строки. Мы используем Oracle 7. Я также использовал второй подход для переноса таблиц в другие табличные пространства, поскольку в версии 7. Переименовать таблицу oracle я снова создал индексы по переименовать таблицу oracle orgfoo. Мне хотелось бы знать: a Хорошее ли это решение для версии 7. Я нашел твое решение на сайте, где рекомендуется: Экспортировать схему пользователя Удалить все объекты пользователя Отобрать привилегию unlimited tablspace у пользователя Изменить стандартное табличное пространство для пользователя Импортировать данные пользователя Но я хочу перенести только одну большую таблицу, а не все таблицы. После удаления всех объектов, как мне импортировать данные в два различных переименовать таблицу oracle пространства? В табличном пространстве EHISTDAT освободилось 250 Мбайт, а в табличном пространстве было выделено не 250, а переименовать таблицу oracle лишь 110 Мбайт. Не могли бы это объяснить? Считаете ли вы переименовать таблицу oracle действия полезными для экономии места на диске? Ответ Тома Кайта Ваш метод вполне приемлем. Можно сделать экспорт отдельной ТАБЛИЦЫ, а не всей схемы - это тоже подойдет, но и ваш метод отлично подходит если только пересоздать все ограничения, триггеры, привилегии и т. После переименования таблицы ничего делать не нужно. Представления сами о себе позаботятся, как и хранимые процедуры. Что касается различия "размеров" - вновь созданная таблица заново "упакована". В результате, она вполне может оказаться "меньше". А вот насчет "полезности для экономии места" - я так не думаю. Это как когда садятся на диету - вес немного уменьшается, но в конечном итоге он снова увеличивается до "комфортного". Регулярная реорганизация таблиц: a мне не кажется нужной b мною не рекомендуется при этом часто приходится слышать "блин, часть данных потеряна" из-за ошибок по ходу реогранизации c место на диске "экономит" на пару дней, а со временем размер снова увеличивается до прежнего стабильного уровня. Сбой экземпляра при переносе таблицы с опцией nologging Что произойдет при сбое экземпляра по ходу переноса таблицы с опцией nologging? Мы данные не потеряем? Ответ Тома Кайта Нет, nologging переименовать таблицу oracle только на восстановление после сбоя НОСИТЕЛЯ, но не после сбоя экземпляра. При переносе таблицы с опцией nologging таблица копируется из постоянного сегмента во ВРЕМЕННЫЙ переименовать таблицу oracle. В самом конце этого действия, временный сегмент преобразуется в постоянный - вото тогда копия и становится реальной таблицей. Если сбой экземпляра произойдет по ходу переноса, процесс SMON просто очистит временный сегмент, и все будет выглядеть так, как если бы мы вообще таблицу не трогали постоянный сегмент остается на месте. Если сбой экземпляра произойдет после переноса переименовать таблицу oracle все в порядке, поскольку данные писались непосредственно на диск и восстанавливать их при восстановлении экземпляра не нужно. Если после переноса часть данных изменена, изменение зафиксировано и произошел сбой - тоде все в порядке, поскольку данные повторного выполнения для этих изменений доступны их можно восстановить. Если после переноса и ДО резервного копирования файлов, которые были затронуты действием с опцией nologging произойдет Переименовать таблицу oracle ДИСКА - тогда да, "у нас проблемы". Вот почему в производственной среде есть основания опцию NOLOGGING не использовать, а если уж использовать, то: сначала создать резервную копию объектов; выполнить действие без журнализации; снова создать резервную копию объектов. Итак, проблем при сбое экземляра вообще не возникает! У меня есть вопрос вдогонку: поскольку вы сказали, что по ходу переноса постоянный сегмент не трогают, это означает, что запросы продолжают читать данные из постоянной таблицы, а не из временной, не так ли? А можно ли применять к таблице операторы ЯМД? Или таблица блокируется исключительной блокировкой? Ответ Тома Кайта Да, по ходу выполнения alter table переименовать таблицу oracle данные таблицы можно читать. Выполнять операторы ЯМД можно только если действие выполняется "online" переименовать таблицу oracle index переименовать таблицу oracle online, например, alter table move online - но только для таблиц, организованных по индексу. Комментарий читателя от 4 октября 2002 переименовать таблицу oracle Я видел переименовать таблицу oracle пример переноса таблицы. В нем вместо 4 Мбайт данных повторного выполнения если при переносе была включена журнализация генерировалось всего переименовать таблицу oracle Кбайт. Я попытался сделать то же самое, но не увидел разницы. Не мог бы переименовать таблицу oracle сказать, что я делаю не так. Пропущены, так как не переименовать таблицу oracle отношения к делу см. Как видишь, когда таблица журнализировалась, было сгенерировано 54320 байта данных повторного выполнения, в без журнализации - 53908 байт. Даже больше на 412 байт. Я использую Oracle 8. Переименовать таблицу oracle Тома Кайта Вы работаете в режиме noarchivelog. А как насчет распараллеливания в Oracle 8. Можно ли использовать нечто вроде: alter table X move tablespace NEW parallel 4; Команда работает, но я не знаю, как проверить, было ли распараллеливание при выполнении. Посоветуйте, с точки зрения только производительности, что лучше - INSERT с APPEND nologging или move nologging. Ответ Тома Кайта Распараллеливание возможно переименовать таблицу oracle в EE и PE. Это проще, чем insert append, при этом не теряются привилегии индексы. Я создал два табличных пространства. ~350 Мбайт при размере блока 16 Кбайт. Затем я перевел таблицу в режим nologging без распараллеливания. Тестовая машина - двухпроцессорная, с Oracle 8. При тестировании каждый тест выполнялся минимум дважды: alter table move выполняется в среднем 137 секунд. Данных повторного выполнения генерировалось от 200 до 350 Kбайт. Ответ Тома Кайта Я бы сказал, что разница между 137 и 125 секундами общего времени выполнения не существенна. Переименовать таблицу oracle, как показывапет ваш же тест, alter table move parallel 2 работает в 2 раза быстрее первая попытка распараллеливания могла работать медленнее из-за того, что пришлось запускать дочерние процессы PQ - а поскольку запуск 4 процессов занял так много времени, возможно, были переименовать таблицу oracle при доступе к исходному или целевому диску. Я бы не делал на этом основании вывода, что insert append работает быстрее. Я бы сказал, что это намного сложнее, менее удобно, и вообще неправильно. Комментарий читателя от 18 июня 2003 года Интересно, раз таблица была перенесена, то ее индексы стали недействительными их надо перестраивать, - а как индекс перестраивается? По таблице с новыми значениями rowid я так думаю или по существующему индексу rowid в котором больше нельзя использовать??? Ответ Тома Кайта Необходимо обратиться к таблице, чтобы получить значения rowid. Оригинал обсуждения этого вопроса можно найти. Copyright © 2003 Oracle Corporation В следующем выпуске Реструктуризация. Дальнейшее развитие рассылки и, возможно, новые ответы от Переименовать таблицу oracle Кайта. Этот выпуск выйдет, вероятно, уже в июле. Вот только не знаю - в начале или в конце. С наилучшими пожеланиями, В.

Смотри также