【发布时间】:2016-11-19 21:32:00
【问题描述】:
我最近收到一封来自 Azure SQL 性能顾问服务的电子邮件(实际上是两封),说我在 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
正如我已经写过的,索引已经到位,如果我在类成员上添加索引属性,我只会得到索引的重命名作为迁移结果。不过很抱歉没有说清楚。
【问题讨论】:
-
外键默认没有索引,是什么让你认为 Wouk 是这种情况?
-
因为当我应用了建议时,相应的迁移里面只有一个 RenameIndex ...
-
但那是代码,不是数据库!您查看数据库架构了吗?
-
对。但是数据库与代码正确对齐。我认为这是隐含的。
-
表是否在列 yes 或 no 上有索引?请向我们展示相关表的 CREATE TABLE 脚本......
标签: azure entity-framework-6 azure-sql-database