Как повысить производительность при удалении сущностей из базы данных? - PullRequest
1 голос
/ 10 сентября 2010

Я запустил проект ASP.NET с Entity Framework 4 для моего DAL, используя SQL Server 2008. В моей базе данных у меня есть таблица Users, в которой должно быть много строк (например, 5.000.000).

Изначально моя таблица «Пользователи» была разработана следующим образом:

Id  uniqueidentifier    
Name    nvarchar(128)   
Password    nvarchar(128)
Email   nvarchar(128)
Role_Id int 
Status_Id   int

Я изменил свою таблицу и добавил столбец MarkedForDeletion:

Id  uniqueidentifier    
Name    nvarchar(128)   
Password    nvarchar(128)
Email   nvarchar(128)
Role_Id int 
Status_Id   int 
MarkedForDeletion   bit

Следует ли удалять всекаждый раз или используйте атрибут MarkedForDeletion.Это означает, что мне нужно обновить значение и в какой-то момент времени удалить всех пользователей со значением, установленным в true, с помощью хранимой процедуры или чего-то подобного.

Разве обновление атрибута MarkedForDeletion не будет стоить столько же, сколько операция удаления?

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010

В зависимости от требований / потребностей / будущих потребностей вашей системы рассмотрите возможность перемещения ваших «удаленных» объектов в новую таблицу.Настройте таблицу аудита для хранения удаленных.Рассмотрим случай, когда кто-то хочет что-то «восстановить».

К вашему вопросу о производительности: будет ли обновление стоить столько же, сколько удаление?Нет. Обновление будет намного более легкой операцией, особенно если у вас есть индекс на ПК (errrr, это guid, а не int).Дело в том, что обновление битового поля намного дешевле.(Массовое) удаление приведет к перестановке данных.Возможно, эта работа принадлежит во время простоя или периода низкого объема.

Что касается производительности: сравните ее, чтобы увидеть, что происходит!Учитывая, что в вашей таблице 5 миллионов строк, было бы неплохо увидеть, как работает ваш SQL Server в его текущем состоянии индексов, подкачки страниц и т. Д. В обоих сценариях.Сделайте резервную копию вашей базы данных и восстановите ее в новую базу данных.Здесь вы можете песочнице, как вам нравится.Запустите и рассчитайте сценарии:

  • массовое удаление по сравнению с
  • обновление поля bit или smalldatetime по сравнению с
  • перемещение в таблицу аудита

С точки зрения книг, попробуйте:

2 голосов
/ 10 сентября 2010

Это может зависеть от того, что вы хотите делать с информацией. Например, вы можете пометить пользователя для удаления, но не удалить все его дочерние записи (скажем, что-то вроде сообщений на форуме), в этом случае вам следует пометить удаление или использовать поле даты с удалением. Если вы сделаете это, создайте представление для использования для всех активных пользователей (называемое ActiveUsers), а затем настаивайте на том, чтобы представление использовалось в любом запросе на вход в систему или там, где вы хотите видеть только активных пользователей. Это поможет предотвратить ошибки запроса, когда вы забудете исключить неактивные. Если ваша система активна, не вносите это изменение, не пройдя и не настроив все запросы, которые должны использовать новое представление.

Другая причина использования второй версии - предотвращение замедления при удалении большого количества дочерних записей. Их больше не нужно удалять, если вы используете удаленный флаг. Это может помочь производительности, потому что требуется меньше ресурсов. Кроме того, вы можете пометить записи для удаления, а затем добавить их в середине ночи (или перейти к таблице истории), чтобы уменьшить размер основных таблиц, но при этом не повлиять на производительность в часы пик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...