即使对于非常大的记录表中​​的 10 条记录,选择查询也需要很长时间

问题描述

我有一个非常大的记录表,大约有 650 万条记录。当我尝试从中选择一些记录时,即使是 10 条记录,我也必须等待很长的随机时间。

SELECT [Column1],[Column2],[Column3],[Column4],[Column5]
FROM [table]
WHERE deviceDataId = '640'
ORDER BY id ASC OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY

我的数据库部署在 azure 上,我也下载并部署到本地系统,但需要相同的时间。

查询执行计划:

解决方法

现在我们有了您的真实查询,我们可以看到似乎您的列 deviceDataId 上没有索引;这意味着需要扫描整个表。因此,即使您只需要 10 行,也需要扫描所有 6.5M 行并检查 deviceDataId 的值。

如果您在 deviceDataId 列上创建索引,并在查询中最少创建 INCLUDE 其他列,那么您将拥有一个非常有用的覆盖索引。这也假设 id 是您订购 CLUSTERED INDEX 的列。

CREATE NONCLUSTERED INDEX IX_Table_DeviceTableID_Cols1_5
    ON dbo.[table] (deviceDataId)
    INCLUDE ([Colomn1],[Colomn2],[Colomn3],[Colomn4],[Colomn5]);

此外,正如我在评论中指出的,如果 deviceDataIdint,请在 int 子句中使用 WHERE 值。不要将数值用单引号括起来,这是用于文字字符串。

WHERE deviceDataId = 640