日期:2014-05-18  浏览次数:20396 次

求一个视图查询的效率,困扰两天了。。。求解,在线等。。。。。。
我有一个视图,视图内是三张表的联合
表1
表2
表3

表1的字段外键连表2的主键,表2的字段外键连表3的主键

视图内容是这样的
vw_视图
as
  select 表1.某些字段,表2.某些字段,表3.某些字段 from 表1,表2,表3 
  where 表1.**ID=表2.ID and 表2.**ID=表3.ID
go
这个视图查出来的内容是正常我想要的

问题来了
我现在要对这个视图里的内容进行分页
select top 20 * from vw_视图 
where vw_视图.表2ID in (1,2,3,4,5,6,……)
and vw_视图.ID 
not in
(
  select top 10000 ID from vw_视图 
  where vw_视图.表2ID in (1,2,3,4,5,6,……)



我单查

select top 20 * from vw_视图 
where vw_视图.表2ID in (1,2,3,4,5,6,……)



select top 10000 ID from vw_视图 
  where vw_视图.表2ID in (1,2,3,4,5,6,……)

速度都很快

可是,我现在执行
select top 20 * from vw_视图 
where vw_视图.表2ID in (1,2,3,4,5,6,……)
and vw_视图.ID 
not in
(
  select top 10000 ID from vw_视图 
  where vw_视图.表2ID in (1,2,3,4,5,6,……)


这个的时候速度非常非常慢慢
top 1000的时候只要三秒左右
top 10000的时候要十来分钟
top 100000的时候查了二十来分钟还没出来

1.这个性能应该不至于啊,求解。。。。。。。
2.当select * form vw_视图 where 字段1=条件1 and 字段2=条件2 这个中的
  where 字段1=条件1 and 字段2=条件2 条件顺序换一下,对于子查询的结果会不会有不同啊


------解决方案--------------------
可能优化选择出了问题,你看一下它的执行计划
------解决方案--------------------
做视图索引
------解决方案--------------------
应该是数据量的原因吧,再说视图本身每次使用都需要编译。
------解决方案--------------------
用存储过程试试看

------解决方案--------------------
条件顺序会影响查询速度,能用到索引的条件尽量放前面,数据库如果是2000的话not in 用not exists替换
------解决方案--------------------
对于在SQL中查询我以前看过一些
在SQL语句的条件中最好不要用in (1,2,3,4),要用Exists()
在语句中不要用Top
用上面这两个是在查询数据时,效率是非常低的