SQL查询,可以按顺序选择n行,然后返回m行

时间:2011-02-01 00:55:26

标签: sql sql-server database

我需要创建一个SQL查询,可以选择让1000行按行排序,然后只返回100行。

为什么呢?我的查询可以选择~1 000 000行(或更多),我想先取1000并从这1000行显示只有100具有最佳相关性。我担心这样一个选择的性能所以我想介绍这个第一步(只需要1000行)。我知道我可能会错过具有更好相关性的文档,但在这种情况下它并不重要。

4 个答案:

答案 0 :(得分:5)

如果你不选择前1000个,这有关系吗?即如果你只是使用......

Select top 100 *
From table
Order by column

你得到了相同的结果,并且在其他地方指出,你不会降低性能而不是改善它。

如果要优化此查询,请确保column上有索引,然后SQL服务器将能够优化记录的检索和排序,以便为您提供所需的内容。

答案 1 :(得分:4)

我想我终于明白了你想要达到的目标,但看起来你对数据库如何执行订购操作感到非常困惑。

如果我理解正确,您会担心排序大量行的性能影响(在您的示例中为1,000,尽管这不是大量行)。因此,您只想将它​​排序为您感兴趣的100行,从而试图超越它。

如果您应用where子句将其限制为100行,则在大多数情况下,现代数据库系统将自动暂停执行排序,直到它缩小结果以避免执行额外工作。这在100%的情况下都不是这样,但是当DB优化器决定先排序时,它通常有很好的理由基于性能或者因为查询已经确定了必须首先执行排序的条件才能获得 准确的结果。

诀窍是你必须明白tSQL是一种声明性语言而不是程序性语言。也就是说,您使用该语言来描述您想要的内容,优化程序会找出确切的算法来实现这一目标。您似乎正在尝试像编写C#或Java等过程语言一样优化代码。 SQL将您的查询转换为代码,在您键入代码时不会运行它。

长话短说,数据库引擎非常擅长这种简单的优化(以及一些非常复杂的优化)。你不打算用这样的噱头来优化优化器,所以不要打扰。您不会获得更高的性能,并且根据您编写查询的方式,您实际上可以降级它。

答案 2 :(得分:2)

字面解释将导致

select top 1000 from tbl order by columnname

下一步

SELECT TOP 100 FROM (select top 1000 from tbl order by columnname) SQ

但这与直接

没有区别
select top 100 from tbl order by columnname

除非您遵循两种不同的顺序

SELECT TOP 100
FROM (
   select top 1000 from tbl
   order by columnname) SQ
ORDER BY othercolumn

或在asc / desc之间切换

SELECT TOP 100
FROM (
   select top 1000 from tbl
   order by columnname ASC) SQ
ORDER BY columnname DESC

答案 3 :(得分:1)

您可以使用子查询。类似的东西:

select top 100 * from (
    select * from tablename
    limit 1000
)
order by fieldname

我的SQL有点生疏,所以语法可能有些偏差,根据你正在使用的平台,可能有更好的方法来做这件事,但希望这会有所帮助。