#sql #sql-server
#sql #sql-server
Вопрос:
Я хочу обновить кучу строк, если совпадает определенное значение столбца.
UPDATE table_name
SET column_b = :newValue
WHERE column_a IN (value1, value2, ... valueN);
Является ли пакетная обработка SQL оптимальным вариантом для этого, чем использование предложения where in ?
@CreateSqlBatch
UPDATE table_name
SET column_b = :newValue
WHERE column_a = value1;
https://jdbi.org/apidocs/org/jdbi/v3/sqlobject/statement/SqlBatch.html
Запрос может обновляться от 1 до более тысячи строк. Я хочу, чтобы он был оптимальным при обновлении в больших масштабах (тысячи строк).
Комментарии:
1. С точки зрения производительности — обновление одной строки за раз плохо, обновление всех строк сразу может быть хорошим, обновление группы строк лучше (оптимизировано). Видите ли, чем больше вы касаетесь таблицы, тем больше ввода-вывода и, следовательно, больше времени затрачивается на работу. Итак, найдите оптимизированное решение — либо всю строку сразу, либо в связке.
2. Это зависит от того, что делает «пакетная обработка SQL». Я предполагаю, что это библиотека, которая генерирует один оператор обновления для каждого входного элемента, а затем запускает его. Это будет медленнее, но каждое отдельное обновление будет зафиксировано.
3. В этих случаях я бы даже рассмотрел возможность выбора I.
Ответ №1:
Если вы обновляете один и тот же столбец до одного и того же значения для всех строк, вероятно, лучшим направлением будет IN . Мне никогда не приходилось просматривать план запросов SQLServer для любого варианта, но я бы предположил, что этот вариант лучше, поскольку он, вероятно, найдет все строки за один прогон.
С другой стороны, хотя выполнение пакета выполняется быстрее, чем выполнение отдельных запросов, он все равно может выполнять сканирование нескольких таблиц (в зависимости от столбца, индекса и т. Д.).
В конечном счете, вы должны издеваться над данными / базой данных и просто запускать оба, чтобы увидеть.
Ответ №2:
Это зависит от вашего состояния.
Случай 1: Вы хотите обновить то же значение для определенного столбца для диапазона числовых условий, тогда вы можете написать: UPDATE table_Name SET Column_A=’ABC’ ГДЕ Column_B МЕЖДУ 1 И 20
Случай 2: если вы хотите обновить для другого условного значения, вы можете написать UPDATE table_Name SET Column_A=’ABC’, ГДЕ Column_B В (1,3,6,7)
Случай 3: если вы хотите обновить только для одного условия, тогда ОБНОВИТЕ имя_таблицы УСТАНОВИТЕ Column_A=’ABC’, ГДЕ Column_B=4