执行速度问题,急!!!!!!!

swxandwf 2009-05-20 01:42:40
我想问一个问题,我在2000里面,执行一个语句:select *from v_kjsxx_jsdd where d_id in (select d_id from v_zcxx),几乎是死机状态,但在2005里面,执行一样的语句,只需要2秒钟,数据量一样,表结构一样,但为什么会这样的呢?我运行select *from v_kjsxx_jsdd,那是很快的,运行select d_id from v_zcxx ,也是很快的,但在一起了就这么慢,真是奇怪了,记得那时候,将2000换2005,就是这么个原因才换的,大概看了一下,select *from v_kjsxx_jsdd,里面的排序,并不是按d_id来排序的.另外,我的视图,v_zcxx,里面有where,只是说,把where取消掉之后,整个一个执行时间会短很多,为什么?请知情人员告知,谢谢
...全文
160 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fbmsyu 2009-05-22
  • 打赏
  • 举报
回复
说实话,你这个题目,很难.
HVIVIP 2009-05-21
  • 打赏
  • 举报
回复
关注中。。。
IamstudyingJava 2009-05-21
  • 打赏
  • 举报
回复
sql在执行sql语句时,会事先将sql语句转化为语法树,然后在进行优化,2000与2005的执行速度不同,可能是他们内部的优化机制不同。
dongweidv83 2009-05-21
  • 打赏
  • 举报
回复
执行下这个查看下消息
set statistics io on
select *from v_kjsxx_jsdd where d_id in (select d_id from v_zcxx)
select *from v_kjsxx_jsdd where d_id exists(select 1 from v_zcxx where d_id=a.d_id)
set statistics io off


我测试了一下 很明显 exists效率要高
set statistics io on
select * from sysobjects where exists (select 1 from syscolumns where id=syscolumns.id)
select * from sysobjects where id in (select id from syscolumns )
set statistics io off


(所影响的行数为 383 行)

表 'syscolumns'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
表 'sysobjects'。扫描计数 1,逻辑读 8 次,物理读 0 次,预读 0 次。

(所影响的行数为 154 行)

表 'sysobjects'。扫描计数 154,逻辑读 308 次,物理读 0 次,预读 0 次。
表 'syscolumns'。扫描计数 1,逻辑读 15 次,物理读 0 次,预读 0 次。
tengjian1981 2009-05-21
  • 打赏
  • 举报
回复



select a.* from v_kjsxx_jsdd a
inner join (select distinct id from v_zcxx) b on b.d_id=a.d_id



swxandwf 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cbgn 的回复:]
兄弟,这样应该可以呀。
select a.* from v_kjsxx_jsdd a
inner join v_zcxx b on b.d_id=a.d_id
[/Quote]


你这样是做关联了,我其实还有很多查询语句在v_zcxx上面的,这样肯定是不行的,你那样,记录会增加的
zhengduan964532 2009-05-20
  • 打赏
  • 举报
回复
gz
cbgn 2009-05-20
  • 打赏
  • 举报
回复
兄弟,这样应该可以呀。
select a.* from v_kjsxx_jsdd a
inner join v_zcxx b on b.d_id=a.d_id
zhengduan964532 2009-05-20
  • 打赏
  • 举报
回复
关注此问题。。。。。。。。。。。
swxandwf 2009-05-20
  • 打赏
  • 举报
回复
兄弟,用表建立可能达不到我要的那个要求
cbgn 2009-05-20
  • 打赏
  • 举报
回复
能用表连接的就不要用子查询。
swxandwf 2009-05-20
  • 打赏
  • 举报
回复
兄弟,以前这个库就是2005的,然后我把它搞到2000上面来了,其他都没有问题,就这个视图差别会有这么大,D_id上,已经建立了索引了,但还是很慢,优化视图的话,我想再怎么样,也不可能差这么多的呀
fbmsyu 2009-05-20
  • 打赏
  • 举报
回复
select *from v_kjsxx_jsdd,里面的排序,并不是按d_id来排序的
说明并不是按照d_id,应该建立d_id的聚集索引,以提高性能.
如果不显示建立索引,sql会默认按照主键顺序存储数据,但也有例外的情况,所以不应该依赖
sql隐式的索引,应该显示的指定索引.
因此,sql2000下可能不知什么原因没有按照d_id物理存储数据,而sql2005下面恰好按照物理顺序存储了数据.
造成了速度不一致.
由于是视图,就去给视图的基本表建立索引.
JonasFeng 2009-05-20
  • 打赏
  • 举报
回复
如果表结构一样,数据一样,不可能出现这么大的差距的。

楼主应该对视图进行下优化。

建议在d_id对应的表加上D_ID索引。

然后楼主再测试下,估计会好很多。


如果还是不行。楼主要去看看两个之间到底是那些地方不同
sdhdy 2009-05-20
  • 打赏
  • 举报
回复
select a.* from v_kjsxx_jsdd a  
inner join v_zcxx b on b.d_id=a.d_id
swxandwf 2009-05-20
  • 打赏
  • 举报
回复
楼上的兄弟,还是一样呀,郁闷死了
sdhdy 2009-05-20
  • 打赏
  • 举报
回复
--尽量不要用in,效率很差的,用exists试试。
select *from v_kjsxx_jsdd a where exists(select 1 from v_zcxx where d_id=a.d_id
swxandwf 2009-05-20
  • 打赏
  • 举报
回复
不好意思,没有说清楚,v_kjsxx_jsdd与v_zcxx,都是视图
贾桂权 2009-05-20
  • 打赏
  • 举报
回复
建议为表v_kjsxx_jsdd的d_id加上索引。

并使用以下语句替换你原来的语句:
select * from v_kjsxx_jsdd a where exists(select 1 from v_zcxx where d_id=a.d_id)
SQL77 2009-05-20
  • 打赏
  • 举报
回复
加个索引试试??
要不然用EXISTS试试?

34,873

社区成员

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

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