1.两表连查 共同点 都有id 一个id是int类型 一个id是nvarchar
select a.name,sum(b.chengji) from a,b where a.id=b.id and a.name not in ('0',null)
耗时:32秒
经过csdn大神指点之后
改善:
select a.name,sum(b.chengji) from a,b where a.id=b.id and a.name <>'0' and a.name is not null
耗时:32秒
发现还是那么慢
后来百度 google 研究表结构 发现 两表中的id类型不同 突然脑海浮现 id和字符类型 速度慢
id nvarchar--> id int
然后子啊
select a.name,sum(b.chengji) from a,b where a.id=b.id and a.name <>'0' and a.name is not null
耗时:200毫秒
////////////////
1.转换字符的函数:cast(id as int ) 优先于 convert(int ,id)
2.尽量不要用 not in
3.如果列很多 那么使用 no texists
4.在两张表比较 的那列数据加上聚集索引更快(请问下 聚集索引 是不是等于 群集索引呢?)
5.注意细节
----------------可爱的分割线--------------
关于组合索引
我有一张视图 大概就是这样
select a.name,a.sex,a.address,sum(b.qw1),sum(b.qw2),sum(c.qw3),sum(d.qw4) from a,b,c,d where a.id=b.id and a.id=c.id and a.id=d.id group by a.name,a.sex,a.address
这里应该使用组合索引
因为name最常用 sex次之,address再次之
所以建立组合索引应该这样: 加上复合索引,并各自再设置一个独立索引
create index IX_name_sex_address_表 on 表(name,sex,address)
create index IX_name_表 on 表(name)
create index IX_sex_表 on 表(sex)
create index IX_address_表 on 表(address)
参考:http://topic.csdn.net/t/20040330/13/2903545.html
提到in用exists或者这样
select * from spt_values where number in (1,2,4) select spt.* from spt_values as spt join( select number=1 union all select number=2 union all select number=4 )b on spt.number=b.number --可以这样简写 --select spt.* from spt_values as spt join( -- select number=1 -- union all select 2 -- union all select 4 --)b on spt.number=b.number