Разделение строк всегда было необходимо, чтобы думать о том, когда вы выбираете типы данных char/varchar2 для столбцов таблицы, выдавая пакетные удаления/вставки/обновления в таблицах, поскольку Oracle пытается поместить новые данные в открытые свободные пространства и, таким образом, может начаться фрагментация чтобы замедлить работу в течение некоторого времени. Теперь все изменилось с дисками флэш-памяти, поскольку данные записываются как можно фрагментарно из-за самой технологии флэш-памяти. Если нам не нужно заботиться о фрагментации, тогда это нарушает все понимание проблем хранения табличных данных и фрагментации данных. У кого-нибудь есть опыт хранения файлов базы данных на дисках флэш-памяти? Проблема с фрагментацией исчезла с дисками ssd?Нужно ли нам беспокоиться о фрагментации строк при использовании флеш-накопителя?
ответ
Нет такой вещи, как «фрагментация строк», как вы ее описываете, и, что реально, никогда не должно приводить к выбору типов данныхили varchar2
. Ваш выбор типа данных должен зависеть от характера данных и от того, действительно ли это фиксированная ширина или переменная ширина. 99,9% времени, вы должны предпочесть varchar2
.
Самая маленькая единица ввода-вывода Oracle, возможно, читает или пишет блок. Блок обычно составляет 8k (хотя он может быть как 2k, так и 32k). Блок обычно хранит данные для нескольких строк. Поскольку Oracle должен каждый месяц писать весь блок, не имеет значения, нужно ли перемещать данные внутри блока.
Внутри блока Oracle резервирует определенное пространство для будущего роста. Это контролируется настройкой PCTFREE
таблицы. Если вы ожидаете, что ваши ряды со временем будут существенно расти, вы будете использовать большой PCTFREE
. Если вы ожидаете, что ваши ряды со временем будут статичными, вы должны использовать небольшой PCTFREE
. Вы не хотели бы настраивать типы данных, чтобы предотвратить изменение размера строк, вы должны настроить таблицу PCTFREE
, чтобы она соответствовала любым изменениям, которые вы ожидаете.
Если у Oracle не хватает места на блоке для определенной строки (например, если строка должна расти, а значение PCTFREE
было слишком маленьким), Oracle необходимо перенести строку в новый блок. Это означает, что он оставляет указатель в исходном блоке, который указывает на новый блок и перемещает фактические данные в новый блок. Это может вызвать проблемы с производительностью, так как теперь вам нужно посетить старый блок и новый блок, чтобы прочитать строку, если вы читаете из индекса, в зависимости от того, какая часть строк в таблице перенесена. Вы также можете получить проблемы с цепочками строк, если у вас есть строки, которые больше, чем ваши блоки или строки, которые содержат более 255 столбцов, которые заставляют Oracle делать дополнительные операции ввода-вывода, но это не похоже на то, что вас беспокоит здесь ,
Независимо от системы хранения, вы должны соответствующим образом установить PCTFREE
вашей таблицы, чтобы свести к минимуму количество миграции строк, которое происходит с течением времени (существуют другие способы минимизации миграции строк в некоторых случаях, но 99% времени, когда вы действительно просто хотите правильно установить PCTFREE
). Используйте соответствующие типы данных для данных, которые вы пытаетесь сохранить, не позволяйте беспокойству о миграции строк влиять на выбор типов данных.
Я полагаю, автоматическое управление хранилищем сегментов (ASSM) автоматически управляет PCTFREE, поэтому вам нужно установить PCTFREE при использовании старого типа памяти MSSM? – Centurion
@Centurion - No. ASSM автоматически обрабатывает то, что было обработано параметром «PCTUSED» в управлении пространством в ручном сегменте. Оба типа табличных пространств полагаются на настройку «PCTFREE» таблицы. Было бы очень сложно автоматически управлять «PCTFREE», поскольку система не знает, как изменится размер строк со временем - это то, что знает только модератор данных. –