这两种方式哪种效率更高呢?

panxiaosen 2011-04-02 02:44:35
下面两种方式哪种效率更高呢??

--方式一:
SELECT UserID FROM UserTable WHERE ClientIp in (SELECT ClientIp FROM LoginTable WHERE USERID=1234)
UNION ALL
SELECT UserID FROM UserTable1 WHERE ClientIp in (SELECT ClientIp FROM LoginTable WHERE USERID=1234)
UNION ALL
SELECT UserID FROM UserTable2 WHERE ClientIp in (SELECT ClientIp FROM LoginTable WHERE USERID=1234)
UNION ALL
SELECT UserID FROM UserTable3 WHERE ClientIp in (SELECT ClientIp FROM LoginTable WHERE USERID=1234)
UNION ALL
SELECT UserID FROM UserTable4 WHERE ClientIp in (SELECT ClientIp FROM LoginTable WHERE USERID=1234)


--方式二:
DECLARE @ClientIp VARCHAR(max)
SELECT @ClientIp =@ClientIp + QUOTENAME(ClientIp,'''')+'',''FROM LoginTable WHERE USERID=1234
--把所有的IP地址都拼接成一个字符串,然后动态执行SQL

SELECT UserID FROM UserTable WHERE ClientIp in @ClientIp
UNION ALL
SELECT UserID FROM UserTable1 WHERE ClientIp in @ClientIp
UNION ALL
SELECT UserID FROM UserTable2 WHERE ClientIp in @ClientIp
UNION ALL
SELECT UserID FROM UserTable3 WHERE ClientIp in @ClientIp
UNION ALL
SELECT UserID FROM UserTable4 WHERE ClientIp in @ClientIp


...全文
184 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
--小F-- 2011-04-02
  • 打赏
  • 举报
回复
查看执行计划来判断

预判的话速度一样
-晴天 2011-04-02
  • 打赏
  • 举报
回复
最好不要去"觉得",在企业管理器里有个显示估计的执行计划,把数据准备好,再把两条语句并列写进去执行一下,它就可以告诉你哪个效率高哪个效率低.
duoxu1983 2011-04-02
  • 打赏
  • 举报
回复
用临时表呢
dawugui 2011-04-02
  • 打赏
  • 举报
回复
从形式上看,都差不多.帮顶.
快溜 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 panxiaosen 的回复:]
引用 7 楼 acherat 的回复:
没看仔细,in后是子查询,in的开销已经有点大,如果表多的话用第二种吧!字符串比子查询性能会有优化的。


谢谢.. 如果SELECT ClientIp FROM LoginTable WHERE USERID=1234查出来的结果放到一个临时表里,
然后按下面的代码会不会好点??
SELECT UserID FROM UserTable WHE……
[/Quote]
放到临时表就可以这样,效果更好
SELECT UserID FROM UserTable , 临时表 WHERE UserTable.ClientIp=临时表.ClientIp
AcHerat 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 panxiaosen 的回复:]

引用 7 楼 acherat 的回复:
没看仔细,in后是子查询,in的开销已经有点大,如果表多的话用第二种吧!字符串比子查询性能会有优化的。


谢谢.. 如果SELECT ClientIp FROM LoginTable WHERE USERID=1234查出来的结果放到一个临时表里,
然后按下面的代码会不会好点??
SELECT UserID FROM UserTable WH……
[/Quote]

放到临时表里可行,但数据量大也没用,关键是你用到in了!
幸运的意外 2011-04-02
  • 打赏
  • 举报
回复
如果LoginTable不是很大的话,都查不错。第二种方法楼主的方法行不通,得用到exec执行才行。
panxiaosen 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ssp2009 的回复:]
引用 6 楼 panxiaosen 的回复:
引用 2 楼 acherat 的回复:
个人觉得都差不多,最终执行的都是一样的语句!


我是觉得第一个每次都要从表里搜索...貌似会不会效率低一点?
偶尔可以试试4楼的
[/Quote]

嗯....我试试,谢谢
panxiaosen 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 acherat 的回复:]
没看仔细,in后是子查询,in的开销已经有点大,如果表多的话用第二种吧!字符串比子查询性能会有优化的。
[/Quote]

谢谢.. 如果SELECT ClientIp FROM LoginTable WHERE USERID=1234查出来的结果放到一个临时表里,
然后按下面的代码会不会好点??
SELECT UserID FROM UserTable WHERE ClientIp in (SELECT ClientIp FROM 临时表)
UNION ALL
SELECT UserID FROM UserTable1 WHERE ClientIp in (SELECT ClientIp FROM 临时表)
快溜 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 panxiaosen 的回复:]
引用 2 楼 acherat 的回复:
个人觉得都差不多,最终执行的都是一样的语句!


我是觉得第一个每次都要从表里搜索...貌似会不会效率低一点?
[/Quote]偶尔可以试试4楼的
AcHerat 2011-04-02
  • 打赏
  • 举报
回复
没看仔细,in后是子查询,in的开销已经有点大,如果表多的话用第二种吧!字符串比子查询性能会有优化的。
panxiaosen 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acherat 的回复:]
个人觉得都差不多,最终执行的都是一样的语句!
[/Quote]

我是觉得第一个每次都要从表里搜索...貌似会不会效率低一点?
panxiaosen 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jinfengyiye 的回复:]
ClientIp in @ClientIp
这样能行吗?
[/Quote]
嗯..不好意思,为了简洁,我只是写了个大概

DECLARE @ClientIp VARCHAR(max)
SELECT @ClientIp =@ClientIp + QUOTENAME(ClientIp,'''')+'',''FROM LoginTable WHERE USERID=1234
SELECT @ClientIp='('+SUBSTRING(@ClientIp,1,LEN(@ClientIp)-1)+')'

--把所有的IP地址都拼接成一个字符串,然后动态执行SQL
DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL=
'SELECT UserID FROM UserTable WHERE ClientIp in ' +@ClientIp +
'UNION ALL '
'SELECT UserID FROM UserTable1 WHERE ClientIp in '+ @ClientIp +
'UNION ALL '
'SELECT UserID FROM UserTable2 WHERE ClientIp in '+ @ClientIp +
'UNION ALL '
'SELECT UserID FROM UserTable3 WHERE ClientIp in ' + @ClientIp+
'UNION ALL '
'SELECT UserID FROM UserTable4 WHERE ClientIp in '+ @ClientIp
快溜 2011-04-02
  • 打赏
  • 举报
回复
SELECT UserID FROM UserTable a,(SELECT ClientIp FROM LoginTable WHERE USERID=1234) b WHERE a.ClientIp =b.ClientIp
UNION ALL
SELECT UserID FROM UserTable1 a (SELECT ClientIp FROM LoginTable WHERE USERID=1234) b WHERE a.ClientIp =b.ClientIp
UNION ALL
SELECT UserID FROM UserTable2 a (SELECT ClientIp FROM LoginTable WHERE USERID=1234) b WHERE a.ClientIp =b.ClientIp
UNION ALL
SELECT UserID FROM UserTable3 a (SELECT ClientIp FROM LoginTable WHERE USERID=1234) b WHERE a.ClientIp =b.ClientIp
UNION ALL
SELECT UserID FROM UserTable4 a (SELECT ClientIp FROM LoginTable WHERE USERID=1234) b WHERE a.ClientIp =b.ClientIp
gw6328 2011-04-02
  • 打赏
  • 举报
回复
第一个是静态,第二个是动态。
第一个写得多,第二个写得少。

AcHerat 2011-04-02
  • 打赏
  • 举报
回复
个人觉得都差不多,最终执行的都是一样的语句!
gw6328 2011-04-02
  • 打赏
  • 举报
回复
ClientIp in @ClientIp
这样能行吗?

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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