SQL语句执行效率及分析(note)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQL语句执行效率及分析(note)

1.关于SQL查询效率,100w数据,查询只要1秒,与您分享:

机器情况

p4: 2.4

内存: 1 G

os: windows 2003

数据库: ms sql server 2000

目的: 查询性能测试,比较两种查询的性能

SQL查询效率step by step

-- setp 1.

-- 建表

create table t_userinfo

(

userid int identity(1,1) primary key nonclustered,

nick varchar(50) not null default '',

classid int not null default 0,

writetime datetime not null default getdate()

)

go

-- 建索引

create clustered index ix_userinfo_classid on t_userinfo(classid)

go

-- step 2.

declare @i int

declare @k int

declare @nick varchar(10)

set @i = 1

while @i<1000000

begin

set @k = @i % 10

set @nick = convert(varchar,@i)

insert into t_userinfo(nick,classid,writetime) values(@nick,@k,getdate()) set @i = @i + 1

end

-- 耗时08:27 ,需要耐心等待

-- step 3.

select top 20 userid,nick,classid,writetime from t_userinfo where userid not in

(

select top 900000 userid from t_userinfo order by userid asc )

-- 耗时8 秒,够长的

-- step 4.

select erid,b.nick,b.classid,b.writetime from

(

select top 20 erid from

(

select top 900020 userid from t_userinfo order by userid asc ) a order by erid desc

) a inner join t_userinfo b on erid = erid

order by erid asc

-- 耗时1 秒,太快了吧,不可以思议

-- step 5 where 查询

select top 20 userid,nick,classid,writetime from t_userinfo where classid = 1 and userid not in

(

select top 90000 userid from t_userinfo

where classid = 1

order by userid asc

)

-- 耗时2 秒

-- step 6 where 查询

select erid,b.nick,b.classid,b.writetime from

(

select top 20 erid from

(

select top 90000 userid from t_userinfo

where classid = 1

order by userid asc

) a order by erid desc

) a inner join t_userinfo b on erid = erid

order by erid asc

-- 查询分析器显示不到1 秒.

查询效率分析:

子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。在这种情况下可以考虑用联接查询来取代。

如果要用子查询,那就用EXISTS替代IN、用NOT EXISTS替代NOT IN。因为EXISTS引入的子查询只是测试是否存在符合子查询中指定条件的行,效率较高。无论在哪种情况下,NOT IN都是最低效的。因为它对子查询中的表执行了一个全表遍历。

建立合理的索引,避免扫描多余数据,避免表扫描!

几百万条数据,照样几十毫秒完成查询.

2.

SQL提高查询效率

2008-05-12 21:20

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引。

2.应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

3.应尽量避免在where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

4.应尽量避免在where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20

可以这样查询:

select id from t where num=10

union all

select id from t where num=20

5.in 和not in 也要慎用,否则会导致全表扫描,如:

select id from t where num in(1,2,3)

相关文档
最新文档