sql查询语句用top和order by哪个效率高?

比如说要在1000条数据中找到id最大的项目用top和orderby哪个更好点呢?我说错了不好意思..是orderby和max两个哪个效率高..... 比如说要在1000条数据中找到id最大的项目
用top和order by哪个更好点呢?
我说错了不好意思..是orderby和max两个哪个效率高..
展开
 我来答
紫仑天玑
2010-09-23 · 萝卜数学关注思维过程
紫仑天玑
采纳数:324 获赞数:888

向TA提问 私信TA
展开全部
这个看表结构,如果获得条目最好使用top的方式,如果就是获得一个最大字段就用Max,用MAX受92标准制约,如果除了最大字段还要用其它字段反倒要用group by,相反倒麻烦了!

----------------------------------------------------------------
SET STATISTICS PROFILE ON
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
SELECT TOP 1(Product_ID)
FROM [Product] ORDER BY Product_ID
GO
SET STATISTICS PROFILE OFF
SET STATISTICS IO OFF
SET STATISTICS TIME OFF

SET STATISTICS PROFILE ON
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
SELECT MAX(Product_ID)
FROM [Product]
GO
SET STATISTICS PROFILE OFF
SET STATISTICS IO OFF
SET STATISTICS TIME OFF

SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

(1 行受影响)
表 'Product'。扫描计数 1,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(3 行受影响)

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 2 毫秒。

(1 行受影响)
表 'Product'。扫描计数 1,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(4 行受影响)

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
-------------------------------------------------------------------看出来了吧!Max并不是那么理想,它影响了4行数据,IO了一行,top 影响了三行,IO了一行。
我这个表有三万的数据,执行时间不相上下。但是都是scan了一次。
关键还是看表结构,你上来就说那个效率高不看表结构那是不行的,如果你的order by字段是升序索引,或是倒排索引, top 也未必比MAX差。

如果你MAX(里面字段没用索引,或是加工了函数),那么也快不到哪去!
----------------------------------------------------------------
一句话,跟表结构有很大关系。
百度网友e89d670f9
2010-09-24 · TA获得超过148个赞
知道小有建树答主
回答量:179
采纳率:0%
帮助的人:113万
展开全部
如果有索引和没索引的结果是不一样的~~有索引的两个效率差不多,MAX会优化过头直接TOP 1后再流聚合!没时MAX要高点!

SELECT TOP 1000 ID=IDENTITY(INT,1,1),A.NAME INTO #T FROM SYSCOLUMNS A,SYSCOLUMNS B

--DROP TABLE #T

SELECT * FROM #T

--无索引情况
SET STATISTICS IO ON
SELECT TOP 1 ID FROM #T ORDER BY ID DESC

SELECT MAX( ID) FROM #T

SET STATISTICS IO OFF

/*
(所影响的行数为 1 行)

表 '#T__________________________________________________________________________________________________________________00000000001D'。扫描计数 1,逻辑读 5 次,物理读 0 次,预读 0 次。

(所影响的行数为 1 行)

表 '#T__________________________________________________________________________________________________________________00000000001D'。扫描计数 1,逻辑读 5 次,物理读 0 次,预读 0 次。
*/
--有索引情况
CREATE INDEX IDX_ID ON #T(ID)

SET STATISTICS IO ON
SELECT TOP 1 ID FROM #T ORDER BY ID DESC

SELECT MAX( ID) FROM #T

SET STATISTICS IO OFF

/*
(所影响的行数为 1 行)

表 '#T__________________________________________________________________________________________________________________00000000001D'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。

(所影响的行数为 1 行)

表 '#T__________________________________________________________________________________________________________________00000000001D'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
*/
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liu_binq63
2010-09-22 · TA获得超过1485个赞
知道大有可为答主
回答量:1881
采纳率:0%
帮助的人:2254万
展开全部
两个要同时用。
select top 1 id from [tableName] order by id desc

如果只用order by的话,效率肯定不高,因为IO开销太大。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式