缺少索引说明

时间:2011-12-21 02:50:39

标签: sql-server tsql

我正在检查我运行的所有查询,这就是我所看到的建议错过的索引(例如)

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])  ?

4 个答案:

答案 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

中阅读有关包含列的索引的更多信息