我想触发一个SQL查询,该查询从数据库表返回任何100行。我知道使用TOP(SELECT TOP 100 * FROM TABLENAME
)会使引擎扫描整个表,然后返回结果,对于一个巨大的表可能要花费一些时间。
是否存在SQL查询以返回任何n行,而无需使引擎扫描整个表和/或快速产生结果?
答案 0 :(得分:2)
对于要从表中获取任意100行的要求,您所拥有的查询就可以了。
SELECT TOP 100 *
FROM TABLENAME
执行计划如下所示(尽管可能显示索引扫描而不是表扫描)
SQL Server中的执行计划以流水线方式运行,其中操作员一次向其子操作员请求一行(或在批处理模式下一次请求一批)。
一旦TOP
操作员计算出它已从扫描接收到100行,它将停止再次请求并通知扫描操作员可以关闭。
返回的行将不是随机的。连续运行查询可能会返回完全相同的100行。它们也不会得到保证。它们将是TOP
答案 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条记录,等等。
希望这会有所帮助! :)