这可能是太多基于意见的问题,但这里有:
我发现了与实体框架和数据库迁移有关的一个有趣的怪癖。看来,每当我们创建外键时,它也会在该列上创建索引。
我读了一个SO问题:实体框架代码第一个外键添加索引,每个人似乎都说这是一个很好的,有效的主意,但我不知道怎么做。索引列是非常特定于环境的。例如,EF索引了我的表上几乎从来没有(〜1%)用于搜索的FK,并且也索引了源表,这意味着即使我加入其他表,我也使用它的PK搜索FK的链接表…在那种情况下(我知道)对FK进行索引并没有任何好处。
我的问题:
我想念什么吗?有什么原因为什么我想索引一个FK列,该列从不被搜索并且在任何联接中始终位于源表上?
我的计划是删除一些可疑的索引,但我想确认没有缺少一些优化概念。
在EF CodeFirst中,建模外键关系的一般原因是为了实体之间的可导航性。考虑一个Country
和的简单情况,City
为以下LINQ语句定义了急切的加载:
var someQuery =
db.Countries
.Include(co => co.City)
.Where(co => co.Name == "Japan")
.Select(...);
这将导致以下查询:
SELECT *
FROM Country co
INNER JOIN City ci
ON ci.CountryId = co.ID
WHERE co.Name = 'Japan';
如果没有在外键上启用索引City.CountryId
,则SQL将需要扫描“城市”表,以便在JOIN期间为“国家/地区”过滤城市。
TL; DR
建议使用外键索引,即使您不直接在外键上进行过滤,联接中仍将需要它。似乎有一些例外:
如果外键的选择性非常低,例如在上述情况下,如果国家表中所有城市的50%在日本,则该索引将无用。
如果您实际上从未浏览过该关系。
另外一个优化考虑因素是是否Clustered Index
在子表的“表”中使用外键(即按国家对城市进行集群)。这在parent:child表关系中通常是有利的,在该关系中,通常可以同时检索父级的所有子行。
我有一个MasterUserApprovalOfficial实体,它有两个外键,MasterUserId和SoftwareSystemId。EF 7足够聪明,可以看出这两个属性是外键。这是我的MasterUserApprovalOfficial类 如果我查看创建的表,MasterUserId列按预期创建并命名,SoftwareSystemId列然而被创建为(类的名称附加到主键的名称) 有什么原因吗
我有一个ASP MVC.NET核心(C#)项目,由于业务原因,SQL表不能有外键,因此,EF模型不映射关系(Entity.HasMany...)。 假设EF为实体生成一个模型,为生成一个模型。我想知道他们两个之间的关系。一个有多个并且一个属于一个。该任务在数据库中有项目Id(但请记住,它没有设置为FK)。 现在,我想通过to Entity获得一个项目列表,同时获得每个项目的任务列表。我通过创建一个
我想将类的外键从列表映射到类的主键。实体框架在子问题中没有建立这种关系。 我的形式类。 我的问题课。 IEntityTypeConfiguration中的配置应该是什么样子?
我正在使用实体框架管理我的sql server ce数据库。我希望我的表的主键由其他表的几个外键组成。我希望这样的事情能奏效: 但它会导致以下数据库迁移错误: 票据打印机。Bill::EntityType“Bill”没有定义键。定义此EntityType的键。Bills:EntityType:EntitySet“Bills”基于未定义键的类型“Bill”。 如何使表具有由这三个外键组成的主键?
在实体框架中,我想使用两个外键作为另一个实体类型的主键。 但是,这会给我一个缺少键的错误。 我知道我可以定义另外两个属性来保存引用实体类型的主键。Visual Studio是否不够聪明,无法自行使用它们的主键?
问题内容: 每个外键上的索引都会优化查询吗? 问题答案: 通常,将索引放在外键上被认为是一种好习惯。b / c完成此操作,将FK表链接到包含键定义的表时,有助于提高连接性能。 这并不能神奇地优化您的整个查询,但是绝对可以帮助改善FK及其主键对等部分之间的联接性能。