Sql 复合主键是否也分别为每列创建索引?

Sql 复合主键是否也分别为每列创建索引?,sql,indexing,teradata,primary-key,composite-primary-key,Sql,Indexing,Teradata,Primary Key,Composite Primary Key,在Teradata中,我使用两个varchar列A和B中唯一的主键创建表。我将编写需要对其中一个或两个列进行筛选的查询 为了获得最佳性能,我是否应该为两列中的每一列提交CREATEINDEX语句(该表将有3个索引:唯一主键(列a、B)、非唯一列a和非唯一列B) 在这个表中,我只关心读取性能,而不关心插入/更新性能。您只需要两个索引 如果您在(a,B)上有一个主键,那么这也适用于(a)。如果要在B上进行筛选,则需要在(B)上建立索引 您可能希望将其设置为(B,A),以便索引可以处理以下情况: wh

在Teradata中,我使用两个varchar列A和B中唯一的主键创建表。我将编写需要对其中一个或两个列进行筛选的查询

为了获得最佳性能,我是否应该为两列中的每一列提交CREATEINDEX语句(该表将有3个索引:唯一主键(列a、B)、非唯一列a和非唯一列B)


在这个表中,我只关心读取性能,而不关心插入/更新性能。

您只需要两个索引

如果您在
(a,B)
上有一个主键,那么这也适用于
(a)
。如果要在
B
上进行筛选,则需要在
(B)
上建立索引

您可能希望将其设置为
(B,A)
,以便索引可以处理以下情况:

where B = ? and A in (?, ?, ?)

在Teradata中,如果在创建表时指定一个
主键
子句,则在这些
主键
列上会自动创建一个
唯一主索引
(UPI)。尽管Teradata支持键,但它更像是一个基于索引的DBMS

在您的情况下,只有在指定
PK
中的所有字段时,才会进行非常非常快速的读取(即UPI访问-单放大器,单行)。这适用于前面评论中提到的平等访问(感谢Dieter)

如果您在
PK
/
UPI
列中的部分而非全部访问表,那么您的查询将不会使用
UPI
访问路径。您需要根据您的查询定义单独的索引或其他优化策略

如果您只关心读取性能,那么在单独的列上创建二级索引是有意义的。只需对查询运行
EXPLAIN
,以确保优化器正在实际使用索引

另一种选择是完全放弃
PK
规范,特别是如果您从未访问该列组上的表。如果有一列的访问次数多于另一列,请将该列指定为
主索引(非唯一),并在另一列上创建辅助索引。比如:

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

是的,要获得最佳性能,您需要三把钥匙。复合键对单个列的查询没有帮助,但如果表单是表的主键,则仍然需要复合键。谢谢。我看到一些帖子,人们说第一列(A)作为覆盖索引,没有必要为它创建单独的索引,因为主键使用列A。但是对于列B,我必须创建单独的索引。不过我看到的帖子都是关于MySQL的。当你说我需要3个索引时,这是因为Teradata处理索引的方式不同于MySQL吗?不确定Teradata,但在大多数其他RDBMS中,复合键将有助于搜索前导列,而不是尾随列。A、B、C上的索引有助于在A、A、B和A、B、C上进行搜索。仅在C或B上进行搜索是没有帮助的。所以考虑一下你的领导专栏carefully@Nick.McDermaid:Teradata的主索引是基于哈希的,必须指定所有列(事实上,它用于大规模并行系统中的数据分发,类似于按哈希分区的
)@InsuQ:如何访问此表?一个PI只能用于相等性,而不是用于<代码> > <代码> >等。考虑单个列上的PI(取决于访问和分发)和次要索引或连接索引。在Teradata中,如果您在
(a,B)
上指定
PK
,并尝试仅通过列
a
或列
B
访问该表,则不会为您提供索引访问。您必须在
a
上定义一个单独的索引,在
B
上定义另一个索引。或者我误解了你的答案。Teradata的主索引是基于散列的,因此所有列都必须使用等号指定。@dnoeth。甚至基于散列的索引也可以用于
中的
(它只是多个索引查找)。Teradata不会进行优化?当然,IN也只是基于相等,但您在(A,B)上编写了主键,那么这也适用于(A)