Стоимость вставок и обновления в SQL Server - PullRequest
19 голосов
/ 03 сентября 2008

У меня есть таблица с более чем миллионом строк. Эта таблица используется для индексации tiff изображений. Каждое изображение имеет такие поля, как date, number и т. Д. У меня есть пользователи, которые индексируют эти изображения партиями по 500. Мне нужно знать, лучше ли сначала вставить 500 строк, а затем выполнить 500 обновлений или, когда пользователь заканчивает индексацию, чтобы сделать 500 вставок со всеми данными. Очень важно то, что если я сначала делаю 500 вставок, это время для меня бесплатно, потому что я могу сделать это накануне вечером.

Итак, вопрос: лучше ли делать вставки или вставки и обновления и почему? Я определил значение id для каждого изображения, а также у меня есть другие индексы в полях.

Ответы [ 6 ]

32 голосов
/ 03 сентября 2008

Обновления на сервере Sql приводят к появлению скрытых строк - то есть Sql пересекает одну строку и помещает новую. Зачеркнутая строка позже удаляется.

Таким образом, как вставки, так и обновления могут вызывать расщепление страниц, они оба эффективно «добавляют» данные, просто обновления сначала помечают старые элементы.

Вдобавок к этим обновлениям сначала нужно найти строку, которая для большого количества данных может занять больше времени, чем обновление.

Вставки почти всегда будут выполняться быстрее, особенно если они расположены по порядку или если базовая таблица не имеет кластеризованного индекса.

При вставке больших объемов данных в таблицу посмотрите текущие индексы - для их изменения и построения может потребоваться некоторое время. Добавление значений в середине индекса всегда происходит медленнее.

Вы можете думать об этом, как о добавлении в адресную книгу: г-н Z можно просто добавить на последнюю страницу, а для г-на М. вам нужно будет найти место посередине.

2 голосов
/ 03 сентября 2008

Сначала делать вставки, а затем обновления, кажется, лучшая идея по нескольким причинам. Вы будете вставлять во время малого объема транзакции. Поскольку вкладки содержат больше данных, сейчас лучшее время для этого.

Поскольку вы используете значение id (которое предположительно индексируется) для обновлений, накладные расходы на обновления будут очень низкими. У вас также будет меньше данных во время ваших обновлений.

Вы также можете отключить транзакции на уровне пакета (500 вставок / обновлений) и использовать его для каждой отдельной записи, тем самым уменьшая некоторые накладные расходы.

Наконец, проверьте это, чтобы увидеть фактическую производительность на вашем сервере, прежде чем принимать окончательное решение.

1 голос
/ 03 сентября 2008

Я думаю, что вставки будут работать быстрее. Они не требуют поиска (когда вы делаете обновление, вы в основном делаете эквивалент выбора с предложением where). Кроме того, вставка не будет блокировать строки так, как обновление, поэтому она не будет вмешиваться в любые операции выбора, которые происходят одновременно с таблицей.

1 голос
/ 03 сентября 2008

Это не простой вопрос. Точки Кришны и Галегиана находятся на месте.

Для обновлений влияние будет меньше, если обновления влияют на поля фиксированной длины. При обновлении полей varchar или blob вы можете добавить стоимость разбиения страниц во время обновления, когда новое значение превышает длину старого значения.

1 голос
/ 03 сентября 2008

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

1 голос
/ 03 сентября 2008

Я не специалист по базам данных, но я думаю, что вставка за один раз будет быстрее, потому что обновления требуют поиска, а вставки - нет.

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