Я использую SQL Server 2005. Существует таблица журнала аудита, содержа более чем 1 000 000 000 строк. Я планирую заархивировать эту таблицу. Когда я делаю простой выбор с помощью nolock
, Я могу все еще найти блокирование (вероятно, IO, блокирующийся с другим процессом?). Так есть ли какая-либо лучшая практика для этого вида ситуации?
Для такой большой таблицы вам может потребоваться найти эффективную стратегию сегментирования / разделения. Архивирование в этом смысле имеет тенденцию быть формой разбиения, но не очень хорошо, так как вы часто хотите запросить текущий и архивировать в любом случае. В худшем случае вы получите ВЫБОР над ОБЪЕДИНЕНИЕМ архивных и текущих таблиц, что хуже, чем если бы вы их вообще не разделяли.
Вам часто будет лучше, если вы найдете какие-то другие средства для разделения данных, скажем, по типу записи или чему-то еще. Но если вы собираетесь разделить его по дате, убедитесь, что вы не будете запрашивать архив + текущий набор данных.
Кроме того, SQL Server 2005+ по умолчанию не включает MVCC. Однако он может это сделать, если вы включите то, что MS называет изоляцией моментальных снимков. См. Сериализуемый и уровень изоляции моментальных снимков .
Эффект от не включения этого параметра состоит в том, что незафиксированный INSERT или UPDATE блокирует SELECT в другой транзакции до тех пор, пока первая транзакция не будет зафиксирована или откатится. Это может вызвать ненужные блокировки и ограничить масштабируемость.
Выбор сразу 1 миллиарда строк приведет к перегрузке сервера, как бы вы это ни делали.
Вместо этого делайте это партиями, скажем, по 1000 строк за раз. Инструмент bcp делает это автоматически. Или используйте SSIS для копирования данных в другую базу данных - это почти то же самое.
Создайте резервную копию базы данных и восстановите ее в месте архива.