就本问题而言,其结果或准确性无关紧要。我只是想知道是否可以查询表的前1000行。这可能只产生100个结果,或者它可能返回1000.我不想明确地限制结果,只需要查询的行数。
答案 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
之一,RANK
,DENSE_RANK
,NTILE
或{{1}}。