【发布时间】:2015-10-19 01:04:22
【问题描述】:
我最近正在尽最大努力寻找在 SQL 中运行某些查询的最佳方法,这些查询可能会以多种不同的方式完成。在我的研究中,由于 WHERE IN 的工作方式固有的低效率,我对 WHERE IN 概念感到非常厌恶。
例如:WHERE Col IN (val1, val2, val3)
在我当前的项目中,我正在对大量数据进行更新,我想知道以下哪一项更有效:(或是否存在更好的选择)
UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (id1, id2, id3 ....);
在上面,ID 列表最多可以有 1.5k 个 ID。
VS
循环遍历代码中的所有 ID,并为每个 ID 运行以下语句:
UPDATE table1 SET somecolumn = 'someVal' WHERE ID = 'theID';
对我来说,前者工作得更好/更快似乎更合乎逻辑,因为要运行的查询更少。也就是说,我不是 100% 熟悉 SQL 的进出以及查询队列的工作原理。
我也不确定在表锁和其他一般性能方面哪个对数据库更友好。
一般信息以防万一,我使用的是 Microsoft SQL Server 2014,主要开发语言是 C#。
非常感谢任何帮助。
编辑:
选项 3:
UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (SELECT ID FROM @definedTable);
在上面,@definedTable 是一个 SQL '用户定义的表类型',其中的数据通过存储过程作为(在 C# 中)类型 SqlDbType.Structured
人们在问身份证是怎么进来的:
ID 在代码中的List<string> 中,用于代码中的其他内容,然后再发送到存储过程。目前,ID 将作为只有一列 (ID) 的“用户定义的表类型”进入存储过程。
我认为将它们放在一个表中可能比让代码连接一个大字符串并将其作为一个看起来像 id1, id2, id3, id4 等的变量吐到 SP 中更好
【问题讨论】:
-
您是否尝试查看两个查询中哪个更快的执行计划?
-
id1,id2,id3 是从哪里来的?在大多数实际情况下,它们来自另一个表,这是在某些条件下过滤的结果。在这种情况下,您最好加入该表,以获得不错的性能。
-
如何将这些 ID 传递给 SQL?您的 C# 代码中是否有值列表,或者您是否通过另一个 SQL 查询获得它们?
-
对于 1.5k 个 ID,可能值得先将它们存储在(临时)表中,然后执行
WHERE ID IN (SELECT ID FROM temptable) -
把它们放在一张桌子上肯定更好。你只能有大约 2000 个参数,一旦你有更多的参数,你的 sp 就会中断。但是UDT没有这样的问题。
标签: sql sql-server