Holvender
@Holvender
нормально-нормально

Как ведут себя данные при удалении?

Представим, что у меня есть таблица с 10 записями, и я удаляю первые 3 записи (строки) из таблицы. Затем сразу после этого вставляются новые 4 записи (строки) в таблицу.
Cмещаются ли оставшиеся 4-10 записи вверх, занимая место удаленных 1-3 записей, и новые 4 записи вставляются на места 8-11, или сначала 3 из 4 новых записей займут места 1-3, а 4 запись будет внесена в 11 строку?
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
В реляционных БД не существует гарантий относительно порядка записей внутри таблицы. Этот порядок
- это особенности технической реализации хранения данных внутри блоков и сегментов. Это - "know how"
и это будет зависеть от типа DBMS (Postgres, MySQL, Oracle) и от типа таблицы (heap, index-organized, clustered e.t.c)

Если говорить грубо, то записи (data-rows) лежат не плотно а вразнобой с пробелами с выравниванием
к блокам. Ну тоесть вообще-вообще не так как в Excel. Удаление data-rows в Postgres насколько я помню
физически не удаляет запись а помечает ее мертвой используя служебные поля. Впоследствии VACUUM
делает работы по уплотнению.

Поэтому порядок ты сам обеспечиваешь, делая запрос с опцией ORDER BY some_date_time.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
СУБД до лампочки, в каком порядке хранить записи таблиц. Внутренняя логика лишь контролирует, чтобы чрезмерная перезапись данных не приводила к расползанию физических файлов СУБД, и то требуется внимание администратора.
Порядок вывода записей вы задаете, когда хотите их, собственно, вывести. В любом месте запроса, где вы хотите оценить вес строки по порядку, вы, обязательно, воспользуетесь клаузой order by. Чтобы было по каким признакам сортировать, при проектировании схемы базы данных разработчик сам должен позаботиться, какими свойствами снабдить записи, чтобы можно было проводить сортировку. Можно элементарно сортировать по ID записи (первичному ключу), или оставлять датированные метки, или по алфавиту какого-нибудь текстового поля, иногда нужно отдельное числовое поле, чтобы принудительно задать свой порядок сортировки, не подходящий ни под один признак естественной сортировки других полей записи.
Чтобы СУБД быстро отрабатывала вывод по критериям order by, лучше снабдить сортируемые поля индексами (индекс - это отдельный объект СУБД). Индексами как раз обеспечивается "магия" быстрого доступа к записям.
Именно с ними случается вот эти действия, что вы описали в вопросе, когда происходит вставка, обновление, удаление записей:
Cмещаются ли оставшиеся 4-10 записи вверх, занимая место удаленных 1-3 записей, и новые 4 записи вставляются на места 8-11, или сначала 3 из 4 новых записей займут места 1-3, а 4 запись будет внесена в 11 строку?

Только работа ведется не с линейным списком, а с переворачиванием такой структуры, как B-дерево.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы