求教一个SQL语句的写法,大表与小表的差异

天天学习哦 2015-07-29 10:44:06
一个大视图 View1,数百万条记录 col1 ,col2,col3,col4 ,col5 ,col6
一个小表 table2 ,数万条记录 col2, col3,col4,col5 ,col6

我要求view1中符合某个条件的集合(例如col2>1),减去table2中符合某个条件的集合(例如col2>10),并且view1与table2其中几列的值要相等,例如col3,col4,col5,col6都要相等,
要列出view1的所有列来
我是这么写的

select * from view1 a inner join
( select ,col3,col4 ,col5 ,col6 from view1 where col2>=1 except
select col3,col4, col5 ,col6 from table2 where col2 >=10 ) c on
A.col3=C.col3 and
A.col4=C.col4 and
A.col5=C.col5 AND
a.col6 =c.col6
我知道这样写很笨,运行起来很慢,过了半小时都没有出结果。
请大家帮帮我,该怎么写呢?
...全文
389 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 u012141939 的回复:] 可是我把两个表的col2,col3,col4,col5,col6都加了索引,却还是半小时出不来。[/Quote]
-- 要用复合索引
CREATE INDEX IX_view1
ON view1 (col3,col4,col5,col6,col2);

CREATE INDEX IX_tabl2
ON tabl2 (col3,col4,col5,col6,col2);

-- 查询
SELECT *
FROM view1 a
WHERE EXISTS (SELECT *
FROM view1 a1
WHERE a1.col3 = a.col3
AND a1.col4 = a.col4
AND a1.col5 = a.col5
AND a1.col6 = a.col6
AND a1.col2 >= 1
)
AND NOT EXISTS (SELECT *
FROM tabl2 b
WHERE b.col3 = a.col3
AND b.col4 = a.col4
AND b.col5 = a.col5
AND b.col6 = a.col6
AND b.col2 >= 10
)
gw6328 2015-08-24
  • 打赏
  • 举报
回复
引用 6 楼 u012141939 的回复:
"直接在表上操作,不要在两个视图上来查。" ------------那个视图中的列,没有在一个表里头
正是这一点的问题,如果在表里面说不定你还可以用索引,这种字段一定慢。 可能从结构设计方面找问题。为什么会出现这种。
限量的蓝天 2015-08-23
  • 打赏
  • 举报
回复
在最后on后面加上条件 and a. col2>=1
yooq_csdn 2015-08-19
  • 打赏
  • 举报
回复

 on
A.col3=C.col3  and 
A.col4=C.col4  and 
A.col5=C.col5  AND 
a.col6 =c.col6
少了 A.col2=C.col2 ?
天天学习哦 2015-08-19
  • 打赏
  • 举报
回复
"直接在表上操作,不要在两个视图上来查。" ------------那个视图中的列,没有在一个表里头
许晨旭 2015-07-30
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
view1 这个视图,被扫描了 2 次。 你换成
select * from view1 v
where v.col2>1
and not exists(select * from table2 t where v.col3 = t.col3 and .....)
select * from view1 v
where v.col2>1
and not exists(select 1  from table2 t where v.col3 = t.col3 and .....)
这个方法挺好的,应该会提高查询效率 关于exists的效率问题请见http://www.cnblogs.com/ndxsdhy/archive/2010/12/11/1902904.html
卖水果的net 版主 2015-07-30
  • 打赏
  • 举报
回复
view1 这个视图,被扫描了 2 次。 你换成
select * from view1 v
where v.col2>1
and not exists(select * from table2 t where v.col3 = t.col3 and .....)
天天学习哦 2015-07-30
  • 打赏
  • 举报
回复
语句没问题吗? 可是我把两个表的col2,col3,col4,col5,col6都加了索引,却还是半小时出不来。 我觉得是不是应该有效率高的写法
shoppo0505 2015-07-30
  • 打赏
  • 举报
回复
语句没问题,添加index看看
gw6328 2015-07-30
  • 打赏
  • 举报
回复
直接在表上操作,不要在两个视图上来查。

34,588

社区成员

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

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