Teradata 连接索引

2024 年 8 月 29 日 | 5 分钟阅读

Teradata 连接索引存储预连接的表。 连接索引与物化视图相当。

连接索引旨在允许通过访问索引而不是访问(并可能连接)其底层基表来解析查询。

连接索引包含一个或多个表,并提供预聚合的数据。 连接索引主要用于提高性能。

连接索引是一种索引结构。 它们必须被更多地视为一个额外的预聚合、预连接或永久表层,具有其行级分区、主索引和二级索引。

即使连接索引不能完全覆盖查询,优化器也可以使用它以一种比扫描基表以获取请求中指定的所有列提供更好的查询优化方式来连接其底层基表。

连接索引对于聚合来自具有大量基数的表的列的查询非常有用。 这些索引扮演预连接和汇总表的作用,而无需对数据库的逻辑设计进行反规范化。 同时,事实上,反规范化通常可以提高特定查询或查询的性能。

Teradata 中有三种类型的连接索引可用。

  1. 单表连接索引 (STJI)
  2. 多表连接索引 (MTJI)
  3. 聚合连接索引 (AJI)

规则

以下是连接索引的一些重要规则,例如:

  • 不允许使用 FULL OUTER JOIN。
  • 在 LEFT 或 RIGHT JOIN 的内侧必须至少选择一个非空列。
  • OUTER JOIN 更有可能使用连接索引,但不允许用于聚合连接索引。
  • 不允许使用 HAVING 和 QUALIFY 关键字。
  • 不允许使用集合运算,例如 UNION、INTERSECT 和 MINUS。
  • 不允许使用子查询。
  • 不允许在连接索引定义的 ON 子句中使用不等式条件。
  • 仅允许使用 <、<=、>=、> 比较运算符。
  • 在恢复基表或数据库期间,连接索引标记为无效。
  • 每个表的每个连接索引最多允许 64 列。
  • 一个表上最多可以定义 32 个索引,包括连接索引。
  • 仅允许单表连接索引使用 UPI。
  • 不允许在同一连接索引列上使用 Value ordered NUSI 和 Partition Expression。

单表连接索引

单表连接索引仅从一个基表创建。 它们的目的是使同一个表可以使用不同的主索引、分区或较小的表(连接索引表)具有更少的列可供后台驻留进程使用。

这提高了连接的性能,因为不需要分配或复制。 用户将在基表上查询,但 PE 将决定是访问基表还是单表连接索引。

语法

以下是 JOIN INDEX 的语法。

示例

考虑以下 Employee 和 Salary 表。

以下是在 Employee 表上创建名为 Employee_JI 的连接索引的示例。

如果用户提交一个在 Employee_Id 上带有 WHERE 子句的查询,则系统将使用唯一主索引查询 Employee 表。

如果用户使用 employee_name 查询 employee 表,则系统可以使用 employee_name 访问连接索引 Employee_JI。

连接索引的行在 employee_name 列上进行哈希处理。 如果连接索引和 employee_name 未定义为辅助索引,则系统将执行全表扫描以访问行,这非常耗时。

我们可以运行以下 EXPLAIN 计划并验证优化器计划。 在以下示例中,当使用 Employee_Name 列查询表时,优化器使用连接索引而不是基本 Employee 表。

说明

多表连接索引

多表连接索引是通过连接多个表创建的。 多表连接索引可用于存储频繁连接的表的结果集,以提高性能。

多表连接索引用于保存来自两个或多个列的预连接结果集。 因此,在连接处理期间,PE 可能会决定从多表连接索引访问数据,而不是再次连接底层基表。 我们需要记住,我们应该在基于连接的频率和成本进行大量分析后定义多表连接索引。

多表连接索引允许我们将资源密集型连接从联机移动到批处理窗口。

转移工作负载不会减少总工作负载,但会将其转换为对系统整体性能有利的时间点。

示例

以下示例通过连接 Employee 和 Salary 表创建一个名为 Employee_Salary_JI 的 JOIN INDEX。

当基表 Employee 或 Salary 更新时,连接索引 Employee_Salary_JI 也会自动更新。

如果我们运行一个连接 Employee 和 Salary 表的查询,那么优化器可能会选择直接从 Employee_Salary_JI 访问数据,而不是连接表。 查询的 EXPLAIN 计划可用于验证优化器是否将选择基表或连接索引。

聚合连接索引

聚合连接索引方法用于解析经常在同一列或多列上指定相同聚合操作的查询。

当聚合连接索引可用时,系统不会为每个查询重复聚合计算。 可以在两个或多个表或单个表上定义聚合连接索引。

如果一个表始终在特定列上进行聚合,则可以在该表上定义聚合连接索引以提高性能。 聚合连接索引的一个限制是它仅支持以下函数。

  • SUM 函数
  • COUNT 函数
  • GROUP BY 子句

示例

在以下示例中,Employee 和 Salary 被连接以确定每个部门的总工资。


下一个主题分区主索引