我想问一个问题,我在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取消掉之后,整个一个执行时间会短很多,为什么?请知情人员告知,谢谢
解决方案 »
- 需要解决sql问题的补充,3表组合查询,挑战!
- 求一语句
- 索引,主键
- reporting service 2005 开发报表遇到 可变列的问题
- 我想查到有NULL就输出'',不是NULL就输出原来的值,应该怎么样?
- 后台数据库被删除,那位大侠帮忙恢复下数据,在线急等.
- 收缩数据库时发生错误
- SQL高手看过来,高分求一句从双表中取值的SQL语句
- 一个日期转换的小问题
- 安装sql出错!Command line option syntax error. Type Command/? for help.在线等!
- SQL Server2005字段设置不允许为空,但是输入空格怎么可以更新了呢?
- SQl语句问题
要不然用EXISTS试试?
select * from v_kjsxx_jsdd a where exists(select 1 from v_zcxx where d_id=a.d_id)
select *from v_kjsxx_jsdd a where exists(select 1 from v_zcxx where d_id=a.d_id
inner join v_zcxx b on b.d_id=a.d_id
如果还是不行。楼主要去看看两个之间到底是那些地方不同
说明并不是按照d_id,应该建立d_id的聚集索引,以提高性能.
如果不显示建立索引,sql会默认按照主键顺序存储数据,但也有例外的情况,所以不应该依赖
sql隐式的索引,应该显示的指定索引.
因此,sql2000下可能不知什么原因没有按照d_id物理存储数据,而sql2005下面恰好按照物理顺序存储了数据.
造成了速度不一致.
由于是视图,就去给视图的基本表建立索引.
select a.* from v_kjsxx_jsdd a
inner join v_zcxx b on b.d_id=a.d_id
select a.* from v_kjsxx_jsdd a
inner join (select distinct id from v_zcxx) b on b.d_id=a.d_id
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 次。