Oracle после удаления строк таблица не уменьшилась

Обновлено: 07.07.2024

Репутация: нет
Всего: 1

В таблице было около 300-тыс. записей, и размер базы данных весил 25 метров.
После удаления записей из таблицы осталось всего 3-тыс. записей, но тут я заметил что размер базы данных не изменился о_О.
Также скорость работы осталось прежней что не есть хорошо.

Делаю простой запрос через php.

Может я не знаю какой та секрет, или просто не правильно написал запрос.
За ранее Спасибо!

Репутация: нет
Всего: 1

О и еше вопрос, по функции array_merge
Объединяет но не правильно.

Есть два массива с ключами и ключ начинается с цифры 1, после объединения появляется ключик с цифрой 0 который мне не нужен.
Как правильно объединить массивы с ключами, может есть функция или я не правильно написал, пока вижу простой вариант пересчитать все с помощью foreach

Репутация: 9
Всего: 28

Это смотря какие запросы строятся, т.к. величина таблицы может незначительно влиять на скорость выполнения запросов.

Добавлено через 1 минуту и 12 секунд

привеите примеры массивов и результат после объеденения

Добавлено через 7 минут и 48 секунд


можно предварительно сохранить данные, потом сделать

Репутация: нет
Всего: 1

Что та я в этом сомневаюсь, если в таблице лимон записей то будет тяжко приходится на mysql, даже от простого запроса WHERE .

С массивами разобрался, нашол пример там оказалось все просто со знаком +

Тут я не понял, можно по подробнее объяснить

Репутация: 41
Всего: 60

какой двиг используется в таблицы innoDB или другой?
innoDB по умолчанию резервирует место под таблицу и по мере роста таблицы расширяет диапазон.

Цитата

TRUNCATE TABLE `имя таблицы` -- очистить всю таблицу от записей
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.

Репутация: нет
Всего: 1

Как я понял TRUNCATE TABLE удаляет все, вообшем чистит таблицу. Я поискал в нете и опробовал, но мне не подходит, мне не просто нужно очистить таблицу, а оставить записи где d_r=1.

Я запросом удаляю все где d_r=0, удаление проходит но размер остается что влияет на скорость.

Теперь думаю, может все записи которые нужно сохранить копировать в временную таблицу, очистить и сново добавить записи.
Но и тут проблема, во первых id - auto_increment и мне кажется что полезут ошибки, а во вторых мне кажется что это будет выполнятся очень долго и ответа не дождусь.

Репутация: 9
Всего: 28

TRUNCATE + копирование будет быстрее работать чем удалять сотни тыщ записей

Добавлено через 1 минуту и 19 секунд

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

Репутация: нет
Всего: 1

Такс, не до конца пойму как сделать.

Для примера, есть таблица в которой есть записи с уникальным id - auto_increment это id используется для других таблиц, им нужна знать этот id.

Другая таблица curer типа курьера, через нею все пересекается.

В таблицы curer хранятся id других записей в таблицах. Например когда я обращаюсь к таблице table я заодно обращаюсь к таблице curer где page_id равен id и оттуда вытаскиваю post_id.

Хууу, надеюсь пояснил правильно, так вот, с помощью DELETE все эти id в таблице table остаются то что мне нужно.
Но если использовать TRUNCATE то все удалится и id обновится с 0.

А вот теперь по подробнее, я не вникаю как это сделать.

Репутация: нет
Всего: 1

Лан, пойдем другим путем, ктонить знает как скопировать таблицу без записей в новою с другим название.

Я хочу сделать копию таблицы, затем выделить те записи которые должны остаться и циклом while записать в новою, после удалить старую и переименовать новою в старую.

Пока не вкурсах как это сделать, буду искать в нете но врятли я там найду на понятном мне русском.

Если кто та знает как сделать то подскажите пожалуйста новичку в этом деле.

Репутация: 9
Всего: 28

Код

CREATE TABLE temporary_table_with_deleted SELECT * FROM my_table WHERE d_r=1;
DROP TABLE `my_table`;
RENAME TABLE temporary_table_with_deleted TO my_table;

Репутация: нет
Всего: 1

CruorVult
Спасибо за ответ, мой вариант уж был огромным, я создавал таблицу затем все переносил со старой на новою, отключал/включал индекс и все удалял.
А тут такой маленький и рабочий, все всем спасибо еще раз, теперь буду спать спокойно, размер базы упал до 2 метров.

Добавлено через 2 минуты и 51 секунду
Опа, а как теперь вернуть индекс таблицы на id.

Репутация: 9
Всего: 28

Добавлено через 4 минуты и 23 секунды
ну или не удалять таблицу:

Код

CREATE TABLE temporary_table_with_deleted SELECT * FROM my_table WHERE d_r=1;
TRUNCATE TABLE `my_table`
INSERT INTO `my_table`SELECT * FROM `temporary_table_with_deleted`
DROP TABLE temporary_table_with_deleted ;

Репутация: нет
Всего: 1

Что та не фурычит, как я понял ADD это добавить, но мне не нужна добавлять так как уже есть, просто id не auto_increment.

Добавлено через 6 минут и 46 секунд
Не так не так не создается индекс.

Репутация: 9
Всего: 28

ну индекс и не должен создаваться, таблица, я так понял, уже была удалена.

что нужно, автоикремент добавить:

Репутация: нет
Всего: 1

Что та не пойму, через SQL работает, но через php выдант ошибку.

Incorrect table definition; there can be only one auto column and it must be defined as a key

Добавлено @ 16:29
Кстати всегда интересовал такой вопрос, почему столбец нельзя изменить на AUTO_INCREMENT
Всегда выдает ошибку:

Код

Error

Только если удалить и заново создать.

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь
  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

[ Время генерации скрипта: 0.1506 ] [ Использовано запросов: 21 ] [ GZIP включён ]

После Google не могу найти простой способ вернуть свободное место после удаления таблицы.

Я нашел много объяснений, рассказывающих, как файл данных становится фрагментированным, большой стек скучных запросов, которые вам нужно выполнить, чтобы переместить «пустое пространство» в конец файла данных (таблица за таблицей . даже когда вы есть 200 столов!?).

Затем вам нужно уменьшить размер файла данных, «угадав», насколько вы можете его уменьшить, или вы должны точно знать, каков ваш «размер блока» . И, наконец, вы не должны забывать «перестраивать индексы».

Существует ли простая процедура PL / SQL, которая, учитывая имя табличного пространства или имя файла данных, будет выполнять эту работу? Или любой подобный инструмент Oracle?

Краткий ответ - нет . К сожалению, способ сделать это в Oracle требует «большого количества скучных запросов». Статьи, на которые вы ссылаетесь, являются одними из лучших на эту тему. Файл данных действительно фрагментируется, поэтому даже если свободное пространство находится ниже самого высокого сегмента, Oracle не будет автоматически консолидировать его, когда RESIZE будет выполнено a .

Чтобы «дефрагментировать» табличное пространство, вам нужно переместить эти сегменты в начало файла данных, а не в конец. Для таблиц это автономный процесс, то есть таблица будет недоступна во время перемещения. Индексы можно перемещать либо в автономном режиме, либо с помощью Enterprise Edition их можно перемещать в режиме онлайн. Поскольку у вас есть окно отключения, я рекомендую вам выполнить следующие шаги.

A. Сжатие файлов данных со свободным пространством за отметкой максимальной воды. Это можно сделать следующим образом (запрос аналогичен процедуре Frosty Z):

Б. После того, как вы сузили положение выше верхней отметки, выясните, какие табличные пространства все еще выиграют от перемещения сегментов.

C. Для каждого из этих табличных пространств определите, какие сегменты необходимо переместить. (Замените USERS именем вашего табличного пространства или присоедините его к предыдущему запросу)

D. Переместите каждую таблицу и перестройте индексы и статистику.

E. повторите шаг A.

Я только что построил большинство этих запросов, так что вы захотите тщательно протестировать их перед использованием. Я полагаю, вы могли бы создать процедуру, которая использовалась бы EXECUTE IMMEDIATE для создания фактических операторов для динамического выполнения, но поскольку запросы будут получать ORA-08103: объект больше не существует, пока выполняется перемещение, я думаю, что лучше контролировать этот процесс вручную, даже если если это действительно означает немного больше времени / усилий.

Привожу простой пример заполнения и последующего сжатия tablespace .

И так в чем нюансы при сжатии табличного пространства.



В табличном пространстве всего одна таблица. В таблицу можно загрузить всего 100 строк. Загружаем построчно в таблицу с 1 по 100 строки. Табличное пространство заполнено под завязку.



Теперь удалим с 1 по 50 строку. Осталось половина - 50 строк. Смотрим на размер файла, а он остался те же 100 мб.


Т.е. при заполнении таблицы (и соответственно табличного пространства) файл увеличивается, но не уменьшается при их удалении.

Почему так происходит? Дело в том, что табличное пространство уменьшается (режется) с конца. А в конце у нас лежат данные.


CREATE TABLESPACE MGMT DATAFILE 'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\MGMT.DBF'

SIZE 1 M REUSE AUTOEXTEND ON NEXT 10 M MAXSIZE 100 M

Делаем дефрагментацию данных. Для этого нужно разрешить перемещение строк в таблице.

Опция COMPACT проводит дефрагментацию, но не корректирует HWM, и не освобождает высвободившееся пространство. Опция CASCADE сжимает не только названную таблицу, но и любые зависимые объекты, например, индексы.

ALTER DATABASE DATAFILE 'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\MGMT.DBF' RESIZE 50 M

  • Получить ссылку
  • Facebook
  • Twitter
  • Pinterest
  • Электронная почта
  • Другие приложения

Комментарии

Это здорово работает, когда в табличном пространстве всего одна таблица. Добавьте 2-ю таблицу и данные в нее после добавления данных в 1-ю, а потом покажите, как шринкануть пространство.

T-SQL. Почему пишут WHERE 1=1?

Изображение

Oracle оператор DELETE используется для удаления одной или нескольких записей из таблицы в Oracle.

Синтаксис

Синтаксис оператора DELETE в Oracle/PLSQL:

Параметры или аргументы

Таблица из которой вы хотите удалить записи.

Необязательный. Условия, которые должны быть выполнены для удаляемых записей. Если не предусмотрено никаких условий, то все записи из таблицы будут удалены.

Примечание

Вам не нужно перечислять поля в Oracle DELETE, поскольку вы удалите всю строку из таблицы.

Пример использования с одним условием

Рассмотрим простой Oracle пример DELETE, где в запросе DELETE есть только одно условие.

Этот пример DELETE удалит все записи из таблицы customers , где last_name является John.

Вы можете проверить количество строк, которые будут удалены. Вы можете определить количество строк, которые будут удалены, выполнив следующее Oracle предложение SELECT, перед выполнением удаления.

Пример использования двух условий

Рассмотрим пример, когда в DELETE просто два условия.

Этот пример DELETE удалит все записи из таблицы customers , где last_name является Anderson и customer_id больше 25.

Вы можете проверить количество строк, которые будут удалены. Вы можете определить количество строк, которые будут удалены, выполнив следующее предложение SELECT, перед выполнением удаления.

Пример использования условия EXISTS

Вы можете, также выполнять более сложные операции удаления.

Вы можете удалять записи в одной таблице на основе значений в другой таблице. Так как, при удалении, вы не можете перечислить более одной таблицы в FROM, вы можете использовать Oracle условие EXISTS.

Этот Oracle пример DELETE удалит все записи в таблице suppliers , где есть запись в таблице customers , чьи customer_id больше 25, а customer_id соответствует supplier_id .

Если вы хотите определить количество строк, которые будут удалены, вы можете запустить, перед выполнением удаления, следующее Oracle предложение SELECT.

Я хотел бы знать, как обычно удаляются данные из СУБД Oracle 9i, что фактически освобождает дисковое пространство. В прошлом сценарии у нас были случаи, когда очистка 1-2 миллионов строк данных не приводила к уменьшению использования дискового пространства.

Не приводит к изменению использования дискового пространства.

Это также подводит меня к вопросу, нужно ли очищать больше таблиц, чтобы oracle полностью удалил все данные, которые предположительно были удалены с помощью delete DML

В Oracle удаление строк из таблицы не освобождает автоматически дисковое пространство. Можно освободить дисковое пространство, но для этого вам нужно выяснить, как таблицы физически размещаются в файлах данных. Как только файл данных будет иметь пустые блоки на конце, вы можете изменить размер файла данных до меньшего размера. Только после этой - успешной - операции вы получаете обратно реальное дисковое пространство. Если у вас много пустых блоков в файле данных, но их нет в конце, возможно, проще всего переместить таблицы из табличного пространства, которому принадлежит файл данных, в новое табличное пространство и отбросить старое табличное пространство. Это не сработает для табличного пространства SYSTEM, вам не разрешено перемещать объекты SYS в другое табличное пространство.

Иногда вам повезло, когда вы можете переместить только одну небольшую таблицу, которая заблокировала освобождение места, потому что она была помещена в конец файла данных. В этом случае простой alter table thesmalltable move; переместит эту таблицу и освободит место в конце файла [файлов] данных. После того, alter database datafile '/your/df/name.dbf' resize the_new_size; освобождает место на диске.

Таблица логически помещается в табличное пространство. Табличное пространство состоит как минимум из 1 файла данных, во многих случаях из нескольких файлов данных.

  • Привет ik_zelf, спасибо за мысли. Один вопрос: приводит ли вся описанная вами операция к простою?
  • Произойдут простои, вызванные, в основном, перестроением индексов, которые стали непригодными для использования во время перемещения таблиц. С помощью dbms_redefinition можно предотвратить большое количество простоев, но не все, по крайней мере будут короткие простои.

Чтобы заполнить другие ответы, очистка журналов диагностики может помочь вам освободить значительное дисковое пространство (до нескольких ГБ).

По сути, вы запустите adrci Утилита командной строки Oracle, затем выполните:

В приведенном выше примере будут удалены диагностические трассировки старше 1 недели.

Попробуйте эту команду, чтобы вернуть немного места:

Я думаю, что лучший способ вернуть место на жестком диске - это удалить с жесткого диска все неиспользуемые файлы.

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

Читайте также: