SQL查询可快速返回任何100行,而无需扫描整个表

时间:2019-06-28 05:40:04

标签: sql-server

我想触发一个SQL查询,该查询从数据库表返回任何100行。我知道使用TOP(SELECT TOP 100 * FROM TABLENAME)会使引擎扫描整个表,然后返回结果,对于一个巨大的表可能要花费一些时间。

是否存在SQL查询以返回任何n行,而无需使引擎扫描整个表和/或快速产生结果?

2 个答案:

答案 0 :(得分:2)

对于要从表中获取任意100行的要求,您所拥有的查询就可以了。

SELECT TOP 100 *
FROM   TABLENAME 

执行计划如下所示(尽管可能显示索引扫描而不是表扫描)

enter image description here

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

一旦TOP操作员计算出它已从扫描接收到100行,它将停止再次请求并通知扫描操作员可以关闭。

返回的行将不是随机的。连续运行查询可能会返回完全相同的100行。它们也不会得到保证。它们将是TOP

下子树使用的任何访问方法返回的前100个

答案 1 :(得分:0)

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower 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)


SELECT  *
FROM     TABLE_NAME
ORDER BY CHOSEN_COLUMN
OFFSET  @RANDOM ROWS
FETCH NEXT 1 ROWS ONLY 

这基本上可以满足您的要求和美好的时光。它的作用是为RAND()函数声明一个上限和下限数字,以便从中选择一个数字。然后,我们将ROUND()函数与之配合使用,因为Rand()返回一个浮点数。

在我的情况下,只需设置@upper(最高数字)为您想要的值即可。然后,它从表中选择所有列,OFFSETS,因此基本上跳过了随机的X行数,然后获得下一行。如果希望返回下一个100,可以将诸如fetch part之类的数字更改为FETCH NEXT 100 ROWS ONLY

或者,如果您希望每次返回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条记录,等等。

希望这会有所帮助! :)