请教高手,关于临时表或表变量问题

jlwei888 2003-04-19 09:45:54
一个存储过程
delcare @tb table(rq char(10) not null)

select rq into @tb from qs_sbb
select rq into @tb from qs_jmb
...

select * from qs_sbb where rq in( select distinct * from @tb)
这一步速度很慢 (@tb中只有几条记录)


改用临时表,而且建索引。

更慢,(中间的插入部分也变慢了,检索部分一样慢)




...全文
15 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
2003kingbear 2003-05-17
  • 打赏
  • 举报
回复
up
pengdali 2003-04-19
  • 打赏
  • 举报
回复
或这个:


select * from qs_sbb where exists (select 1 from qs_sbb where rq=qs_sbb.rq)or exists(select 1 from qs_jmb where rq=qs_sbb.rq)
pengdali 2003-04-19
  • 打赏
  • 举报
回复
这个应该最快,楼主试试:

select * from qs_sbb where exists (select 1 from (select rq from qs_sbb union all select rq from qs_jmb) tem where rq=qs_sbb.rq)
pengdali 2003-04-19
  • 打赏
  • 举报
回复
to w_rose
建索引是对的,也是关键的,但exists比join和in快!
pengdali 2003-04-19
  • 打赏
  • 举报
回复
建议不要用@表变量用临时表!
w_rose 2003-04-19
  • 打赏
  • 举报
回复
楼上:绝对错误!

假设 SQL Server 不修改查询语句,就照你写的方式查询。

@tb 表根本不能使用索引,使用索引反而降低速度。因为只有几条记录,本来读一次磁盘块就取出所有数据了。

真正的优化在于 inner join 中可以利用 qs_sbb 的rq上的索引,而你的查询根本用不到。

当然,SQL Server也许没那么笨,他很可能不会按照exists的写法进行查询的。
zhoutian618 2003-04-19
  • 打赏
  • 举报
回复
改为:
select * from qs_sbb where exists( select 1 from @tb where @tb.rq=qs_sbb.rq)

exists要比in关键字要快得多.
w_rose 2003-04-19
  • 打赏
  • 举报
回复
在 qs_sbb 表的rq 上作索引,查询会立刻得到结果。
w_rose 2003-04-19
  • 打赏
  • 举报
回复
delcare @tb table(rq char(10) primary key)

select rq into @tb from qs_sbb
select rq into @tb from qs_jmb
...

select s.* from qs_sbb as s inner join @tb as t on s.rq=t.rq
yoki 2003-04-19
  • 打赏
  • 举报
回复
select * from qs_sbb where rq in( select distinct * from @tb)
改成
select * from qs_sbb a,(select distinct rq from @tb)b
where a.rq=b.rq
试试

22,207

社区成员

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

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