【问题标题】:I have a composite key for a table. I want to join on just one column of this key. Does that column need a separate index?我有一个表的复合键。我只想加入这个键的一列。该列是否需要单独的索引?
【发布时间】:2022-08-18 23:32:07
【问题描述】:

想象一下,我有一个包含 DateCode 和 AddressCode 的复合主键的表。 我想将该表与仅在 AddressCode 上的另一个表连接起来。 我知道 DateCode 与 AddressCode 结合会有一个索引,因为那是主键。我是否还应该在此表中仅使用 AddressCode 建立索引,以便仅使用 AddressCode 作为外键有效地连接到其他表?这就是我在 MySQL 中所做的,尽管我不确定 Microsoft SQL Server 是否能以某种方式更好地自动处理这种情况。

  • 不,不是每个引用都需要索引,复合也需要复合
  • 你能改写你说的话吗?在这种情况下我是否需要额外的索引?
  • 是的,您需要为您引用的一列添加索引
  • 另一方面,这是一个明确的句子,谢谢!
  • 取决于您的复合 PK 是如何定义的。如果是(DateCode, AddressCode),那么该PK 不提供任何对仅在AddressCode 上查找有用的排序。如果它被定义为(AddressCode, DateCode),那么该索引可用于通过地址代码进行搜索或在另一个按地址代码排序的行源上合并连接

标签: sql sql-server


【解决方案1】:

经过进一步的研究和实验,我有了自己的答案。是的,作为复合键的一部分但不是该索引的第一个元素(即“最重要的成员”)的列上的连接需要单独的索引。如果没有该索引,则对该列执行 JOIN 需要对复合索引或表进行完整扫描。

为了进一步澄清这一点,如果在 a、b 和 c 三列上存在复合索引(例如为复合主键自动创建),如果索引是通过 a、b、c 创建的

CREATE INDEX NewIndex ON Table(a, b, c)

那么a是最重要的,c是最不重要的。如果索引是在 b、c、a 上创建的,像这样

CREATE INDEX NewIndex ON Table(b, c, a)

那么 b 是最重要的。由于索引是根据此重要性排序的,因此与仅查找由该列索引的值相比,查找由复合索引的最重要组成部分索引的值只需要微不足道的额外工作(也就是说,这就像查找所有整数在从 1 到 1000 的有序列表中以“7”开头),而查找在复合索引的不太重要的组件上索引的值通常需要完整的索引扫描(也就是说,这就像查找所有以“7”结尾的整数在从 1 到 1000 的有序列表中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多