SQL-запрос для быстрого возврата любых 100 строк без сканирования всей таблицы - PullRequest
1 голос
/ 28 июня 2019

Я хочу запустить SQL-запрос, который возвращает любые 100 строк из таблицы базы данных. Я понимаю, что использование TOP (SELECT TOP 100 * FROM TABLENAME) заставляет движок сканировать всю таблицу и затем возвращать результаты, которые могут занять довольно много времени для огромной таблицы.

Существует ли SQL-запрос для возврата любых n строк без необходимости в механизме сканирования всей таблицы и / или быстрого получения результатов?

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Для требования получить любые произвольные 100 строк из таблицы у вас есть запрос.

SELECT TOP 100 *
FROM   TABLENAME 

План выполнения будет выглядеть примерно так, как показано ниже (хотя может показывать сканирование индекса, а не сканирование таблицы)

enter image description here

Планы выполнения в SQL Server работают конвейерным образом, когда операторы запрашивают строки по очереди у своих дочерних операторов (или пакет за раз в пакетном режиме).

Как только оператор TOP считает, что он получил 100 строк от сканирования, он перестанет запрашивать больше и сообщит оператору сканирования, что он может закрыться.

Возвращенные строки не будут случайными. Последовательные прогоны запроса вполне могут возвращать те же самые 100 строк Они также не будут гарантированы. Они будут просто первыми 100, возвращенными любым методом доступа, который используется поддеревом в TOP

0 голосов
/ 28 июня 2019
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 (наибольшее число) был, в моем случае 999. Затем он выбирает все столбцы из вашей таблицы, OFFSETS, так что в основном пропускает случайное количество X строк иполучает следующий 1 ряд после этого.Вы можете изменить числа, такие как часть выборки, и сказать FETCH NEXT 100 ROWS ONLY, если хотите вернуть следующие 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 записей и т. д.

Надеюсьэто помогает!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...