在 SQL 中 select 单行的最快方法是什么? (SQL 服务器)

What is the fastest way to select a single row in SQL? (SQL Server)

我知道有两种不同的方法可以从 table 中 select 单行(没有保证单个记录的 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]是主键)

或者是否有我不知道的更快的替代品?

计划之间没有区别。 top 语法和 order by 语法将使用相同的查询计划。但是在某些情况下,可能有更好的方法来查询此信息。

下面的查询伪造了 table 中的 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;

图像随后显示了 3 个查询计划。前 2 个查询显示完全相同的计划,使用主键的索引扫描。但是,带有 where 子句的第三个查询显示索引查找。这是因为如果您已经知道要查找的堆中的位置,则无需扫描整个数据集即可找到顶部。

索引查找往往比扫描执行得更好,尤其是在具有大量不同数据类型的列的大型 table 中。在这个具有非常简单的 table 结构和 100,000 行的场景中,成本在当前批次中完全相同 (17%)。

对于更大的数据集,我赞成一种看起来像这样的方法。

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

然后你可以像这样在 where 子句中使用这个 id 变量。

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

可以利用 table 中的索引查找计划,比此测试更 rows/is 更复杂。