我正在检查我运行的所有查询,这就是我所看到的建议错过的索引(例如)
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[MBLPosition] ([DeviceKey])
INCLUDE ([PositionKey])
GO
表DDL看起来如此(不完整)
CREATE TABLE [dbo].[MBLPosition](
[PositionKey] [int] IDENTITY(1,1) NOT NULL,
[PositionGKey] [uniqueidentifier] NOT NULL,
[DeviceKey] [int] NOT NULL,
CONSTRAINT [PK_MBLPosition] PRIMARY KEY CLUSTERED ([PositionKey] ASC)
ALTER TABLE [dbo].[MBLPosition] WITH CHECK ADD CONSTRAINT [FK_MBLPosition_MBLDevice_DeviceKey] FOREIGN KEY([DeviceKey])
REFERENCES [dbo].[MBLDevice] ([DeviceKey])
GO
ALTER TABLE [dbo].[MBLPosition] CHECK CONSTRAINT [FK_MBLPosition_MBLDevice_DeviceKey]
GO
我认为所有FK已经指数。没有?它是什么意思INCLUDE ([PositionKey])
?
答案 0 :(得分:2)
不,FKeys不是索引。
CREATE INDEX语句中的INCLUDE子句强制将字段包含在索引的b-tree中,并将其包含在叶级别上 - 这对于设计覆盖索引非常有用,
但是
在您的情况下INCLUDE stmt。没有意义,因为它要求包含已经是唯一主键列的列,默认情况下它包含在任何非聚集索引中的叶级别上。
答案 1 :(得分:1)
否:外键引用不会自动使用它们创建索引。
INCLUDE
表示数据将保存在索引的叶节点中,但不会保存在内部索引节点本身中。它很有用,因为它可以消除对聚集索引的额外查找的需要。
答案 2 :(得分:1)
这是什么意思INCLUDE([PositionKey])?
这个问题确实是答案的关键。您可以向索引添加列以提高性能:
当查询中的所有列都作为键或非键列包含在索引中时,包含非键列的索引可以显着提高查询性能。
如果你运行了很多类似的查询
select PositionKey from MBLPosition where DeviceKey = @key
您的查询根本不需要触摸表格 - 它将是一个快速索引查找。
答案 3 :(得分:0)
没有。默认情况下,外键未编入索引。建议您在FK列上创建索引,并将PositionKey列包含在索引中包含FK的附加数据中。这样一个使用索引并且只需要FK和PositionKey的查询就不需要检查表,它可以直接从索引获得所需的全部内容。您可以在http://msdn.microsoft.com/en-us/library/ms190806.aspx
中阅读有关包含列的索引的更多信息