首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

两种SQL语句的执行速度比较,该如何解决

2012-01-22 
两种SQL语句的执行速度比较关于读取表中最后一项数据(后续)第一种SQL codeselect * from tbwhere id(sele

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

第一种

SQL code
select * from tbwhere 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 dGOselect top 1 * from Qas order by id desc/*执行时间 0秒*/select  * from Qas  where id=(select max(id) from Qas)/*执行时间 1秒*/GOdrop 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)

11select *  from ta  where id=(select max(ID)from ta)
11  |--Top(TOP EXPRESSION:((1)))
21    |--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



11select top 1 * from ta order by id desc
11  |--Top(TOP EXPRESSION:((1)))
11    |--Clustered Index Scan(OBJECT:([Testshen].[dbo].[ta].[tID]), ORDERED BACKWARD)




1)第一种SQL code

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

--这里2次Table Scan并且用到Nested Loops Join
select *  from ta  where id=(select max(ID)from ta)

11select *  from ta  where id=(select max(ID)from ta)
11  |--Nested Loops(Inner Join, WHERE:([Expr1008]=[Testshen].[dbo].[ta].[ID]))
11    |--Stream Aggregate(DEFINE:([Expr1008]=MAX([Testshen].[dbo].[ta].[ID])))
1000161    |  |--Table Scan(OBJECT:([Testshen].[dbo].[ta]))
1000161    |--Table Scan(OBJECT:([Testshen].[dbo].[ta]))

--DBCC DROPCLEANBUFFERS

2)第一种SQL code

--这里1次表Table Scan和Sort

select top 1 * from ta order by id desc

11select top 1 * from ta order by id desc
11  |--Sort(TOP 1, ORDER BY:([Testshen].[dbo].[ta].[ID] DESC))
1000161    |--Table Scan(OBJECT:([Testshen].[dbo].[ta]))


[解决办法]
查询优化后一样的
[解决办法]
理论上应该是一样快的
[解决办法]
探讨
事实上,table的数据量不同,执行计划也不同,
你可以试下当Qas有1000笔和100000笔时的情况。

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



[解决办法]
第一种情况查了两次
第二种情况只查了一次
这样可以说明第二种效率更高些?
[解决办法]
学习,学习,顶
[解决办法]
如果有索引 
我肯定用第二种嘛。
清楚明了。。。。
top 还是很不错的。。。
[解决办法]
学习中,一直就不知道,sql效率如何计算

[解决办法]
对这个不是很了解
[解决办法]
太高深了
[解决办法]
.....支持一下...
[解决办法]
SQL code
select count(*) from dbo.TB_FB805616条数据select * from TB_FBwhere id=(select max(ID)from TB_FB)CPU 15 Reads 258select top 1 * from TB_FB order by id descCPU 15 Reads 5
[解决办法]
(☆_☆) 普通扑克透視眼镜
 咨询QQ1273803415

[解决办法]
就这两句看来 加索引和不加 区别还是蛮大滴
[解决办法]
在有表索引的情况下 显然第二种方法快的多 如果没有 就第一种了
[解决办法]
2吧 我比较熟悉下面的
[解决办法]
探讨
SQL codeselectcount(*)from dbo.TB_FB
805616条数据select*from TB_FBwhere id=(selectmax(ID)from TB_FB)
CPU15 Reads258selecttop1*from TB_FBorderby iddesc
CPU15 Reads5

[解决办法]

------解决方案--------------------


应该是第二种
[解决办法]
xue xi
[解决办法]
。。。。。。。。。。。
[解决办法]
谢谢,很好,。很强大 

[解决办法]
打酱油~~~~~~···
[解决办法]
两个都要排序 

但是第一个要多查询一次
第二个是从排序好的结果集中直接取的
[解决办法]
感觉是第二种比较快~~用破机子实验了下(那机子破的我启动了5次才启动成功)
[解决办法]
应该是第一种。
[解决办法]
个人感觉,如果有聚集所有的话,还是第二种快
支持,顶了

热点排行