#sql #sql-server
#sql #sql-server
Вопрос:
Я хочу добавить новый столбец в таблицу Sql Server, содержащую около 20 000 строк, используя этот запрос
ALTER TABLE [db].[dbo].[table]
ADD entry_date date;
результат запроса все еще работает, до сих пор он занимает 10 минут и все еще работает, это нормально!
Комментарии:
1. Операция требует эксклюзивного доступа к таблице. Возможно, операция заблокирована другой активностью. Запустите
sp_who2
, чтобы проверить блокировку.
Ответ №1:
10 минут кажутся долгим временем, но добавление столбца требует времени.
Почему? Добавление столбца (как правило) требует изменения макета таблицы на страницах, где хранятся данные. В вашем случае дата ввода составляет 4 байта, поэтому каждую строку необходимо расширить на 4 байта — и поместить на одну страницу данных.
Добавление столбцов обычно требует перезаписи всех данных.
Также обратите внимание, что при этом также задействуются блокировки и транзакции. Таким образом, если другие действия на сервере связаны с доступом к таблице (в частности, с изменением данных), то это также влияет на производительность.
О, я упоминал, что индексы также задействованы? Индексы заботятся о физическом расположении данных.
Все это говорит о том, что 10 минут кажутся долгими для 20 000 строк. Вы можете обнаружить, что все идет намного быстрее, если вы это сделаете:
- Создайте новую таблицу с нужными вам столбцами, но без индексов, кроме первичного ключа или кластеризованного индекса.
- Вставьте данные из существующей таблицы.
- Добавьте любые индексы и триггеры, которые вы хотите.
Конечно, вы должны быть осторожны, если у вас есть identity
колонка.
Комментарии:
1. Спасибо, я обнаружил, что на другом сервере используется таблица, в которую я хочу добавить поле 🙂 Спасибо за вашу помощь