В последнее время я делаю все возможное, чтобы найти лучший способ запуска определенных запросов в SQL, который потенциально может быть выполнен несколькими различными способами. Среди моих исследований я встретил довольно много ненависти к концепции WHERE IN из-за присущей неэффективности в том, как она работает.
например: WHERE Col IN (val1, val2, val3)
В моем текущем проекте я делаю UPDATE на большом наборе данных, и мне интересно, какая из следующих функций более эффективна: (или существует ли лучший вариант)
UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (id1, id2, id3 ....);
В приведенном выше списке идентификатор может содержать до 1,5 тыс. идентификаторов.
VS
Цитирование по всему идентификатору в коде и выполнение для каждого из следующих операторов:
UPDATE table1 SET somecolumn = 'someVal' WHERE ID = 'theID';
Мне кажется, что более логично, что первый будет работать лучше/быстрее, потому что меньше запросов для запуска. Тем не менее, я не на 100% знаком с входом и выходом из SQL и как работает очередь запросов.
Я также не уверен относительно того, что было бы более дружелюбным в БД до блокировки таблиц и другой общей производительности.
Общая информация в случае, если это помогает, я использую Microsoft SQL Server 2014, а основным языком разработки является С#.
Любая помощь очень ценится.
EDIT:
Вариант 3:
UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (SELECT ID FROM @definedTable);
В приведенном выше примере @definedTable представляет собой SQL 'User Defined Table Type', где внутренние данные передаются в хранимую процедуру как (в С#) тип SqlDbType.Structured
Люди спрашивают, как приходит идентификатор:
ID находятся в List<string>
в коде и используются для других вещей в коде, а затем отправляются в хранимую процедуру. В настоящее время идентификатор входит в хранимую процедуру как "Пользовательский тип таблицы" с одним столбцом (ID).
Я думал, что иметь их в таблице может быть лучше, чем код конкатенировать массивную строку и просто плюнуть в SP как переменную, которая выглядит как id1, id2, id3, id4
и т.д.