Select 即使对于非常大的记录中的 10 条记录,查询也需要很长时间 table
Select query takes long time even for 10 records from a very big records table
我有一个非常大的记录table大约有 650 万条记录。当我尝试 select 一些记录甚至 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
上没有索引;这意味着 entire table 需要扫描。因此,即使您只需要 10 行,也需要扫描所有 6.5M 行并检查 deviceDataId
的值。
如果您在您的列 deviceDataId
上创建一个索引,并且在您的查询中至少 INCLUDE
其他列创建索引,那么您将拥有一个覆盖索引,这将有很大帮助。这也 假设 id
是您订购 CLUSTERED INDEX
的列。
CREATE NONCLUSTERED INDEX IX_Table_DeviceTableID_Cols1_5
ON dbo.[table] (deviceDataId)
INCLUDE ([Column1], [Column2], [Column3], [Column4], [Column5]);
此外,正如我在评论中指出的那样,如果 deviceDataId
是 int
,请在 WHERE
子句中使用 int
值。不要将数值用单引号引起来,这是针对文字字符串。
WHERE deviceDataId = 640
我有一个非常大的记录table大约有 650 万条记录。当我尝试 select 一些记录甚至 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
上没有索引;这意味着 entire table 需要扫描。因此,即使您只需要 10 行,也需要扫描所有 6.5M 行并检查 deviceDataId
的值。
如果您在您的列 deviceDataId
上创建一个索引,并且在您的查询中至少 INCLUDE
其他列创建索引,那么您将拥有一个覆盖索引,这将有很大帮助。这也 假设 id
是您订购 CLUSTERED INDEX
的列。
CREATE NONCLUSTERED INDEX IX_Table_DeviceTableID_Cols1_5
ON dbo.[table] (deviceDataId)
INCLUDE ([Column1], [Column2], [Column3], [Column4], [Column5]);
此外,正如我在评论中指出的那样,如果 deviceDataId
是 int
,请在 WHERE
子句中使用 int
值。不要将数值用单引号引起来,这是针对文字字符串。
WHERE deviceDataId = 640