我最近正在努力寻找在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查询处理器耗尽内部资源,无法生成查询计划.这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询.请简化查询.如果您认为错误地收到了此消息,请与客户支持服务联系以获取更多信息.