求一个视图查询的效率,困扰两天了。。。求解,在线等。。。。。。
我有一个视图,视图内是三张表的联合
表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
用上面这两个是在查询数据时,效率是非常低的