sql查询语句用top和order by哪个效率高?
比如说要在1000条数据中找到id最大的项目用top和orderby哪个更好点呢?我说错了不好意思..是orderby和max两个哪个效率高.....
比如说要在1000条数据中找到id最大的项目
用top和order by哪个更好点呢?
我说错了不好意思..是orderby和max两个哪个效率高.. 展开
用top和order by哪个更好点呢?
我说错了不好意思..是orderby和max两个哪个效率高.. 展开
3个回答
展开全部
这个看表结构,如果获得条目最好使用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(里面字段没用索引,或是加工了函数),那么也快不到哪去!
----------------------------------------------------------------
一句话,跟表结构有很大关系。
----------------------------------------------------------------
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(里面字段没用索引,或是加工了函数),那么也快不到哪去!
----------------------------------------------------------------
一句话,跟表结构有很大关系。
展开全部
如果有索引和没索引的结果是不一样的~~有索引的两个效率差不多,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 次。
*/
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 次。
*/
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
两个要同时用。
select top 1 id from [tableName] order by id desc
如果只用order by的话,效率肯定不高,因为IO开销太大。
select top 1 id from [tableName] order by id desc
如果只用order by的话,效率肯定不高,因为IO开销太大。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询