请教大家一个性能方面的问题

gogodiy 2011-01-20 03:39:55
在实际应用中有这么一种情况:

declare @userid varchar(2000),
@sqlstr varchar(4000)
set @userid='101,102,103,104,......199'

现在要使用动态SQL根据@userid所包含的值去表A查找记录,有两种常用方法:
方法1:

set @sqlstr='select * from 表a where 字段a in ('+@userid+')'

方法2:

CREATE TABLE #T1
(
userid INT
)

SET @userid=REPLACE(@userid,',',' UNION ALL SELECT ')

EXEC ('INSERT INTO #T1 SELECT ' + @userid)

SET @sqlstr=' select * from 表a where 字段a in (
SELECT userid
FROM #T1
)'


我想请教的是,这两种方法哪种性能最好?尤其是当@userid里包含大量值的时候。
目前手头没有测试环境,所以特来请教各位。
...全文
148 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogodiy 2011-01-20
  • 打赏
  • 举报
回复
谢谢大家,公司里测试了下,IN的效果确实最差。
afoiwf 2011-01-20
  • 打赏
  • 举报
回复
IN的性能很差,建议把userid插入临时表,然后用jion会有性能提升
dawugui 2011-01-20
  • 打赏
  • 举报
回复
最好的办法是把这个类似:'101,102,103,104,......199'的数据做成表,然后进行关联查询.
叶子 2011-01-20
  • 打赏
  • 举报
回复

declare @table table (id int,col varchar(1))
insert into @table
select 101,'a' union all
select 201,'b' union all
select 301,'c' union all
select 409,'d'

declare @userid varchar(2000),
@sqlstr varchar(4000)
set @userid='201,102,301,104,199'

SELECT * FROM @table
WHERE CHARINDEX(','+CAST(id AS VARCHAR(4))+',',','+@userid+',')>0
/*
id col
----------- ----
201 b
301 c
*/

这种设计,性能都好不了哪去,但是in的效果实在是不行。
华夏小卒 2011-01-20
  • 打赏
  • 举报
回复
如果你的第二种,像你这么写的话,我看就用第一种算了


如果改成JOIN 的形式,我看还有的一比

SET @sqlstr=' select a.* from 表a a,#t1 b where a.字段a=b.userid'
AcHerat 元老 2011-01-20
  • 打赏
  • 举报
回复
如果硬要说哪个的性能相对好些,我觉得应该是1吧!

反正只要用到in,数据量小还行,大了得慢慢折腾了。
Shawn 2011-01-20
  • 打赏
  • 举报
回复
#1. 至于你是用字符串拼IN后面的条件,或用临时表,性能差别不大
#2. 关键是你用IN查询,性能会很差

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧