master_TAG, привет! привет всем!
Думаю будет интересно прочитать
всем у кого есть желание удалить нужных/ненужных игроков, игроков уже не играющих и так далее, тех кто думает уменьшить размер самой базы за счет удаления чего либо из базы.Просьба не воспринимать это как руководство к действию! Все последствия применения нижеследующих слов вы берете на себя.
Начнем эксперимент "чайника", не знающего основ POstgresQL.
Имеем майнинг по подписке. Импортируем майнинг, предварительно удалив прошлую базу/создав новую. В майнинге есть руки на меня. Исключаем дублирование рук, сыгранных мною (архивированных ХМ), предварительно скопировав их отдельно, не импортируем вместе с майнингом.
Цель эксперимента- удалить игроков с малым количеством рук, игроков, не проявляющих "активность", игроков с определенными никнеймами, выяснить как влияет эти действия на объем базы.
Стабильность работы базы после всех действий не проверялась.
1. Размер базы после импорта майнинга составил 7,6 ГБ.
2.В строки запроса Админа:
а. для информации о количестве общего количества рук - Select Count(*) from pokerhands
б. для информации о игроках с количеством рук (нас интересует,предположим)< 50 - Select playername from players where cashhands <50
б для информации о игроках не играющих давно - Select playername from players where lastplayeddate between '2000.01.01' and '2012.08.12'
(игроки не играли с 01 января 2000 года по 12 августа 2012 года)
3. Удаляю игроков
Delete from players where lastplayeddate between '2000.01.01' and '2012.08.12'
Delete from players where cashhands <50
4. Для удаления рук на конкретного игрока - ищем его во вкладе схемы-игроки-удаляем. После импорта майнига я удалил себя, чтобы проимпортировать позже руки их архива ХМ.
5. Сравнил количество рук в базе до и после всех манипуляций - количество одинаковое.
6. Удалил через ХМ все руки без ЩД - сравнил в Админе количество рук - одинаковое.
7. Посмотрел размер базы в папке data, размер то же. Сделал вакуум и реиндекс базы - на выходе получилось 5,6 ГБ.
8. Загрузил руки на себя из архива ХМ. По факту ХМ выдал следующее - часть рук он определил как дубликаты (те что совпадали с майнингом, я их удалил ранее см. п.4), а часть новыми. Соответственно во вкладке Сессия я не увидел сессии с дубликатами рук.
9. Смоделировав вышеописанные действия в вопросы я получил характеристику базы ХМ от сисадминов:
а. " ну вот, как и обжидалось, БД сконструирована муд@ками и пид@расами, и никаких связей и ограничений "от дурака" (читать - р@зработчика/@дминистратора, коии этими муд@ками-пид@расаами по определению являются), в неё не заложено. пичалька.
придётся вам ручками пройтись по табличкам (лучше - в отладчике по всем интерфейсам и ф-ям) и проследить логические связи самому." (То есть мы не можем сразу проследить логические связи в базе для понимания как можно полностью удалить данные в базе)
б. на вопрос Удаление, используя такой способ приводит к полному удалению данных о игроке - то есть удаляется все данные о действиях о игроке из всех таблиц в базе???
ответ А это уже от базы зависит, есть ли там форенкеи, как они настроены (DELETE CASCADE, NO ACTION, SET NULL).
Вообще удалять данные (особенно из больших таблиц) не есть гуд, часто их помечают как удаленные.
10. Можно делать выводы,
а. удаление рук (средствами Админа или ХМ) не удаляет их по факту, а только помечает как удаленное, чтобы база не обращалась к этим данным. Уменьшение базы достигается именно за счет вакуума и индексации базы, а также простого создания новой базы с нужным количеством нужных нам рук.
б. не зная структуры построения таблиц в базе ХМ и зависимости одних данных от других любое удаление одних данных, без удаления данных, логически связанных с ними, может привести к нестабильности работы всей базы, поэтому перед попытками экспериментов с базой нужно сделать бэкап.
в. удаление ненужных данных, без последствия для базы данных, возможно при наличии у человека глубоких знаниями.
рекомендации сисадмина для желающих попотеть над темой тотального удаления чего либо из базы:
1-е - выяснить, насколько педантично ссконструирована схема БД. т.е. просмотреть все таблицы на предмет наличия связей объектов БД, повторяющих логические связи её модели. А именно - Форей'н кеев и Рилейшенов(ссылок).
(правильно выполненная БД должна в вашем случае содержать ФК/Ссылки с типом ON DELETE NO ACTION (то же самое - RESTRICT) - т.е. упираться при попытке заведомо неверных действий соучайно кривого интерфейса/муд@ка-администратора)
2. в любом случае (отсутствия/наличия установленных над таблицами связей по ключам логической связности) отследить все зависимые таблицы, и обдумать, что вы теряете при удалении такого данного (например у вас могут найтись таблицы кросс-сведений о стычках удаляемых и неудалямых игроков. нужны ли они вам - т.е. не грохнет ли ваше удаление и всю логику интерфейсов/модели игры/бд и по оставляемым игрокам).
3. И только убедившись, что всё решаемо (а не зная логику модели игры, прошитую как в БД так и в интерфейсах и т.п. вы этого не сделаете в точности) - можно приниматься за удаление данных. В зависимости от типов и количества наложенных на БД связей. Причем самих игроков можно и не удалять - их заведомо меньше, чам дейсвтий и прочих подчинённых данных.