SQL查询的效率

来源:互联网 发布:vb.net 连接sql数据库 编辑:程序博客网 时间:2024/05/18 01:10

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)
)