我对索引和数据库工作仍然有点新,所以我很可能会遗漏一些明显的东西。
SMS 建议在我的一个表中添加一个覆盖索引,我认为该列上的索引非常有意义。但是,它还建议在表中每隔一列包括(覆盖)。对我来说,这似乎是将整个表移动到索引中。我认为这可能是一个坏主意。在这种情况下,SMS 是否可能误导我?
更一般地说,是否有任何理由覆盖表中的每一列?
SELECT *
FROM SlideshowImages SI
JOIN Files F ON F.PK_FileID = SI.FK_FileID
WHERE F.FK_ModuleID = 81
AND F.ParentType = 2
AND F.FK_ItemID = @SlideshowID
ORDER BY F.[Order] ASC
Run Code Online (Sandbox Code Playgroud)
SMS 的建议索引 - SlideshowImages 表的所有 10 列:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[SlideshowImages] ([FK_FileID])
INCLUDE ([PK_SlideshowImageID],[Title],[Caption],[IsLink],[LinkAddress],[StartDate],[EndDate],[AltText],[OpenInNewWindow])
Run Code Online (Sandbox Code Playgroud) 从 Microsoft 课程(由第三方提供)中,我了解到当表具有聚集索引时,即使是非聚集索引也会命中聚集索引。
当我理解没有聚集索引(堆)时,非聚集索引直接引用到表的页面中。
假设正确理解,为什么非聚集索引会引用聚集索引而不是直接引用表的底层数据页?似乎直接引用表数据页的开销会更少。