Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 实体框架索引所有外键列_Sql_Sql Server_Entity Framework - Fatal编程技术网

Sql 实体框架索引所有外键列

Sql 实体框架索引所有外键列,sql,sql-server,entity-framework,Sql,Sql Server,Entity Framework,这可能是一个基于观点的问题,但以下是: 我发现了实体框架和数据库迁移的一个有趣的怪癖。似乎每当我们创建外键时,它也会在该列上创建索引 我读到了这个问题:每个人似乎都说这是一个伟大、有效的想法,但我不知道怎么做;为列编制索引非常具体。例如,EF在我的表上索引FK,这些FK几乎从来没有(~1%)用于搜索,而且也在源表上,这意味着即使我加入其他表,我也在使用它的PK搜索FK的链接表……在那种情况下(我知道)索引FK没有任何好处 我的问题: 我错过什么了吗?是否有什么原因使我想索引一个从未搜索过的FK列

这可能是一个基于观点的问题,但以下是:

我发现了实体框架和数据库迁移的一个有趣的怪癖。似乎每当我们创建外键时,它也会在该列上创建索引

我读到了这个问题:每个人似乎都说这是一个伟大、有效的想法,但我不知道怎么做;为列编制索引非常具体。例如,EF在我的表上索引FK,这些FK几乎从来没有(~1%)用于搜索,而且也在源表上,这意味着即使我加入其他表,我也在使用它的PK搜索FK的链接表……在那种情况下(我知道)索引FK没有任何好处

我的问题:

我错过什么了吗?是否有什么原因使我想索引一个从未搜索过的FK列,并且该列始终位于任何联接的源表中


我的计划是删除一些有问题的索引,但我想确认我没有遗漏任何优化概念。

在EF代码中,首先,建立外键关系模型的一般原因是实体之间的可导航性。考虑下面的一个简单的场景:<代码>国家> />代码> <代码>锡蒂>代码>,为下面的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将需要扫描Cities表,以便在连接期间为国家筛选城市

TL;DR

在外键上建立索引,即使不直接在外键上进行筛选,联接中仍然需要它。这方面的例外情况似乎相当人为:

  • 如果外键的选择性非常低,例如,在上述场景中,如果国家表中50%的城市位于日本,则该指数将不会有用

  • 如果你从来没有在这段关系中导航过

一个额外的优化考虑是是否在子表的
聚集索引
中使用外键(即按国家对城市进行聚类)。这在父子表关系中通常是有益的,因为在父子表关系中,通常可以同时检索父表的所有子行。

简短回答。没有

稍微扩展一下,在数据库创建时,entity framework不知道每个表或实体将有多少条记录,也不知道如何查询实体

*在我看来*外键的创建更可能是对的而不是错的,我使用不同的ORM时出现了大量性能问题,这需要更长的时间来诊断,因为我认为我在文档中读到它的行为是相同的

如果要进行双重检查,可以检查EF生成的Sql语句并手动运行它

您比EF更了解您的数据,如果您手动删除索引,它应该可以正常工作


IIRC如果使用正确的命名约定,您可以创建单向导航属性,尽管这是很久以前的事了,而且我从未检查是否创建了索引

这不是一个固执己见的问题。这是关于将EF配置为不那么愚蠢地固执己见。这就是为什么你不应该让ORM支配你数据库的结构。放松点,兄弟。EF工作正常。@user2864740我不知道EF开发人员是否谋杀了你的狗并与你的妻子私奔或其他什么,但对EF感到不合理的不安是没有意义的。它是一种工具;它帮助了一些人的用例,也许你不是其中之一。“EF是可怕的固执己见的设计”既没有效果,也与OP的问题无关。这很快就变成了我试图避免的意见战。我非常感谢所有的输入,但我得到的感觉是,它可以归结为我最初的想法:基于我的数据创建智能索引。EF会做出很好的猜测,但如果它做了我不喜欢的事情,就改变它。OP声称索引与他/她的查询无关。这基本上只是重申了事实。我相信你可能错过了关于连接的要点。尽管OP没有在FK上显式过滤,但他/她可能会在联接中大量使用它。@StuartLC我认为OP的用例是一种联接只以一种方式执行的情况:即从依赖表中选择数据,并联接到没有外键列的表中,在这种情况下,索引对您没有好处。@Kalmino-如果您从未进行反向导航,那么为什么要对其进行建模?@Kalmino-我没有问您为什么要对人员->地址关系进行建模,我问您为什么要对地址->人员关系进行建模。也就是说,你为什么有反向导航属性?