【问题标题】:How and which column is chosen as primary index in teradata如何以及选择哪一列作为 teradata 中的主索引
【发布时间】:2018-07-20 06:11:32
【问题描述】:

在创建表时未定义 teradata 的主索引时,如何以及选择哪一列作为主索引?

【问题讨论】:

  • It's complicated 这是最可能的情况:如果在 CREATE TABLE 语句中没有定义 PRIMARY INDEX、PRIMARY KEY 或 UNIQUE 约束,并且 PrimaryIndexDefault 参数设置为 D或 P,然后 Teradata Database 定义为表定义的第一个符合索引条件的列作为其主索引(因此可能是第一列,但取决于情况)。
  • 换句话说,总是总是定义一个 PI。
  • 是否有任何标准可以选择任何列作为主索引或只选择第一列。? index eligilble column是什么意思,请详细说明
  • 主索引决定了数据的分布方式。如果您的第一列恰好是大多数行具有相同值的字段,那么您的数据将非常不均匀地分布在 AMP 中。这可能会对性能产生严重影响。所以像@Andrew所说的那样明确定义主索引总是更好
  • 数据访问和数据分布是选择主索引的关键驱动因素。共享相同主索引的表可以连接在一起,并且数据访问是“AMP-local”。不共享相同主索引的表需要重新分配步骤来满足连接条件。有时,用户希望并且可以在其 WHERE 条件下提供整个主索引,这允许单 AMP 访问数据。最后,答案是“视情况而定”。

标签: teradata


【解决方案1】:

如果您未定义索引,Teradata 将隐式将第一行作为主索引。除此之外,您可以选择一个或多个列作为主索引,或者通过 NO PRIMARY INDEX 定义表。 主索引将定义跨 AMPS 的数据的分布键。如果没有定义 PRIMARY INDEX,它将是 RoundRobin。

选择 PI 是物理设计的一部分,没有办法将它们全部统治。文档中有一个专门的文档涵盖此主题(“数据库设计”)。你必须考虑:

1) 数据分布(防止高偏斜)

2) 可能的访问和加入

ad 1) 应该清楚

ad 2) 由于数据分布在 PI 中,与 PI 不同的 GROUP BY 或具有非 PI 的加入字段的 JOIN(至少 PI 必须是其中的一部分)将导致您的假脱机数据重新分布. - 这对查询的性能不利。

如果您想用您的数据测试不同的 PI,您可以通过 SQL 使用以下 SQL 来完成(例如 myTable 的 PI 为 column_1 和 column_2):

SELECT HASHAMP (HASHBUCKET (HASHROW (column_1,column_2))) as targetAMP
      ,COUNT (*) as CountRecords
  FROM myTable
 GROUP BY targetAMP;

【讨论】:

  • 非常有帮助,可以决定哪一个可以成为表格的最佳 PI
  • 惊人的解释!
猜你喜欢
  • 2014-09-29
  • 2013-09-22
  • 2013-08-11
  • 2020-04-13
  • 1970-01-01
  • 2011-09-29
  • 2019-10-18
  • 2019-10-26
  • 1970-01-01
相关资源
最近更新 更多