日期:2014-05-18  浏览次数:20591 次

两种SQL语句的执行速度比较
关于读取表中最后一项数据(后续)

第一种
SQL code

select * 
from tb
where id=(select max(ID)from tb)



和第二种
SQL code

select top 1 * from tb order by id desc



如果tb表中有10万个数据,每个数据里有10项

第一种直接求最大ID是不是比第二种ID排序执行速度快啊?

------解决方案--------------------
如果ID是自增列的话,估计就是第一种
------解决方案--------------------
理论上讲,如果id不唯一的话,执行结果都不一样,怎么比?
如果id是key的话,当然2快了
------解决方案--------------------
第一种吧 具体看执行计划
------解决方案--------------------
我测试过
如果id有重复的话以一个可能会出现多条数据
如果id重复且数据没有任何索引的情况下,应该是一个人快
id唯一且有聚集索引应该一样快。
这个你可以自己试试,
------解决方案--------------------
xuexi
------解决方案--------------------
探讨
理论上讲,如果id不唯一的话,执行结果都不一样,怎么比?
如果id是key的话,当然2快了

------解决方案--------------------
SQL code

select top 1000000 id=identity(int,1,1) into Qas from syscolumns a,syscolumns b,syscolumns c,syscolumns d
GO
select top 1 * from Qas order by id desc
/*
执行时间 0秒
*/
select  * from Qas  where id=(select max(id) from Qas)
/*
执行时间 1秒
*/
GO
drop table Qas

------解决方案--------------------
事实上,table的数据量不同,执行计划也不同,
你可以试下当Qas有1000笔和100000笔时的情况。

又要推荐一下,请看看leimin 大侠的 “一句SQL引发的思考”
执行计划有时候也会骗人的。


------解决方案--------------------
建索引后,2者好像是一样的。
------解决方案--------------------
探讨
建索引后,2者好像是一样的。

------解决方案--------------------
探讨
问题补充下 ID 自增+1的


还有请教下 索引是自己手动建,还是sql系统自动建的?

手动建 要怎么建索引?

------解决方案--------------------
探讨
引用:
问题补充下 ID 自增+1的


还有请教下 索引是自己手动建,还是sql系统自动建的?

手动建 要怎么建索引?


索引自己建。
不过如果建pk的话,系统自动为你建

------解决方案--------------------
我觉得max函数和order应该是执行相同的过程,应该走的是相同的排序算法
猜想
------解决方案--------------------
Hi,

SQL code
 


0)SELECT COUNT(ID) FROM ta

-----------
100015
Warning: Null value is eliminated by an aggregate or other SET operation.

1)加索引后两者执行计划近乎相同 一个是Index Scan 一个Index Seek,理论上Seek高于Scan

CREATE CLUSTERED INDEX tID  ON ta (ID)
GO
--DROP INDEX ON ta.ID
--GO

--第一种SQL code

select *
from ta
where id=(select max(ID)from ta)

1 1 select *  from ta  where id=(select max(ID)from ta)
1 1   |--Top(TOP EXPRESSION:((1)))
2 1     |--Clustered Index Seek(OBJECT:([Testshen].[dbo].[ta].[tID]), SEEK:([Testshen].[dbo].[ta].[ID] IsNotNull) ORDERED BACKWARD)

--DBCC DROPCLEANBUFFERS

--第二种SQL code

select top 1 * from ta order by id desc