Пакет SQL лучше, чем использование предложения WHERE .. IN() ?

#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