В последнее время я делаю все возможное, чтобы найти лучший способ запуска определенных запросов в SQL, который можно было бы сделать несколькими различными способами. Среди моих исследований я встретил довольно много ненависти к концепции WHERE IN из-за присущей неэффективности в том, как она работает.SQL UPDATE WHERE IN (Список) или UPDATE каждый отдельно?
например: WHERE Col IN (val1, val2, val3)
В моем текущем проекте, я делаю обновленную информацию о большом наборе данных и интересно, какие из следующих является более эффективным: (или существует ли лучший вариант)
UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (id1, id2, id3 ....);
В приведенном выше списке идентификаторов может быть до 1.5k ID.
VS
Перебор всех идентификаторов в коде, и выполнив следующую инструкцию для каждого:
UPDATE table1 SET somecolumn = 'someVal' WHERE ID = 'theID';
к себе, это кажется более логичным, что первый будет работать лучше/быстрее, потому что там меньше запросы для запуска. Тем не менее, я не на 100% знаком с in и out of SQL и как работает очередь запросов.
Я также не уверен относительно того, что было бы более дружелюбным в БД до блокировки стола и других общих характеристик.
Общая информация, если это помогает, я использую Microsoft SQL Server 2014, а основным языком разработки является C#.
Любая помощь очень ценится.
РЕДАКТИРОВАТЬ:
Вариант 3:
UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (SELECT ID FROM @definedTable);
В приведенном выше описании, @definedTable является SQL 'User Defined Тип стола', где данные внутри приходит через к хранимой процедуре, как (в C#) типа SqlDbType.Structured
Люди спрашивают, как идентификаторы бывают: идентификаторы находятся в List<string>
в коде, и используются для других вещей в коде до этого направляется в хранимую процедуру. В настоящее время идентификаторы входят в хранимую процедуру как «Пользовательский тип таблицы» с одним столбцом (идентификаторы).
Я думал, имея их в таблице может быть лучше, чем иметь код конкатенации массивную строку и просто плюя его в СП в качестве переменной, которая выглядит как id1, id2, id3, id4
и т.д.
Вы пытались просмотреть план выполнения, если это быстрее из двух запросов? – Japongskie
Откуда id1, id2, id3? В большинстве практических случаев они поступают из другой таблицы, в результате фильтрации при некоторых условиях. В этом случае вам лучше присоединиться к этому столу, чтобы получить достойную производительность. –
Как вы передаете эти идентификаторы в SQL? У вас есть список значений в коде C# или вы получаете их в результате другого SQL-запроса? – DavidG