复合主键是否也为每一列单独创建索引?
Does a composite primary key also create an index for each column separately?
在 Teradata 中,我从两个 varchar 列 A 和 B 中创建了具有唯一主键的 table。我将编写需要在其中一个或两个列上进行筛选的查询。
为了获得最佳性能,我是否应该为两列中的每一列提交创建索引语句(table 将有 3 个索引:唯一主键(A 列、B 列)、非唯一列 A和非唯一列 B)?
关于这个 table,我只关心读取性能而不关心 insert/update 性能。
你只需要两个索引。
如果您在 (A, B)
上有一个主键,那么这也适用于 (A)
。如果要在 B
上进行过滤,则需要在 (B)
.
上建立索引
您可能希望将其设为 (B, A)
,以便索引可以处理以下情况:
where B = ? and A in (?, ?, ?)
在 Teradata 中,如果您在创建 table 时指定了 PRIMARY KEY
子句,则 table 将自动使用 UNIQUE PRIMARY INDEX
(UPI) 创建那些 PK
列。虽然 Teradata 支持键,但它更像是一个基于索引的 DBMS。
在您的情况下,只有当您在 PK
。这适用于前面评论中提到的平等访问(感谢 Dieter)。
如果您在 PK
/ UPI
的某些但不是所有列上访问 table,则您的查询将不会使用 UPI
访问路径。您需要定义单独的索引或其他优化策略,具体取决于您的查询。
如果您只关心读取性能,那么在单独的列上创建二级索引是有意义的。只需 运行 查询中的 EXPLAIN
即可确保优化器实际使用了索引。
另一种选择是完全放弃 PK
规范,尤其是当您从不访问那组列上的 table 时。如果有一列您访问的次数多于另一列,请将该列指定为您的 PRIMARY INDEX
(非唯一)并在另一列上创建二级索引。类似于:
CREATE TABLE mytable (
A INTEGER,
B INTEGER,
C VARCHAR(10)
)
PRIMARY INDEX(A) -- Non-unique primary index
;
CREATE INDEX (B) ON mytable; -- Create secondary index
在 Teradata 中,我从两个 varchar 列 A 和 B 中创建了具有唯一主键的 table。我将编写需要在其中一个或两个列上进行筛选的查询。
为了获得最佳性能,我是否应该为两列中的每一列提交创建索引语句(table 将有 3 个索引:唯一主键(A 列、B 列)、非唯一列 A和非唯一列 B)?
关于这个 table,我只关心读取性能而不关心 insert/update 性能。
你只需要两个索引。
如果您在 (A, B)
上有一个主键,那么这也适用于 (A)
。如果要在 B
上进行过滤,则需要在 (B)
.
您可能希望将其设为 (B, A)
,以便索引可以处理以下情况:
where B = ? and A in (?, ?, ?)
在 Teradata 中,如果您在创建 table 时指定了 PRIMARY KEY
子句,则 table 将自动使用 UNIQUE PRIMARY INDEX
(UPI) 创建那些 PK
列。虽然 Teradata 支持键,但它更像是一个基于索引的 DBMS。
在您的情况下,只有当您在 PK
。这适用于前面评论中提到的平等访问(感谢 Dieter)。
如果您在 PK
/ UPI
的某些但不是所有列上访问 table,则您的查询将不会使用 UPI
访问路径。您需要定义单独的索引或其他优化策略,具体取决于您的查询。
如果您只关心读取性能,那么在单独的列上创建二级索引是有意义的。只需 运行 查询中的 EXPLAIN
即可确保优化器实际使用了索引。
另一种选择是完全放弃 PK
规范,尤其是当您从不访问那组列上的 table 时。如果有一列您访问的次数多于另一列,请将该列指定为您的 PRIMARY INDEX
(非唯一)并在另一列上创建二级索引。类似于:
CREATE TABLE mytable (
A INTEGER,
B INTEGER,
C VARCHAR(10)
)
PRIMARY INDEX(A) -- Non-unique primary index
;
CREATE INDEX (B) ON mytable; -- Create secondary index