Какой самый быстрый способ выбрать одну строку в SQL? (SQL Server) - PullRequest
0 голосов
/ 06 мая 2019

Мне известны два разных способа выбора одной строки из таблицы (без условия where, гарантирующего одну запись).

SELECT TOP 1 [Id]
FROM [MyTable]
ORDER BY [Id] ASC

или

SELECT [Id]
FROM [MyTable]
ORDER BY [Id] ASC
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY

Что из этого статистически быстрее? ([Id] - это первичный ключ)

Или есть более быстрая альтернатива обоим из них, о которой я не знаю?

1 Ответ

1 голос
/ 06 мая 2019

Нет никакой разницы между планами.Верхний синтаксис и порядок по синтаксису будут использовать один и тот же план запроса.Однако для определенных обстоятельств может быть несколько лучший способ запросить эту информацию.

Ниже запроса фальсифицирует 100 000 строк данных в таблице с первичным ключом для поиска.Затем выполняет заполнение данных, используя синтаксис top 1, синтаксис выборки смещения и, наконец, прямой поиск с предложением where.

declare @t table 

(
    id int primary key clustered,
    sometext nvarchar(150)
);

declare @runs int = 1;

while @runs<=100000
    begin
        insert @t (id, sometext)
        values
        (@runs, 'abc123');
        select @runs=@runs+1;
    end


SELECT TOP 1 [Id]
FROM @t
ORDER BY [Id] ASC;


SELECT [Id]
FROM @t
ORDER BY [Id] ASC
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;


select id from @t where id=1;

Query Plans

Затем изображение показывает 3 плана запроса.Первые 2 запроса показывают точно такой же план, сканирование индекса с использованием первичного ключа.Однако третий запрос с предложением where показывает поиск по индексу.Это связано с тем, что не нужно сканировать весь набор данных, чтобы найти вершину, если вы уже знаете, где в куче вы ищете.

Поиск индекса имеет тенденцию работать лучше, чем сканирование, особенно в больших таблицах смного столбцов разных типов данных.В этом сценарии с очень простой структурой таблицы и 100 000 строк стоимость в текущем пакете точно такая же (17%).

Для большого набора данных я бы поспорил за подход, который выглядит примерно так:this.

declare @id int = 0;
select @id=min(id) from @t;

Затем вы можете использовать эту переменную id в предложении where, подобном этому.

select id, sometext from @t where id=@id;

, который может использовать план поиска индекса в таблице, содержащей больше строк/ сложнее, чем этот тест.

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