Форум программистов, компьютерный форум, киберфорум
SQLite
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1539 / 459 / 101
Регистрация: 17.05.2015
Сообщений: 1,426
1

Как правильно работать с индексами, и правильно ли удалять из таблицы данные

10.07.2023, 00:57. Показов 692. Ответов 7

Author24 — интернет-сервис помощи студентам
Всем привет!

Пытаюсь понять, как правильно проектировать базу данных.
И сейчас у меня такой вопрос: как поступать с записями, которые больше не актуальны, и могут быть удалены?

Как я поняла, есть две возможные стратегии:
1. Удаляем неактуальные записи, но тогда не используем индексы.
Это связанно с тем, что при удалении записи из таблицы, база пересоздает индексы, и это бъет по производительности.
Это действительно так уж ощутимо бъет по производительности?

2. Используем индексы, но тогда не удаляем записи, а лишь помечаем их в отдельном столбце как "удаленные".
Этот вариант используют даже несмотря на то, что в таблице может скапливаться много неактуальной информации.
Но ведь это же не рационально???


В моём случае есть таблица проводок.
Количество проводок зависит от активности пользователей, и может достигать значительного количества за короткий промежуток времени.
Однако, время жизни проводок относительно невелико, и поэтому, если удалять физически неактуальные записи, тогда в таблице будет сохраняться некоторое относительно небольшое кол-во проводок.

Но если их не удалять, а только помечать как удаленные, тогда очень быстро таблица вырастит до гигантских размеров, и при этом в ней 99% всех записей будет неактуальной информацией.

Получается, в моем случае предпочтительнее все таки первый вариант?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2023, 00:57
Ответы с готовыми решениями:

Как правильно удалять и изменять уже существующие данные?
И снова Здравствуйте. Столкнулся со следующей проблемой: Есть некая база данных в которой имеются...

Как правильно загрузить данные из таблицы ms sql ?
Добрый вечер. Помогите кто может. В чём проблема: на форме есть "Label", привязал к нему значение...

DGVComboBoxColumn: как правильно присоединить данные из таблицы?
Помогите, пожалуйста, разобраться. Я уже весь мозг себе сломала( В DataGridView есть столбец...

Как правильно сохранить данные полей таблицы
Здравствуйте! у меня такая проблема: существует таблица, редактируемая с отдельной формы, но как...

Как правильно сформировать данные для ячеек таблицы
Добрый день, как программно добавить данные в таблицу access. с прибора считывается данные, начало...

7
Модератор
9267 / 6045 / 2380
Регистрация: 21.01.2014
Сообщений: 25,823
Записей в блоге: 3
10.07.2023, 05:19 2
eva2326, а теперь представьте ситуацию: Вы старательно удаляете записи и все бы хорошо, но... Вот кто-то накосячил, к примеру, с реквизитами, и теперь начальство хочет знать, кого казнить... А Вы не можете этого сказать, так как данные за этот прошедший период уже старательно удалены... Угадайте, кого казнить будут?

Лично мое мнение: данные в базе предназначены для хранения - вот и пусть хранятся. Максимум, что имеет смысл продумать - перенос неактуальных данных в какую-нибудь архивную таблицу, чтобы не перегружать таблицу рабочую...
0
1539 / 459 / 101
Регистрация: 17.05.2015
Сообщений: 1,426
10.07.2023, 05:48  [ТС] 3
Цитата Сообщение от D1973 Посмотреть сообщение
Угадайте
Угадывать - это к гадалкам.
У программистов - логи, для разбора полетов, и бэкапы, для восстановления данных.

Цитата Сообщение от D1973 Посмотреть сообщение
Лично мое мнение
Ваше мнение не содержит ответа на мой вопрос.

Перенос данных в архивную таблицу подразумевает удаление данных из прежней таблицы.
А значит вопрос по первому пункту остается в силе.
0
Модератор
9267 / 6045 / 2380
Регистрация: 21.01.2014
Сообщений: 25,823
Записей в блоге: 3
10.07.2023, 06:19 4
Цитата Сообщение от eva2326 Посмотреть сообщение
У программистов - логи, для разбора полетов, и бэкапы, для восстановления данных.
Правильно. А сколько времени займет бэкапирование текущего состояния + восстановление предыдущего состояния из бэкапа (а еще надо определить, на какой момент бэкап поднимать) по сравнению с выполнением одного запроса по "фиктивно удаленным" записям? Вас устраивает такой расход времени - удаляйте. Нет - храните.
Цитата Сообщение от eva2326 Посмотреть сообщение
вопрос по первому пункту остается в силе.
А в чем вопрос-то? Индексируйте, если надо, архивную таблицу, а рабочая, в связи с незначительностью объема данных, обойдется без индекса.
0
1931 / 1165 / 424
Регистрация: 31.05.2012
Сообщений: 4,120
10.07.2023, 08:13 5
индексы и при вставке записей перестраиваются еще как, может быть еще и поболе чем при удалении. и при изменении ключевых полей, с точки зрения индекса это два в одном - удаление и вставка. и чего - не использовать их? зато при чтении они могут ускорить процесс в десятки раз. так что индексы нужны, но нужно тщательно обдумывать какие. когда удалять и удалять ли вообще сами должны решить

Добавлено через 11 минут
add
из опыта - в задачах отгрузки и поставки данные накапливались годами, в определенный момент сохранялся бекап и текущее ПО и программно корректно чистилась база, оставляя движения и сопутствующее данные за последние 2-3 года. оставались частично и более ранние не закрытые данные. затрагивалось несколько десятков таблиц. индексы перестраивались
1
1539 / 459 / 101
Регистрация: 17.05.2015
Сообщений: 1,426
10.07.2023, 15:24  [ТС] 6
Цитата Сообщение от Аватар Посмотреть сообщение
индексы и при вставке записей перестраиваются еще как, может быть еще и поболе чем при удалении
Эмммм....
Я думала, что при вставке индексы достраиваются, и это - относительно дешовая операция.
А при удалении происходит перестройка индексов, и это уже тяжелая операция.

А если при вставке индексы тоже перестраиваются, тогда получается, что обычная вставка - это тоже тяжелая операция.
Это как то странно...

Цитата Сообщение от Аватар Посмотреть сообщение
зато при чтении они могут ускорить процесс в десятки раз
Это если данные редко меняются, но по ним часто нужно делать поиск.

А если нужно постоянно добавлять/удалять данные, тогда получается, что лучше индексы вообще не использовать?
В таком случае от них будет больше вреда, чем пользы?
0
702 / 440 / 233
Регистрация: 03.01.2017
Сообщений: 1,256
14.07.2023, 16:54 7
Цитата Сообщение от eva2326 Посмотреть сообщение
2. Используем индексы, но тогда не удаляем записи, а лишь помечаем их в отдельном столбце как "удаленные".
Как 3 вариант, помеченные записи, чистить разом, через какой-то период времени, если дата их создания < текущая дата - {какое-то кол-во дней/месяцев}.
Так, недавно помеченные на удаление данные можно будет еще просмотреть, что-то с ними сделать, а совсем старые грохнуть. Тут можно перед удалением делать бэкап еще.
Как дополнение 4 варианта с комбинацией того, что уже предложили. Помеченные на удаление данные, закидывать в архивную таблицу, разом, все что накопилось.
1
1539 / 459 / 101
Регистрация: 17.05.2015
Сообщений: 1,426
14.07.2023, 20:31  [ТС] 8
Цитата Сообщение от Аватар Посмотреть сообщение
индексы и при вставке записей перестраиваются еще как, может быть еще и поболе чем при удалении
Я почитала разную интересную инфомацию на эту тему.
Если вкратце: sqlite использует для интексов B-деревья.
А это значит две вещи:

1. Индексы перестраиваются при любых операциях записи в базу.
При этом, вставка/удаление примерно одинаковые с точки зрения производительности.

2. Перестройка индексов на самом деле не такая уж медленная операция.
Не нужно бояться вносить изменения в данные.


А ещё, как я поняла, есть такая общая рекомендация: в первую очередь нужно отталкиваться от задачи.
Если по смыслу задачи данные больше не нужны, то и не нужно их держать/копить, только лишь из соображений оптимизации.
Ненужные записи можно просто удалять, не беспокоясь об индексах.
1
14.07.2023, 20:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2023, 20:31
Помогаю со студенческими работами здесь

Как правильно передать данные из таблицы DataGridView в SQL базу данных
Здравствуйте. Есть таблица DataGridView которая содержит данный которые добавляет пользователь или...

Как правильно сохранить данные в таблицы, чтобы их сразу же можно было использовать?
Вообщем есть 2 таблицы, который созданы в локальной БД c#. Я открываю exe файл программы и в эти...

Как правильно удалять документы
Пытался написать функцию... так и не получилось ничего нормального. Может у кого есть наработки?

Как правильно удалять события
Как правильно удалять события в данном случае, ибо каждое добавленное событие сохраняется....

Как правильно удалять строки из DB
Здравствуйте. У меня в проекте добавлены базы данных от MS Acess (.mdb). Данные отображаются в...

Как правильно построить ИНЕР, где данные в одну таблицу берутся из одной таблицы?
SELECT ROW_NUMBER() over (ORDER BY . ASC) , Единица1, Валюта., Единица2, Валюта. FROM INNER JOIN...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru