Обновить строки в таблице с большим количеством столбцов - PullRequest
2 голосов
/ 20 августа 2009

У меня есть таблица (на самом деле несколько), которая содержит много столбцов (возможно, 100+). Что лучше всего повысить производительность при обновлении строк в таблице, если было изменено только несколько столбцов.

  1. Для динамического построения оператора UPDATE обновляются только измененные столбцы.
  2. Чтобы создать параметризованный оператор UPDATE, содержащий все столбцы, включая те, которые не изменились.
  3. Чтобы создать процедуру, которая принимает ВСЕ значения в качестве параметров и обновляет строку.

Я использую SQL Server. В таблице нет BLOB-объектов.

Спасибо / M

Ответы [ 3 ]

4 голосов
/ 20 августа 2009

Я бы сказал, что числа 2 и 3 эквивалентны с точки зрения производительности. Если вы используете PK, чтобы выяснить, какую строку нужно обновить, и это кластеризованный ключ, то я не буду беспокоиться об обновлении столбца до самого себя. Проблема с 1-й ситуацией заключается в том, что вы будете вызывать «раздувание кэша процедур», когда у вас будет много похожих планов, которые все будут занимать ваш кэш планов, потому что они представляют собой несколько другую итерацию обновления.

Если вы планируете делать массовые обновления, я, возможно, не рекомендую обновлять все столбцы, так как это может привести к поискам FK и т. Д.

Спасибо, Eric

1 голос
/ 20 августа 2009

Варианты 2 и 3 требуют больше данных, передаваемых на сервер при обновлении, и, следовательно, имеют большие накладные расходы на связь только для данных.

Имеет ли каждая строка свой набор обновленных столбцов или же набор столбцов обновляется одинаково для любого заданного прогона (но список может варьироваться от прогона к прогону)?

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

В первом случае я хотел бы посмотреть, есть ли относительно небольшое подмножество столбцов, которые изменяются (скажем, 10 столбцов, которые изменяются в разных строках, даже если какая-то одна строка изменяется только до 3 из этих 10 ). В этом случае я бы, вероятно, выполнил параметризацию для 10 столбцов, принимая относительно небольшие накладные расходы на передачу значений 7-9 столбцов, которые не изменились для удобства одного подготовленного оператора. Если набор обновленных столбцов находится по всей карте (скажем, более 50 из 100 столбцов обновляются за всю операцию), то, вероятно, проще иметь дело со всем лотом.

В некоторой степени это зависит от того, насколько легко ваш хост-язык (клиентский API) позволяет обрабатывать различные возможные способы параметризации обновлений.

0 голосов
/ 20 августа 2009

Я бы проголосовал за p.1, смешанный с p.2, то есть динамически построить параметризованный оператор UPDATE, который будет обновлять только измененные столбцы. Это будет работать в том случае, когда ваша скорость чтения / записи находится на стороне «чтения», и вы не выполняете обновления слишком часто, поэтому мы можем безопасно обменяться кэшем плана запросов на (физическую) производительность обновления.

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