1、关于in 与not in
一般在用于子查询时,用in或not in时,以小表查大表的模式,大表的相关字段设好索引,速度比较快,读操作较少,费时也低。如:
select * from 小表 where ID in (select 大表中的字段 from 大表)
如果反之,用大表查小表时,读操作是上百倍,费时高。
需要注意的是,至少是在sql server2005中,在设置好索引后,in 与exists的效率比较,似乎没有区别!这可能是自动优化了in查询,甚至可能是转化成更有效率的语句有关。如:
A:SELECT 小组编码,小组名称
FROM 小组表 where exists (select * from 登记表 where 登记表.小组=小组表.小组编码 )
B:SELECT 小组编码,小组名称
FROM 小组表 where 小组编码 in (select 登记表.小组 from 登记表)
二者的reads居然一致为69,费时同为5。其中,登记表记录为12万条,小组表记录30条。小组字段为索引。
2、关于索引
表大了后,最好设置索引。特别是在一些重复性较高的字段上设置索引后,查询速度相差极大,高时差几十倍。如户籍管理中,所属县、所属乡镇等字段上。
反而是只有几十条、几百条记录的小表上,设置索引未必提高效率,甚至有时还降低许多。
3、表变量建主键
declare @tab_sa table (
ID int IDENTITY(1,1) NOT NULL,
CD char(8)
,NAME nvarchar(25)
primary key(id)
)