当前位置: 首页 > 面试题库 >

复合主键是否应该在SQL Server中群集?

凌展
2023-03-14
问题内容

考虑下面的示例表(假设SQL Server 2005):

create table product_bill_of_materials
(
    parent_product_id int not null,
    child_product_id int not null,
    quantity int not null
)

我正在考虑一个复合主键,该主键包含两个product_id列(我肯定会想要一个唯一约束),而不是一个单独的唯一ID列。从性能的角度来看,问题是该主键是否应该集群?

我是否还应该在每个ID列上创建一个索引,以便更快地查找外键?我相信该表在读取方面比在写入方面会受到更多的打击。


问题答案:

正如其他一些人已经说过的那样,这取决于您如何访问表。但是请记住,那里的任何RDBMS都应该能够使用聚簇索引来按单个列进行搜索,只要该列首先出现即可。例如,如果您的聚集索引位于(parent_id,child_id)上,则不需要其他单独的索引位于(parent_id)。

最好的选择可能是(parent_id,child_id)上的聚集索引,它也恰好是主键,而(child_id)上有一个单独的非聚集索引。

最终,应该在了解如何访问数据库之后再解决索引问题。如果可以,请提供一些标准的性能压力测试,然后使用性能分析工具(SQL Server的SQL
Profiler)分析行为并从那里进行性能调整。如果您不具备提前完成此任务的专业知识或知识,请尝试发布(希望是受限制的)应用程序,收集性能指标,并查看需要在哪些方面提高性能并找出哪些指标将有所帮助。

如果操作正确,则应该能够捕获有关数据库访问方式的“典型”配置文件,然后您可以在尝试各种索引方法时在测试服务器上一遍又一遍地重新运行该配置文件。

在您的情况下,我可能只是将一个群集PK放在(parent_id,child_id)上,然后仅在看到性能问题可以帮助它时才添加非群集索引。



 类似资料:
  • 问题内容: 在Java的JPA中(通过EmbeddedId或IdClass注释)似乎仅对复合数据库键提供第二类支持。当我阅读复合键时,无论使用哪种语言,人们都会碰到它们,因为这是一件坏事。但是我不明白为什么。如今,组合键是否仍然可以使用?如果没有,为什么不呢? 我发现一个同意我的人:http : //weblogs.sqlteam.com/jeffs/archive/2007/08/23/comp

  • 问题内容: 请清除我对此的疑问,在SQL Server(2000及更高版本)中,主键是自动对群集索引的吗?还是我们可以选择在主键上使用非群集索引? 问题答案: 不,它可以是非集群的。但是,如果您没有明确将其定义为非聚集索引,并且表上没有聚集索引,则会将其创建为聚集索引。

  • 问题内容: 我正在设计一个数据库,该数据库将用于存储来自许多不同来源的数据。我存储的实例由原始来源分配了唯一的ID。我存储的每个实例都应包含有关其来源的信息,以及与此来源相关联的ID。 作为示例,请考虑说明该问题的下表: 请注意,尽管每个来源的唯一,但有可能在不同来源中找到相同的来源。 我对关系数据库有一个不错的了解,但是与专家甚至是经验丰富的用户都相去甚远。我在此设计中面临的问题是应该用作主键。

  • EmbeddedId或IdClass注释用于表示复合主键。如何在没有(EmbeddedId或IdClass)的情况下使用复合主键? 如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么如何使用EntityManager.find(Entity Class,Object primaryKey)方法在复合主键(Multiple primaryKey)的情况下查找实体(因为没

  • 问题内容: 创建一个名为“ sqlite_autoindex_mytable_1”的索引。我在“ SQlite Expert”中看到了它。在“要索引的字段”框中,它同时显示col1和col2。 在这篇文章中:https : //dba.stackexchange.com/a/14260 它说如果我想在没有col1的JOIN查询中使用col2,则必须为col2创建单独的索引。 因此,我需要添加: 如

  • 问题内容: 我有一个具有复合主键的旧式数据库表。我认为我无法更改结构以包含代理键,因为编写了一些使用该表的代码。在django中,我无法使用该表,因为它没有主键(非复合键)。 Django模型是否支持复合主键?如果不是,是否有任何解决方法而不更改表的结构? PS我正在使用PostgreSQL。 问题答案: 试试下面类似的代码: 或者,如果你只想要唯一的混合字段: 编辑:我想指出,如果有3列,则此方