问题描述
我有一个非常大的记录表,大约有 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]);
此外,正如我在评论中指出的,如果 deviceDataId
是 int
,请在 int
子句中使用 WHERE
值。不要将数值用单引号括起来,这是用于文字字符串。
WHERE deviceDataId = 640