Sql server SQL查询,无需扫描整个表即可快速返回任意100行

Sql server SQL查询,无需扫描整个表即可快速返回任意100行,sql-server,Sql Server,我想启动一个SQL查询,返回数据库表中的任意100行。我知道使用TOP SELECT TOP 100*FROM TABLENAME会使引擎扫描整个表,然后返回结果,这对于一个庞大的表来说可能需要相当长的时间 是否有一个SQL查询可以返回任意n行,而无需让引擎扫描整个表和/或快速生成结果?对于从表中获取任意100行的要求,您可以使用查询 SELECT TOP 100 * FROM TABLENAME 虽然执行计划可能显示索引扫描而不是表扫描,但它看起来与下面的类似 SQL Server中的

我想启动一个SQL查询,返回数据库表中的任意100行。我知道使用TOP SELECT TOP 100*FROM TABLENAME会使引擎扫描整个表,然后返回结果,这对于一个庞大的表来说可能需要相当长的时间


是否有一个SQL查询可以返回任意n行,而无需让引擎扫描整个表和/或快速生成结果?

对于从表中获取任意100行的要求,您可以使用查询

SELECT TOP 100 *
FROM   TABLENAME 
虽然执行计划可能显示索引扫描而不是表扫描,但它看起来与下面的类似

SQL Server中的执行计划是以流水线方式运行的,其中操作员一次向其子操作员请求一行,或以批处理模式一次请求一批

一旦顶部操作员统计到已从扫描中收到100行,它将停止再请求,并向扫描操作员发出信号,表示可以关闭

返回的行不是随机的。连续运行查询可能会返回完全相同的100行。他们也不会得到保证。它们只是顶部子树使用的任何访问方法返回的第一个100

这基本上会满足你的要求,并且是一段美好的时光。它所做的是声明一个上限和下限数字,以便RAND函数从中选择一个数字。然后我们使用ROUND函数,因为Rand返回一个浮点数

在我的例子中,只需设置你想要的@upperhighest数字,即999。然后它从表中选择所有列,因此基本上跳过随机的X行数,并获取之后的下一行。仅当希望返回下一个100行时,才可以将数字(如fetch part)更改为和说fetch NEXT 100行

或者,如果您希望每次返回一个随机数100次,随机返回100行,那么我们可以使用带计数器的while循环,如下所示:

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
DECLARE @Cnt INT;

---- This will create a random number between 1 and 999
SET @Lower = 1 ---- The lowest random number
SET @Upper = 999 ---- The highest random number
SET @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SET @CNT = 0 

WHILE @cnt <= 20

BEGIN
SELECT  *
FROM     TABLE_NAME
ORDER BY CHOSEN_COLUMN
OFFSET  @RANDOM ROWS
FETCH NEXT 1 ROWS ONLY 
SET @cnt = @cnt + 1

END
在我的例子中,我将cnt设置为20,因此这将变成随机的20条记录等


希望这有帮助!:

诀窍问题:如果表格中的每一条记录都不是被选中的公平游戏,那么它怎么可能是真正随机的呢?你对没有订单的TOP将扫描整个表格的理解是不正确的。但是所选的行不会得到保证,也不会是随机的。停止扫描的唯一方法是给它一些关于要查找什么的方向。这基本上意味着表需要一个带有关联索引的主键,并且需要随机指定要创建的索引retrieve@Nick.McDermaid这是不对的。top 100由计划中的top运算符驱动,这将在无序扫描或有序索引扫描获得100后停止从扫描请求行生成一个从1到maxID列的随机数并重复,直到得到100为止。但是我很确定这会比使用top慢。这个问题在40分钟前被编辑过,删除了任何关于随机的内容。这是对一个不存在的问题的回答asked@MartinSmith从技术上讲确实如此。我的解决方案会返回任意数量的行,比如OP的问题中,可以将cnt VARABLE设置为100。因此,我的解决方案将从表中返回100行。如果我没弄错的话,这就是OP所要求的。所以,是的,随机数在我的里面,但它基本上仍然是OP想要的。从表中返回X行。是否有SQL查询返回任意n行别误会您的答案现在显然更准确、更好,但我的答案在问题方面仍然可以接受。与简单的任意需求前100名相比,不必要的复杂和低效
DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
DECLARE @Cnt INT;

---- This will create a random number between 1 and 999
SET @Lower = 1 ---- The lowest random number
SET @Upper = 999 ---- The highest random number
SET @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SET @CNT = 0 

WHILE @cnt <= 20

BEGIN
SELECT  *
FROM     TABLE_NAME
ORDER BY CHOSEN_COLUMN
OFFSET  @RANDOM ROWS
FETCH NEXT 1 ROWS ONLY 
SET @cnt = @cnt + 1

END