2010-09-10 2 views
1

Я начал проект 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 такой же, как операция удаления?

+1

Если вам нужна история, измените значение MarkForDeletion на дату. Многие системы, которые я разработал, должны отслеживать информацию в течение многих лет, даже если они «удалены». –

+1

@ Дэйв: +1. nullable smalldatetime отлично работает для меня в этом отношении. Для внутренних систем даже «deletedByUserName». Черт, даже переходите к таблице аудита вообще. :) –

+0

@Dave: в этом случае MarkForDeletion будет представлять дату, когда элемент был «удален», если я правильно понял. Но каково было бы влияние на db? Значение обновления быстрее, чем удаление? С моей точки зрения, это все еще операция доступа к базе данных. –

ответ

2

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

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

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

  • масса удалить Vs.
  • обновить bit или smalldatetime поля vs.
  • перейти на таблицу аудита

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

2

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

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

Смежные вопросы