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