SQL UPDATE WHERE IN(List)或UPDATE各自单独?

Sea*_*ham 23 sql sql-server

我最近正在努力寻找在SQL中运行某些查询的最佳方法,这些查询有可能以多种不同的方式完成.在我的研究中,我对WHERE IN概念产生了很多讨厌,因为它的工作原理固有的低效率.

例如: WHERE Col IN (val1, val2, val3)

在我当前的项目中,我正在对大量数据进行更新,并且我想知道以下哪个更有效:(或者是否存在更好的选项)

UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (id1, id2, id3 ....);
Run Code Online (Sandbox Code Playgroud)

在上面,ID的列表最多可达1.5k ID.

VS

循环遍历代码中的所有ID,并为每个ID运行以下语句:

UPDATE table1 SET somecolumn = 'someVal' WHERE ID = 'theID';
Run Code Online (Sandbox Code Playgroud)

对我自己而言,前者更好/更快地工作似乎更合乎逻辑,因为运行的查询更少.也就是说,我不是100%熟悉SQL的输入和输出以及查询排队的工作方式.

我还不确定在表锁和其他一般性能方面哪个数据库更友好.

一般信息,如果有帮助,我使用Microsoft SQL Server 2014,主要开发语言是C#.

任何帮助深表感谢.

编辑:

选项3:

UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (SELECT ID FROM @definedTable);
Run Code Online (Sandbox Code Playgroud)

在上面,@ defineTable是一个SQL'用户定义表类型',其中内部数据以(在C#中)类型SqlDbType.Structured进入存储过程.

人们正在询问ID是如何进入的:ID List<string>位于代码中,并且在用于代码中的其他内容之前被发送到存储过程.目前,ID作为"用户定义的表类型"进入存储过程,只有一列(ID).

我以为让他们在一个表中可能会比具有代码连接一个庞大的字符串,然后吐入SP的,看起来像一个变量更好id1, id2, id3, id4

Vla*_*nov 13

我正在使用你的第三个选项,效果很好.

我的存储过程有一个表值参数.另请参见使用表值参数.

在程序中有一个声明,没有循环,就像你说的:

UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (SELECT ID FROM @definedTable);
Run Code Online (Sandbox Code Playgroud)

最好一次调用该程序一次,超过1500次.最好有一笔交易,而不是1,500笔交易.

如果行中的行数@definedTable超过10K,我会考虑将它分成10K批量.


您的第一个变体可以在IN子句中使用少量值,但是当您达到非常高的数字(60K +)时,您可以看到类似这样的内容,如下面的答案所示:

消息8623,级别16,状态1,行1查询处理器耗尽内部资源,无法生成查询计划.这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询.请简化查询.如果您认为错误地收到了此消息,请与客户支持服务联系以获取更多信息.