|
Программирование >> Oracle
одной стороны, несколько списков свободных мест позволяют существенно повысить производительность. С другой стороны, таблица будет занимать больше пространства на диске, чем необходимо. Придется решать, что важнее. Не стоит недооценивать полезность этого параметра, особенно с учетом возможности изменять его при желании в версиях, начиная с Oracle 8.1.6. Можно увеличить его значение для параллельной загрузки данных в обычном режиме с помощью утилиты SQLLDR. При этом будет достигнута высокая степень параллелизма загрузки с минимальными ожиданиями. После загрузки можно вернуть прежнее, более подходящее для обычной работы, значение параметра FREELIST. При этом блоки из нескольких существующих списков свободных мест будут объединены в один основной список свободных мест. Параметры PCTFREE и PCTUSED Эти два параметра управляют добавлением и удалением блоков из списков свободных мест. При задании для таблицы (но не для таблицы, организованной по индексу, как будет показано далее) параметр PCTFREE сообщает серверу Oracle, сколько места должно быть зарезервировано в блоке для будущих изменений. Стандартное значение - 10 процентов. Предположим, используются блоки размером 8 Кбайт. Когда при добавлении новой строки в блок свободного места в блоке останется меньше 800 байт, сервер Oracle будет использовать новый блок вместо существующего. Эти 10 процентов пространства данных в блоке оставляются для изменений строк блока. Если строку придется изменять, в блоке будет место для размещения измененной строки. Итак, если параметр PCTFREE определяет, когда сервер Oracle убирает блок из списка свободных мест, чтобы в него больше не вставлялись строки, то параметр PCTUSED определяет, когда сервер Oracle снова вернет блок в список свободных мест. Если параметр PCTUSED установлен равным 40 процентам (стандартное значение) и в блоке достигнут уровень заполнения PCTFREE (блок уже не находится в списке свободных мест), то сервер Oracle вернет его в список, только когда в блоке станет свободным 61 процент пространства. При использовании стандартнгх значений параметров PCTFREE (10) и PCTUSED (40) блок будет оставаться в списке свободных мест, пока не заполнится на 90 процентов (в нем останется 10 процентов свободного пространства). Как только он заполнится на 90 процентов, то будет удален из списка свободных мест и не попадет в него, пока свободное пространство не составит 60 процентов блока. Параметры PCTFREE и PCTUSED реализуются по-разному для разных типов таблиц, на что при описании этих типов я буду обращать внимание. Для некоторых типов таблиц используются оба параметра, для других - только PCTFREE, да и то лишь при создании объекта. Есть три значения параметра PCTFREE: слишком большое, слишком маленькое и подходящее. Если установить слишком большое значение параметра PCTFREE для блоков, будет напрасно расходоваться пространство на диске. Если установить значение PCTFREE равным 50 процентам, а данные никогда не изменяются, то 50 процентов каждого блока просто пустуют. В другой таблице, однако, значение 50 процентов может быть вполне уместным. Если первоначально маленькие строки со временем увеличиваются примерно вдвое, большое значение параметра PCTFREE позволит избежать переноса строк. Перенос строки Итак, когда переносится строка? Строка переносится из блока, в котором она бхла создана, когда она выросла настолько, что уже не помещается в блоке с остальными строками. Перенос строки проиллюстрирован ниже. Все начинается с блока, который выглядит примерно так: заголовок блока свободное место данные строки 4 данные строки 3 данные строки 2 свободное место данные строки 1 Примерно одна седьмая блока - свободное место. Однако необходимо более чем в два раза увеличить занимаемое строкой 4 место с помощью оператора UPDATE (сейчас эта строка занимает одну седьмую часть блока). В данном случае, даже если сервер Oracle объединит все свободное пространство в блоке в один фрагмент следующим образом: заголовок блока свободное место данные строки 4 данные строки 3 данные строки 2 данные строки 1 все равно для увеличения строки 4 более чем в два раза места не хватит, потому что общее свободное пространство меньше, чем текущий размер строки 4. Если бы строка могла поместиться в свободное пространство после его объединения, то это объединение было бы выполнено. В нашем случае, однако, сервер Oracle не будет выполнять объединение, и блок останется неизменным. Поскольку строка 4 должна выйти за границы блока, сервер Oracle перенесет ее. Но она, однако, не будет просто перемещена; ее не- обходимо оставить как адрес для пересылки . Могут существовать индексы, физически сс1лающиеся на текущий адрес строки 4. При простом изменении эти индексы не будут обновляться. (Учтите, что в случае использования фрагментированных таблиц идентификатор, или адрес, строки будет меняться; этот особый случай мы рассмотрим в главе 14, посвященной фрагментации.) Поэтому когда сервер Oracle переносит строку, он оставляет по старому адресу указатель на ее реальное местонахождение. После изменения блоки могут выглядеть примерно так:
заголовок блока свободное место данные строки данные строки 2 свободное место данные строки 1 заголовок блока свободное место перемещенные данные строки 4 Итак, вот что такое перенесенная строка: это строка, которую пришлось перенести из блока, в который она была вставлена, в какой-то другой блок. Почему это надо учи-тгвать? Приложение никогда о переносе строки не узнает , SQL-операторы менять не придется. Это влияет только на производительность. Если придется читать эту строку через индекс, он будет ссылаться на исходный блок. Этот блок, в свою очередь, будет ссглаться на новый блок. Вместо выполнения, скажем, двух операций ввода/вывода для чтения индекса и одной для чтения таблицы, для получения фактических данных строки потребуется еще одна дополнительная операция ввода/вывода блока. Сама по себе это небольшая проблема; вы эту дополнительную операцию даже не заметите. Однако, если в этом состоянии окажется значительная часть строк и обращаться к таблице будет множество пользователей, этот побочный эффект будет заметен. Доступ к данным начнет замедляться (дополнительная операция ввода/вывода увеличивает время доступа), эффективность буферного кэша - снижаться (придется буферизовать в два раза больше блоков, чем при отсутствии переноса строк), а размер и сложность таблицы - расти. Именно по этим причинам переноса строк следует избегать. Интересно разобраться, что сервер Oracle будет делать, если перенесенную с левого блока (на представленной ранее схеме) в правый блок строку снова придется переносить. Это может понадобиться, поскольку в блок, куда она была перенесена, добавлены строки, а наша строка опять увеличивается при изменении. Сервер Oracle перенесет строку назад в исходный блок и, если в нем достаточно места, оставит ее там (строка становится не-перенесенной ). Если места в исходном блоке недостаточно, сервер Oracle перенесет всю строку в другой блок и изменит адрес перенаправления в исходном блоке. Таким образом, перенос строк всегда создает один уровень косвенной ссылки. Итак, теперь мы можем вернуться к параметру PCTFREE и его использованию; при правильной установке значения этого параметра можно свести перенос строк к минимуму.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |