我最近从Azure SQL Performance Advisor服务收到一封电子邮件(实际上是两封),说我的Azure数据库需要进行索引调整,而且这个建议是免费提供的。
我认为这是一项非常好的服务,因为我不是数据库专家。
然而,这个建议真的很奇怪,因为建议在数据库列上创建一个已经是外键的索引(所以它已经有了一个索引)。
Recommended action: CreateIndex
Indexed columns: [Xxxxxx]
Estimated Index Impact: HIGH IMPACT
Date: 2016-11-17
我需要指定该列实际上是通过EF6中的外键数据注释属性来管理的。
然后我尝试应用推荐,因此我使用[Index]
属性修饰了列,我怀疑,相应的迁移只进行了索引重命名。
但是,我无法通过数据注释属性执行的操作是指定索引中包含的列。
这可能是咨询服务中发现的问题吗?在这种情况下,如果我直接在数据库上使用DDL创建索引,我如何维护数据库结构与代码同步?
修改
根据@ErikEJ评论,我在应用推荐之前为表格添加了DDL:
CREATE TABLE [dbo].[SVC](
[SVCID] [int] IDENTITY(1,1) NOT NULL,
[....other fields omitted for brevity...],
[CampaignID] [int] NOT NULL,
CONSTRAINT [PK_SVC] PRIMARY KEY CLUSTERED ( [SVCID] ASC )
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ON, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[SVC] WITH CHECK ADD CONSTRAINT [FK_SVC_CampaignID] FOREIGN KEY([CampaignID]) REFERENCES [dbo].[SvcCampaign] ([CampaignID])
GO
ALTER TABLE [dbo].[StoredValueCard] CHECK CONSTRAINT [FK_SVC_CampaignID]
GO
CREATE NONCLUSTERED INDEX [IX_CampaignID] ON [dbo].[SVC] ( [CampaignID] ASC )
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ON, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
GO
正如我已经写过的那样,索引已经存在,如果我在类成员上添加一个Index属性,我只会将索引重命名为迁移结果。很抱歉没有说清楚。
答案 0 :(得分:0)
原始回复者是正确的,默认情况下不对FK编制索引。如果您允许,数据库顾问将为您创建索引。
至于"维护数据库结构",这完全是关于sql脚本的,除非你维护的参考实现并不是一个关键问题。