Oracle сжать таблицу после удаления записей
How can we shrink temp tablespace in oracle? And why it is increasing so much like upto 25 GB since there is only one schema in the database for the application and data table space size is 2 GB and index table space size is 1 GB used.
Сжатие существующей не сжатой таблицы
Уже существующую не сжатую таблицу можно сжать с помощью оператора ALTER TABLE . MOVE. Например, не сжатую таблицу SALES_HISTORY_TEMP можно сжать с помощью следующего оператора:
Оператор ALTER TABLE . MOVE можно использовать и для отмены сжатия таблицы, как в следующем примере:
Учтите, что оператор ALTER TABLE . MOVE устанавливает МОНОПОЛЬНУЮ блокировку таблицы, что предотвращает выполнение любых операторов DML с таблицей на время выполнения этого оператора. Этой потенциальной проблемы можно избежать за счет использования оперативного переопределения таблицы (online table redefinition), появившегося в Oracle9i.
Сжатие секционированной таблицы1
Вариантов использовании сжатия для секционированных таблиц много. Сжатие можно применять либо на уровне таблицы, либо на уровне секции. Например, оператор CREATE TABLE в Листинге 1 создает таблицу из четырех секций. Поскольку COMPRESS задается на уровне таблицы, все четыре секции будут сжиматься.
Поскольку сжатие может быть задано на уровне секции, можно некоторые секции сжать, а другие оставить не сжатыми. Пример в Листинге 2 демонстрирует, как задать сжатие на уровне секции.
В Листинге 2 две секции таблицы (SALES_Q1_03 и SALES_Q2_03) сжаты, а остальные две остаются не сжатыми. Учтите, что атрибуты сжатия, заданные на уровне секции, переопределяют атрибуты, заданные для этой же секции на уровне таблицы. Если атрибут сжатия для секции не задан, эта секция наследует значение из определения на уровне таблицы. В Листинге 2, поскольку атрибуты сжатия для секций SALES_Q3_03 и SALES_Q4_03 не указаны, эти две секции наследуют значение из определения таблицы (которое, в данном случае, стандартно - NOCOMPRESS).
Секционированные таблицы обеспечивают совместно со сжатием одно уникальное преимущество. Один из полезных способов секционировать таблицы - поместить подлежащие изменению (вставке, обновлению и удалению) данные в отдельные секции, а данные только для чтения вынести в другие. Например, в определении таблицы в Листинге 2 данные о продажах секционированы по значению столбца SALE_DATE, так что хронологическая информация о продажах в каждом квартале хранится в отдельной секции. В этом примере данные о продажах за первый (Q1) и второй (Q2) кварталы 2003 года не могут быть изменены, поэтому они помещены в сжатые секции SALES_Q1_03 и SALES_Q2_03. Данные о продажах за третий (Q3) и четвертый (Q4) кварталы все еще могут меняться, поэтому соответствующие секции, SALES_Q3_03 и SALES_Q4_03, оставлены не сжатыми.
Если в конце третьего квартала 2003 года данные в секции SALES_Q3_03 становятся доступными только для чтения, можно сжать эту секцию с помощью оператора ALTER TABLE . MOVE PARTITION, как показано ниже:
Чтобы узнать, какие секции таблицы сжаты, можно выполнить запрос к представлению USER_TAB_PARTITIONS словаря данных, как в следующем примере:
ORACLE уменьшить размер табличного пространства (удалить файл данных, файл с данными или уменьшить размер файла данных)
Многие поисковые запросы в Интернете приводят к одновременному удалению файлов данных и табличных пространств. В ходе моего собственного исследования я выделил метод удаления одного файла данных в табличном пространстве, который используется только для справки. Лучше работать, когда в табличное пространство не записываются никакие данные.
**
7 Answers 7
Oh My Goodness! Look at the size of my temporary table space! Or. how to shrink temporary tablespaces in Oracle.
Yes I ran a query to see how big my temporary tablespace is:
The first question you have to ask is why the temporary tablespace is so large. You may know the answer to this off the top of your head. It may be due to a large query that you just run with a sort that was a mistake (I have done that more than once.) It may be due to some other exceptional circumstance. If that is the case then all you need to do to clean up is to shrink the temporary tablespace and move on in life.
But what if you don't know? Before you decide to shrink you may need to do some investigation into the causes of the large tablespace. If this happens on a regular basis then it is possible that your database just needs that much space.
The dynamic performance view
can be very useful in determining the cause.
Maybe you just don't care about the cause and you just need to shrink it. This is your third day on the job. The data in the database is only 200MiB if data and the temporary tablespace is 13GiB - Just shrink it and move on. If it grows again then we will look into the cause. In the mean time I am out of space on that disk volume and I just need the space back.
Let's take a look at shrinking it. It will depend a little on what version of Oracle you are running and how the temporary tablespace was set up.
Oracle will do it's best to keep you from making any horrendous mistakes so we will just try the commands and if they don't work we will shrink in a new way.
First let's try to shrink the datafile. If we can do that then we get back the space and we can worry about why it grew tomorrow.
Depending on the error message you may want to try this with different sizes that are smaller than the current site of the file. I have had limited success with this. Oracle will only shrink the file if the temporary tablespace is at the head of the file and if it is smaller than the size you specify. Some old Oracle documentation (they corrected this) said that you could issue the command and the error message would tell you what size you could shrink to. By the time I started working as a DBA this was not true. You just had to guess and re-run the command a bunch of times and see if it worked.
Alright. That didn't work. How about this.
If you are in 11g (Maybee in 10g too) this is it! If it works you may want to go back to the previous command and give it some more tries.
But what if that fails. If the temporary tablespace is the default temporary that was set up when the database was installed then you may need to do a lot more work. At this point I usually re-evaluate if I really need that space back. After all disk space only costs $X.XX a GiB. Usually I don't want to make changes like this during production hours. That means working at 2AM AGAIN! (Not that I really object to working at 2AM - it is just that. Well I like to sleep too. And my wife likes to have me at home at 2AM. not roaming the downtown streets at 4AM trying to remember where I parked my car 3 hours earlier. I have heard of that "telecommuting" thing. I just worry that I will get half way through and then my internet connectivity will fail - then I have to rush downtown to fix it all before folks show up in the morning to use the database.)
Ok. Back to the serious stuff. If the temporary tablespace you want to shrink is your default temporary tablespace, you will have to first create a new temporary tablespace, set it as the default temporary tablespace then drop your old default temporary tablespace and recreate it. Afterwords drop the second temporary table created.
Используйте сжатие данных таблицы для экономии места на диске и повышения производительности запросов. В большинстве систем поддержки принятия решений (СППР) обычно используются большие объемы данных, которые хранятся в нескольких очень больших таблицах. При развитии подобных систем требования к дисковому пространству могут быстро расти. Сейчас хранилища данных объемом сотни терабайт встречаются все чаще.
При решении проблем с дисковым пространством, появившаяся в Oracle 9i Release 2 возможность сжатия таблицы может существенно сократить объем дискового пространства, используемого таблицами базы данных и, в некоторых случаях, повысить производительность запросов.
В этой статье я покажу, как работает сжатие таблиц при создании баз данных и управлении ими. Я также представлю определенные результаты по производительности, на основе результатов некоторых тестов, чтобы помочь вам понять, какие преимущества можно, предположительно, получить при использовании сжатия таблиц.
Заключение
Сжатие таблицы в Oracle9i Release 2 позволяет существенно сэкономить дисковое пространство, особенно в базах данных, содержащих большие таблицы только для чтения. Если учитывать дополнительные требования к загрузке и вставке данных, а также правильно выбрать таблицы-кандидаты для сжатия, сжатие таблиц может оказаться потрясающим способом экономии дискового пространства и, в некоторых случаях, повышения производительности запросов.
В табличном пространстве всего одна таблица. В таблицу можно загрузить всего 100 строк. Загружаем построчно в таблицу с 1 по 100 строки. Табличное пространство заполнено под завязку.
Теперь удалим с 1 по 50 строку. Осталось половина - 50 строк. Смотрим на размер файла, а он остался те же 100 мб.
Т.е. при заполнении таблицы (и соответственно табличного пространства) файл увеличивается, но не уменьшается при их удалении.
Для того что бы уменьшить размер есть команда – ALTER DATABASE DATAFILE 'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\MGMT.DBF' RESIZE 50 M
Почему так происходит? Дело в том, что табличное пространство уменьшается (режется) с конца. А в конце у нас лежат данные.
Для этого (перед командой сжатия) необходимо выполнить дефрагментацию данных в табличном пространстве (т.е. перемещение блоков с данными на свободное место) командой – ALTER TABLE HR.ABC SHRINK SPACE COMPACT
Создаем новое табличное пространство с начальным размером 50 мб, авто расширением по 10мб до предельного размера – 100 мб.
Опция COMPACT проводит дефрагментацию, но не корректирует HWM, и не освобождает высвободившееся пространство. Опция CASCADE сжимает не только названную таблицу, но и любые зависимые объекты, например, индексы.
- Получить ссылку
- Электронная почта
- Другие приложения
Подробное объяснение команды Shrink пространства в Oracle
От 10g, Oracle начинает предоставлять команду Shrink, если автоматическое управление сегментом пространства (ASSM) поддерживается в нашем табличном, вы можете использовать этот характерный сегмент сокращения, то есть, HWM снижается. Здесь необходимо подчеркнуть эту новую функцию, 10G, действительны только для ASSM табличного пространства, в противном случае ORA-10635: Invalid сегмент или табличное пространство типа.
1 Создать экспериментальную среду
1.1 Создание табличного пространства ASSM
SQL> set serveroutput on
SQL> create tablespace ASSM datafile ‘/oradata/ltest/assm.dbf’ size 10m autoextend on SEGMENT SPACE MANAGEMENT AUTO;
SQL> select tablespace_name,
6 from dba_tablespaces
7 where tablespace_name = ‘ASSM’;
TABLESPACE_NAME BLOCK_SIZE EXTENT_MANAGEMENT ALLOCATION_TYPE SEGMENT_SPACE_MANAGEMENT
ASSM 8192 LOCAL SYSTEM AUTO
1,2 построенный стол
SQL> create table my_objects tablespace assm as select * from all_objects;
SQL> select count(*) from my_objects;
2 Данные до эксперимента
SQL> exec show_space(‘MY_OBJECTS’);
Total Blocks …768
Total Bytes …6291456
Unused Blocks …62
Unused Bytes …507904
Unused KBytes …496
Last Used Ext FileId…7
Last Used Ext BlockId…649
Last Used Block…66
The segment is analyzed below
FS1 Blocks (0-25) …0
FS2 Blocks (25-50) …0
FS3 Blocks (50-75) …0
FS4 Blocks (75-100) …0
Unformatted Blocks …0
Full Blocks …686
PL/SQL procedure successfully completed
3 удалённой информации
Затем мы случайным образом удалить некоторые данные из таблицы My_Objects:
SQL> delete from my_objects where object_name like ‘%C%’;
17674 rows deleted
SQL> delete from my_objects where object_name like ‘%U%’;
4687 rows deleted
SQL> delete from my_objects where object_name like ‘%A%’;
7010 rows deleted
SQL> exec show_space(‘MY_OBJECTS’);
Total Blocks …768
Total Bytes …6291456
Unused Blocks …62
Unused Bytes …507904
Unused KBytes …496
Last Used Ext FileId…7
Last Used Ext BlockId…649
Last Used Block…66
The segment is analyzed below
FS1 Blocks (0-25) …0
FS2 Blocks (25-50) …212
FS3 Blocks (50-75) …181
FS4 Blocks (75-100) …245
Unformatted Blocks …0
PL/SQL procedure successfully completed
Здесь есть 706 (768 - 62) Блок под HWM из таблицы My_Objects, где свободное пространство составляет 25-50% от блока имеет 205, в том числе 180 свободного пространства, свободное дисковое пространство 75- 100% от блока имеет 229 и Full Блок Space является только 45. в этом случае нам необходимо реорганизовать существующую линию данных этой таблицы.
Операция 4 Shink
Чтобы использовать Shink на ASSM, сначала мы должны поддерживать таблицу для перемещения, вы можете использовать эту команду для завершения:
SQL> alter table my_objects enable row movement;
Теперь, вы можете уменьшить HWM из MY_OBJECTS, пространство переработки, используйте следующую команду:
SQL> alter table my_objects shrink space;
SQL> exec show_space(‘MY_OBJECTS’);
Total Blocks …280
Total Bytes …2293760
Total MBytes …2.1875
Unused Blocks …5
Unused Bytes …40960
Unused KBytes …40
Last Used Ext FileId…7
Last Used Ext BlockId…265
Last Used Block…19
The segment is analyzed below
FS1 Blocks (0-25) …0
FS2 Blocks (25-50) …1
FS3 Blocks (50-75) …1
FS4 Blocks (75-100) …0
Unformatted Blocks …0
Full Blocks …259
PL/SQL procedure successfully completed
После выполнения команды воспроизведения усадочной, стол MY_OBJECTS HWM Теперь падает до 276 (280 - 5 + 1) положения, и пространственного использования блока под HWM, 259 заблокированных, Свободное пространство только 25- 50% и 50-75% блока один.
5 ТЕРМОУСАДОЧНОГО ПРОСТРАНСТВО Принцип анализ
5.1 Экспериментальная среда
SQL> create table TEST_HWM (id int ,name char(2000)) tablespace ASSM;
SQL> insert into TEST_HWM values (1, ‘aa’);
SQL> insert into TEST_HWM values (2, ‘bb’);
SQL> insert into TEST_HWM values (3, ‘cc’);
SQL> insert into TEST_HWM values (4, ‘ds’);
SQL> insert into TEST_HWM values (5, ‘dss’);
SQL> insert into TEST_HWM values (6, ‘dss’);
SQL> insert into TEST_HWM values (7, ‘ess’);
SQL> insert into TEST_HWM values (8, ‘es’);
SQL> insert into TEST_HWM values (9, ‘es’);
SQL> insert into TEST_HWM values (10, ‘es’);
5.2 Удалите до статуса ROWID
4 dbms_rowid.rowid_object(rowid) object_id,
5 dbms_rowid.rowid_relative_fno(rowid) file_id,
6 dbms_rowid.rowid_block_number(rowid) block_id,
7 dbms_rowid.rowid_row_number(rowid) num
8 from test_hwm;
10 rows selected
5.3 Удалить статус RowID
Затем удалите некоторые данные из таблицы Test_hwm:
SQL> delete from TEST_HWM where >
SQL> delete from TEST_HWM where >
SQL> delete from TEST_HWM where >
SQL> delete from TEST_HWM where >
SQL> delete from TEST_HWM where >
4 dbms_rowid.rowid_object(rowid) object_id,
5 dbms_rowid.rowid_relative_fno(rowid) file_id,
6 dbms_rowid.rowid_block_number(rowid) block_id,
7 dbms_rowid.rowid_row_number(rowid) num
8 from test_hwm;
Из приведенной выше информации, вы можете знать, что в Test_hwm, остальные данные распределяются в четырех последовательных блоков, таких как Aaaael, AAAAEM, AAAAEN, AAAAEO.
SQL> exec show_space(‘TEST_HWM’);
Total Bytes …65536
Total MBytes …0.0625
Unused Blocks …0
Unused KBytes …0
Last Used Ext FileId…7
Last Used Ext BlockId…289
Last Used Block…8
The segment is analyzed below
FS1 Blocks (0-25) …0
FS2 Blocks (25-50) …1
FS3 Blocks (50-75) …3
FS4 Blocks (75-100) …1
Unformatted Blocks …0
PL/SQL procedure successfully completed
С Show_Space_assm, мы можем видеть текущее использование пространства четырех блоков, AAAAEL, AAAAEN, AAAAAEO имеют линию данных, которые могут предположить , что свободное пространство составляет 50-75% от 3 -х блоков эти три блока, то свободное пространство 25 -50% от 1 блока является Aaaaem, а оставшееся свободное пространство 75-100% из 3-х блоков, который отформатированные под HWM. неиспользуемый блок.
5,4 после термоусадочной RowID Статуса
SQL> alter table my_objects enable row movement;
SQL> alter table my_objects shrink space;
4 dbms_rowid.rowid_object(rowid) object_id,
5 dbms_rowid.rowid_relative_fno(rowid) file_id,
6 dbms_rowid.rowid_block_number(rowid) block_id,
7 dbms_rowid.rowid_row_number(rowid) num
8 from test_hwm;
Когда операция Shrink выполняется, вы можете обнаружить, что операция Shrink не то же самое, как MOVE. Когда операция перемещения, все строки RowID изменились. Площадь блока в таблице также изменилась, но все порядок физической памяти изменилось, поэтому мы должны заключить , что Oracle является блоком, выполнение данных между блоками , После того, как сокращаться, RowID частичных данных изменился. В то же время, порядок физического хранения неполных данных также изменился, а площадь блока, расположенным в таблице не изменилась (идентификатор 1,5, 6 RowID). Там нет никаких изменений, идентификатор 9, 10 линий данных, первоначально перемещены на Aaaaen, Aaaaeo). Описание, термоусадочные перемещается только часть части данных строки таблицы для завершения освобождения пространства, и этот процесс выполняется в блоке в настоящее время используется в таблице.
6 внимание термоусадочная в
Oracle от отсталых данных, то операция усадочной не будет, как Move, Shrink не нужна использовать дополнительное пространство простоя.
Как это реализовано
Возможность сжатия таблиц в Oracle9i Release 2 реализуется путем удаления дублирующихся значений данных из таблиц базы. Сжатие выполняется на уровне блоков базы данных. Когда таблица определена как сжатая, сервер резервирует место в каждом блоке базы данных для хранения одной копии данных, встречающихся в этом блоке в нескольких местах. Это зарезервированное место называют таблицей символов (symbol table). Помеченные для сжатия данные хранятся только в таблице символов, а не в строках данных. При появлении в строке данных, помеченных для сжатия, в строке, вместо самих данных, запоминается указатель на соответствующие данные в таблице символов. Экономия места достигается за счет удаления избыточных копий значений данных в таблице.
Сжатие таблицы на пользователя или разработчика приложений никак не влияет. Разработчики обращаются к таблице одинаково, независимо от того, сжата она или нет, поэтому SQL-запросы не придется менять, когда вы решите сжать таблицу. Параметры сжатия таблицы обычно устанавливаются и изменяются администраторами или архитекторами базы данных, и участие в этом процессе разработчиков или пользователей минимально.
Первый способ удаления файлов данных
**
Первая часть - создать табличное пространство с нулевым временем для хранения удаляемых объектов.
Вторая часть - это проверка того, какие объекты базы данных находятся в удаляемом файле данных, в основном таблицы.Индексы таблиц могут быть сначала удалены, а затем созданы заново.
Используйте следующую команду, чтобы сначала проверить, какие объекты находятся в файле данных, и сначала запишите эти объекты.
В третьей части, после того, как объекты найдены, давайте переместим все объекты в созданное временное табличное пространство.Индекс таблицы можно сначала удалить и создать заново.
Затем проверьте, есть ли в файле данных какие-либо объекты.
В настоящее время файл данных TRW02.dbf удален.
Четвертая часть, удалите файл данных
Вы видите, что файл данных был удален.
Пятая часть, переместите все объекты из временного табличного пространства в табличное пространство TRW.
Видно, что все объекты были сохранены в файл TRW01.bdf в табличном пространстве TRW.
Пятый и последний шаг - удалить созданное временное табличное пространство TRWN;
Табличное пространство TRWN удалено;
Снижение производительности при загрузке
Поскольку сжатие таблицы выполняется при массовой загрузке, операции загрузки требуют дополнительной обработки - надо выполнять дополнительные действия. Чтобы измерить влияние сжатия на производительность, я выполнил тест, в котором загружал один миллион строк (с помощью непосредственной загрузки утилитой SQL*Loader) в две идентичных таблицы: со сжатием и без сжатия. В Таблице 1 представлены результаты, взятые из журнальных файлов SQL*Loader и показывающие, сколько времени потребовалось для загрузки данных в каждую из таблиц.
Имя таблицы | Количество строк | Способ загрузки | Сжатая? | Время загрузки |
SALES_HISTORY | 1000000 | Непосредственная | Не сжатая | 00:00:21.12 |
SALES_HISTORY_COMP | 1000000 | Непосредственная | Сжатая | 00:00:47.77 |
Таблица 1: Сравнение времени загрузки данных для сжатой и не сжатой таблиц
Дополнительное время при загрузке в сжатую таблицу требуется для выполнения действий по сжатию загружаемых данных. В реальной ситуации различие во времени загрузки будет зависеть от особенностей таблицы и загружаемых данных.
Сжатие материализованного представления
Материализованные представления можно сжимать точно так же, как и таблицы. Следующий оператор создает сжатое материализованное представление:
Материализованные представления на основе соединений нескольких таблиц обычно хорошо поддаются сжатию, поскольку в них часто встречаются повторяющиеся компоненты данных. Атрибут сжатия для материализованного представления можно изменить с помощью оператора ALTER MATERIALIZED VIEW. Следующий оператор показывает, как сжать существующее не сжатое материализованное представление:
При использовании этого оператора учтите, что сжатие фактически произойдет при следующем обновлении материализованного представления.
Когда использовать сжатие таблиц
Применяемый сервером Oracle алгоритм принятия решения о том, сжимать данные таблицы или не сжимать, приводит к определенным выводам об особенностях приложений, больше всего подходящих для сжатия таблиц. Как было описано выше, данные в таблице с атрибутом COMPRESS сжимаются только при непосредственной загрузке или при вставке с использованием подсказки append и распараллеливанием. Данные, вставленные обычными операторами INSERT, останутся не сжатыми.
В системах оперативной обработки транзакций (online transaction processing - OLTP) данные обычно вставляются обычными операторами INSERT. В результате, от использования сжатия для соответствующих таблиц большого преимущества не будет. Сжатие таблиц больше всего подходит для таблиц только для чтения, данные в которые загружаются один раз, а читаются - многократно. Таблицы, используемые при организации хранилищ данных, например, прекрасно подходят для сжатия.
Более того, изменение данных в сжатой таблице может потребовать распаковки строк, что сводит на нет все преимущества сжатия. В результате, часто изменяемые таблицы плохо подходят для сжатия.
Наконец, надо учесть последствия удаления строки при использовании сжатия таблицы. При удалении строки в сжатой таблице сервер освобождает место, занимаемое строкой в блоке. Это свободное место может быть повторно использовано при любой последующей вставке. Однако поскольку строка, вставленная в обычном режиме, не сжимается, маловероятно, что она поместится в освободившееся от сжатой строки место. Значительное количество последовательно выполняемых операторов DELETE и INSERT может вызвать фрагментацию и дискового пространства при этом будет напрасно использоваться больше, чем удалось сэкономить за счет сжатия.
Оценка преимуществ
Основной причиной использования сжатия таблицы является экономия дискового пространства. Таблица в сжатом виде обычно занимает меньше места. Чтобы проиллюстрировать это утверждение, рассмотрим следующий с двумя таблицами: одна не сжатая (SALES_HISTORY), а другая - сжатая (SALES_HISTORY_COMP). В обе эти таблицы данные были загружены с помощью непосредственной загрузки утилитой SQL*Loader из текстового файла, содержащего два миллиона строк. После выполнения обеих загрузок оказалось, что сжатая таблица занимает на диске почти вдвое меньше места, чем не сжатая. Анализ представлен в Листинге 3.
Тот факт, что для хранения сжатой таблицы надо меньше блоков, приводит к экономии дискового пространства, но уменьшение количества блоков может приводить и к повышению производительности. Запросы к сжатой таблице в среде с ограниченной производительностью ввода-вывода часто будут выполняться быстрее, поскольку требуют прочтения меньшего количества блоков. Чтобы проиллюстрировать это утверждение, я выполнил запрос к сжатой и не сжатой таблице и проанализировал результаты SQLTRACE/TKPROF. Эти результаты представлены в Листинге 4.
Отчет SQLTRACE/TKPROF показывает, что мой запрос к сжатой таблице потребовал меньше операций физического и логического ввода-вывода, чем аналогичный запрос к не сжатой таблице, и, как следствие, выполняется быстрее.
Как создать сжатую таблицу
Для создания сжатой таблицы используется ключевое слово COMPRESS в операторе CREATE TABLE. Ключевое слово COMPRESS требует от сервера Oracle, по возможности, хранить строки таблицы в сжатом виде. Ниже представлен пример оператора CREATE TABLE COMPRESS:
Можно также использовать оператор ALTER TABLE для изменения атрибута сжатия существующей таблицы, как в следующем примере:
Чтобы узнать, использовалось ли ключевое слово COMPRESS в определении таблицы, выполните запрос к представлению USER_TABLES словаря данных и проверьте значение столбца COMPRESSION, как в следующем примере:
Атрибут COMPRESS также может быть задан на уровне табличного пространства, как в момент его создания (с помощью оператора CREATE TABLESPACE), так и в дальнейшем (с помощью оператора ALTER TABLESPACE). Атрибут COMPRESS наследуется аналогично параметрам хранения. При создании таблицы в табличном пространстве наследуется атрибут COMPRESS этого табличного пространства. Чтобы определить, задан ли для табличного пространства атрибут COMPRESS, выполните запрос к представлению DBA_TABLESPACES словаря данных и проверьте значение столбца DEF_TAB_COMPRESSION, как в следующем примере:
Как и следовало ожидать, вы можете сжимать или не сжимать таблицу в табличном пространстве, независимо от значения COMPRESS, заданного на уровне табличного пространства.
Второй способ уменьшить размер файла данных
Первый шаг - просмотреть большие бесплатные файлы данных.
Убедитесь, что размер файла на сервере действительно 51 МБ.
Видно, что использование файла данных TRW01.dbf очень мало;
Во второй части мы уменьшили TRW01.dbf с 50M до 20M,Уменьшенный размер должен быть больше размера данных объекта.
Размер файла уменьшен до 20 МБ.
Это конец области сокращения.
Загрузка данных в сжатую таблицу
Учтите, что при указании ключевого слова COMPRESS, как показано в примерах выше, вы, фактически, никаких данных не сжимаете. Представленные выше команды изменяют только установку в словаре данных. Данные реально не сжимаются, пока не будут загружены или вставлены в таблицу.
Более того, чтобы гарантировать фактическое сжатие данных, надо использовать соответствующий метод загрузки или вставки данных в таблицу. Сжатие данных происходит только при массовой загрузке или в процессе массовой вставки, с помощью одного из следующих четырех методов:
- Непосредственная загрузка SQL*Loader
- Последовательные вставки INSERT с подсказкой APPEND
- Параллельный INSERT
- CREATE TABLE . AS SELECT
Метод непосредственной загрузки SQL*Loader - наиболее удобный способ загрузки данных в таблицу, если данные доступны в текстовом файле. Пример представлен ниже:
Если данные доступны в промежуточной (staging) таблице, можно использовать последовательные операторы INSERT с подсказкой APPEND или параллельный INSERT.
В качестве примера рассмотрим случай, когда входные данные доступны в не сжатой промежуточной таблице SALES_HISTORY. Используя метод последовательной вставки, можно использовать следующий оператор для вставки данных в сжатую таблицу:
Для переноса данных из промежуточной таблицы в сжатую можно также использовать параллельный INSERT, как показано ниже:
Учтите, что при использовании параллельного INSERT надо сначала включить распараллеливание операторов DML в сеансе с помощью команды ALTER SESSION ENABLE PARALLEL DML.
Можно также использовать оператор CREATE TABLE . AS SELECT для создания сжатой таблицы и вставки в нее данных за один шаг. Вот пример:
Если не использовать соответствующий метод загрузки или вставки данных, данные в таблице окажутся не сжатыми, хотя для таблицы и определен атрибут COMPRESS. Например, если использовать обычную загрузку (conventional path) с помощью SQL*Loader или обычные операторы INSERT, данные не будут сжиматься.
Комментарии
Это здорово работает, когда в табличном пространстве всего одна таблица. Добавьте 2-ю таблицу и данные в нее после добавления данных в 1-ю, а потом покажите, как шринкануть пространство.
T-SQL. Почему пишут WHERE 1=1?
Новичков часто ставит в тупик конструкция типа: SELECT * FROM [dbo] . [bkp_product] WHERE 1 = 1 AND [model] = 'Product 1' AND [quantity] = 939 Зачем пишут в коде 1=1? Ответ - для удобства при отладке кода. Покажу на примере. Напишем простой селект SELECT * FROM [Table_1] c WHERE [c] . [id] = 1 AND [c] . [v_sm] <> 'd' AND [c] . [qty] >= 1000 Допустим при отладке кода, нам нужно из условия WHERE убрать [ c ] . [ id ] = 1 Что мы делаем, комментируем условие [ c ] . [ id ] = 1 и AND SELECT * FROM [Table_1] c WHERE --[c].[id] = 1 --AND [c] . [v_sm] <> 'd' AND [c] . [qty] >= 1000 А если у нас изначально было написано SELECT * FROM [Table_1] c WHERE 1 = 1 AND [c] . [id] = 1 AND [c] . [v_sm] <> 'd' AND [c] . [qty] >= 1000 То нам нужно будет закомментировать всего одну строку SELECT * FROM [Table
Читайте также: