是否可以限制查询的记录数量?

时间:2015-04-06 21:06:27

标签: sql sql-server

就本问题而言,其结果或准确性无关紧要。我只是想知道是否可以查询表的前1000行。这可能只产生100个结果,或者它可能返回1000.我不想明确地限制结果,只需要查询的行数。

3 个答案:

答案 0 :(得分:8)

由于您不关心获得的结果,因此在这些情况下我会找到tablesample

  

当满足以下任一条件时,您可以使用TABLESAMPLE快速从大表中返回样本:

     
      
  • 样本不必是单个行级别的真正随机样本。
  •   
  • 表格各个页面上的行与同一页面上的其他行不相关。
  •   
SELECT DISTINCT
    D.SomeValue
FROM
    dbo.MyTable AS D TABLESAMPLE(1000 ROWS);

将要发生的是数据库引擎将占用大约1k行然后对其进行过滤。如何获得这些行并不重要,因为你不在乎,你只是想看看那个数据集中的唯一值。

您可能需要运行几次。对我16M行表的前3次运行没有结果。

有关无结果问题的更多信息,这是一个很好的写作 Sampling Using TABLESAMPLE h / t到Martin Smith

答案 1 :(得分:5)

如果查询很简单,FROM子句中只有一个表格,您只需将SELECT <columns>更改为SELECT TOP 100 <columns>(注意:不是,如果它是DISTINCT)。


如果查询更复杂,多次引用多个表和/或单个表,则可以更改要限制的表的出现位置,即更改:

SELECT ...
FROM ...                   -- some tables
   <table_name> AS x
   ...                     -- some more joins
WHERE ...
... ;

为:

SELECT ...
FROM ...                   -- some tables
   ( SELECT TOP 100 *
     FROM <table_name>
     ORDER BY <some_columns>     -- without ORDER BY  if you don't care
                                 -- which 100 rows will be checked
   ) AS x
   ...                     -- some more joins
WHERE ...
... ;

另一种方法,它可以处理简单的情况(是否有DISTINCT),如果查询更复杂,有多次引用的表,并且您希望限制该表的所有出现次数:

WITH table_name AS
   ( SELECT TOP 100 *
     FROM <table_name>
     ORDER BY <some_columns>     -- without ORDER BY  if you don't care
                                 -- which 100 rows will be checked
   ) 
SELECT ...
--- your query unchanged ;

答案 2 :(得分:2)

如果你只需要表格的前1000行,那么Lamak建议的一种可能性是TOP

select top 1000 * from MyTable

在上面的查询中,TOP将以未定义的顺序返回最多1,000行。如果行数少于1,000,则将返回表中的行数。如果您使用某种排序需要前N个,请使用ORDER BY

例如,以下查询首先返回最新中的前1000行:

select top 1000 * from MyTable order by EntryDate desc

请注意,引入ORDER BY会导致额外的SORT操作。如果表格非常大,您可能需要该列的索引。

如果您也控制客户端代码,也许您可​​以将其实现为一系列异步调用来检索下一个N个不同的值。也许N一开始可能很小,然后如果用户想坐下等待则稍微扩大一点。使用索引,SQL Server应该能够有效地执行此操作。

在线MSDN书籍:

  

将查询结果集中返回的行限制为指定的数字   SQL Server 2014中的行数或行百分比。当使用TOP时   与ORDER BY子句结合,结果集仅限于   前N个有序行;否则,它返回第一个N.   未定义顺序中的行数。使用此子句指定   从SELECT语句返回的行数或受其影响的行数   INSERT,UPDATE,MERGE或DELETE语句。

还有其他方法。如果您想要不同条件的前N个,则可以使用ROW_NUMBER之一,RANKDENSE_RANKNTILE或{{1}}。