【问题标题】:Why does primary key order matter?为什么主键顺序很重要?
【发布时间】:2013-05-18 18:31:36
【问题描述】:

我最近在一个 EntityFramework 项目中设置了一个类,它指定了它的几个成员作为复合键。

然而,当需要从这里创建数据库时,它给出了错误

无法确定类型“NNNNN”的复合主键顺序。使用 ColumnAttribute 或 HasKey 方法指定复合主键的顺序。

我知道如何解决问题,但我只是想知道它为什么关心订单。复合主键不就是一组用来作为记录键的列,不需要任何特定的排序吗?

【问题讨论】:

  • 不是 EF 特定的评论,但一般来说,支持(a,b) 的索引将有效地支持与支持(b,a) 不同的查询(如果您进行大量搜索WHERE a = foo第一个会更可取。此外,如果其中一列是升序的,例如日期时间值,将其放在第一位可能会减少碎片。

标签: sql-server entity-framework composite-primary-key


【解决方案1】:

这很重要,因为主键的顺序在数据库中很重要。由于主键(通常)是聚集的,并且总是索引,因此无论键是按名字、姓氏、SSN 还是 SSN、姓氏、名字排序的,都会产生巨大的差异。如果我在查询表时只有 SSN,并且 PK 是唯一的索引,那么我会看到后者的出色性能,以及前者的全表扫描。

【讨论】:

  • 因此,在确定此排序时,一般规则是我应该选择最有可能被搜索到的任何一个键并将其放在列表的首位?
  • 这更像是艺术而不是科学。是的,选择查询时最有可能获得的值是一种好方法。但还要考虑插入、更新、删除表的频率。由于 PK (可能)是集群的,因此您不希望经常在物理上移动这些行,并且您不希望仅仅为了插入新行而拆分页面。人们经常会使用隐藏的身份(int 或 guid)作为唯一的 PK,确保在表的末尾插入新值。然后,您可以在其他列上建立索引以进行快速选择。
猜你喜欢
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2018-02-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多