четверг, 24 марта 2011 г.

truncate и delete: что лучше и когда использовать


Когда требуется полностью удалить все данные из таблицы, прибегают к оператору delete. Его можно использовать в транзакции. Но если данных в таблице много то их удаление может занять продолжительное время, поскольку удаление каждой записи будет записываться в журнал транзакций. Кроме того, место занимаемое таблицей на диске, не будет освобождено: оно останется занято пустыми экстентами таблицы.
На помощь приходит оператор truncate. Он не записывает в журнал транзакций удаление каждой записи, выполняет удаление всех данных из таблицы практически моментально, и для него можно указать освободить занимаемое таблицей место на диске, или оставить с помощью опций drop storage или reuse storage. Однако минусом использования truncate является то что если в транзакции после truncate попытаться выполнить другие действия то получим ошибку: 26021: No operations allowed after truncate in a transaction. Т.е. truncate должен быть либо последним оператором в транзакции, либо выполнятся вне блока транзакции begin ... commit.

понедельник, 21 марта 2011 г.

Статистика на уровне фрагментов и не только

Есть настолько очевидные вещи, 
что иногда удивляешься, 
почему их сделали 
совсем недавно

Как то я писал, что при работе с фрагментированными таблицами статистика обновляется целиком на всю таблицу. Получается что сервер делает лишнюю работу, если например новые данные добавляются в новые фрагменты, а старые данные, которые находятся в старых фрагментах не меняются. Если схема работы с данными в таблице такова, что данные добавляются и изменяются только в новом фрагменте, то в этом случае ясно, что статистика будет менятся только для этого фрагмента, а для старых фрагментов статистика не меняется. И вот в версии 11.70xC1 сделали статистику на уровне фрагментов. Для использования этой возможности надо при создании таблицы указать опцию STATLEVEL FRAGMENT. Непонятно только как делать обновление статистики по такой таблице, поскольку в UPDATE STATISTICS я не нашел как указывать что статистику надо обновлять на фрагмент. Возможно это делается автоматически, т.е. определяется процент измененных данных во фрагменте и после этого обновляется статистика по фрагментам где было много измененных данных.
Кстати сам процент изменений при которых статистика будет считаться устаревшей на таблице, можно определить при создании таблицы с помощью опции STATCHANGE (действует на уровне экземпляра и на уровне таблицы), и при запуске UPDATE STATISTICS AUTO статистика будет обновляться только для таблиц у которых она устарела. Это свойство относится не только к фрагментированным таблицам. Процент изменений по умолчанию равен 10, но его можно изменить при создании таблицы.

среда, 9 марта 2011 г.

Управляй дисками в Informix легко

В Информиксе начиная с версии 11.70 можно автоматизировать управление дисковым пространством. Теперь можно сконфигурировать Informix на автоматическое изменение размеров чанков или пространств данных, причем дисковое пространство будет браться из одного или нескольких заранее определенных дисковых пулов (storage pool). Чанки для которых разрешено автоматическое расширение, имеют в статусе флагов в 5-й позиции букву E (expanded ?), а для автоматических dbspace в поле flags в 5-й позиции будет стоять буква A (Automatic ?). Дисковый пул (их может быть несколько) может состоять из файлов, сырых устройств или каталогов, для него можно задавать приоритет по которому будет выделятся первоочередной пул.

По умолчанию все dbspace являются автоматически расширяемыми, за это отвечает параметр конфигурации сервера SP_AUTOEXPAND. Также можно настроить тип автоматического расширения: проактивный, при котором пространства расширяются заранее или реактивный, при котором расширение происходит только после полного заполнения пространства с данными, см. параметр SP_THRESHOLD. Эти два параметра действуют на уровне экземпляра Informix.
Также настраивается размер автоматически создаваемого чанка (параметр create size) и размер расширения (параметр extend size). Эти параметры действуют на уровне отдельного dbspace.

Для примера создадим дисковый пул размером 1 Gb в каталоге на файловой системе, размер каждого выделяемого чанка в нем сделаем 100 Мб, и приоритет пула 1:

execute function sysadmin:task('storagepool add', '/datafs/informixdata/storagepool/', '0 MB', '1 GB', '100 MB', '1');

Кстати для каталогов нельзя задать максимальный размер пула, если задать отличный от 0 размер то будет выдана ошибка.

Затем создадим dbspace размером 100 Мб и размером страницы 4 Кб который возьмет место для себя из этого пула:

execute function sysadmin:task ('create dbspace from storagepool', 'testdbs', '100 MB', 4, 0);

Посмотреть какие дисковые пулы есть в Informix можно в таблице sysadmin:storagepool

Более подробно об автоматизации управления дисками можно прочитать в этой статье на сайте developerWorks.
Также см. документацию