为 MPP 数据库中的表选择散列分布键

要选择有效的散列分布键,您需要检查表定义以及针对该表发出的任何查询。

开始之前

要选择有效的散列分布键,需要收集有关该表及其使用方式的信息:

  • 表定义 - 主键、唯一键、生成列、列数据类型
  • 表数据 - 不同值的数目、值的分布
  • 针对表发出的查询 - 连接、相等性谓语

关于此任务

在 MPP 数据库中,集群中所有节点上的系统资源(内存、存储器和处理器等资源)划分为逻辑单元,称为数据切片。使用散列分布时,数据库管理器通过将散列算法应用于分布键的各列中的值,在数据切片之间分布表中各行的数据。

有效的散列分布键可通过两种不同方式提高查询性能:

  • 在所有数据切片之间均匀分布表数据

    均匀分布有多项优势:
    • 将查询处理并行度最大化
    • 高效使用可用的存储空间
  • 将不同表中通常一起访存的行并置到一起

    当通常一起访存的行位于同一数据切片时,访存这些行所花费的时间量将会减少。

通常,均匀分布优先于行并置。

对于较小的表,分布键对查询性能的影响较小。对于较大的表,分布键会显著影响查询性能。

过程

将表中所有的列都视为分布键的候选,并根据以下四个条件排除列或选择列:
  1. 表定义
    • 如果表有强制的主键,那么分布键中的列必须是主键列的子集。
    • 如果表有强制的唯一键,那么分布键中的列必须是唯一键列的子集。
    • 不考虑任何不可用作分布键的生成列:
      • ROW CHANGE TIMESTAMP
      • ROW BEGIN
      • ROW END
      • TRANSACTION START ID
    • 不考虑数据类型不受分布键支持的任何列:
      • Long(示例:long varchar 和 long vargraphic)
      • 大对象(示例:BLOB、CLOB 和 DBCLOB)
      • XML
      • 基于 Long、大对象或 XML 数据类型的单值类型
      • 结构类型
  2. 表数据
    • 选择包含(或您预期可能包含)许多不同且均匀分布的值的列。
    • 不考虑包含许多 NULL 值的列。
  3. 查询
    • 要将不同表中通常一起访存的行并置到一起,请考虑这些表的下列因素:
      • 如果表包括在连接中,请选择在查询的连接谓词中使用的列。
      • 如果表包括在要与其他表的列进行相等性测试的查询中,请选择在相等性测试中使用的列。
  4. 常规
    • 尽量减少所选择的列,因为这样会增加将不同表中通常一起访存的行并置的可能性。

示例

请考虑包含以下列的表 EMPLOYEE:

CREATE TABLE EMPLOYEE                    
(
  ID INT NOT NULL,
  NAME VARCHAR(250) NOT NULL,
  RESUME CLOB,
  HIRE_DATE DATE,
  IS_MANAGER CHAR(1),
  OFFICE_NUMBER INT
)
ORGANIZE BY ROW

其他信息:

  • IS_MANAGER 列的值只能是“Y”或“N”。
  • 经理需要定期对这个表以及另一个名为 SALES 的表发出查询,以便按每个员工生成总销售额报告:
    
    ... WHERE SALES.SALES_PERSON_ID = EMPLOYEE.ID ...
  • 该公司只有 1 年的历史,50% 的员工是在过去的 7 月受聘。

可以使用以下逻辑来选择 EMPLOYEE 表的散列分布键:

表 1. 为 EMPLOYEE 表选择散列分布键的逻辑. 下表讨论如何应用四个条件来为 EMPLOYEE 表选择散列分布键。
条件 讨论
表定义
  • RESUME 列不能包括在分布键中,因为其数据类型不受支持。

余下的候选项:

  • ID
  • NAME
  • HIRE_DATE
  • IS_MANAGER
  • OFFICE_NUMBER
表数据
  • 因为 50% 的员工是在过去的 7 月受聘,因此 HIRE_DATE 中的值并非在许多不同值之间均匀分布。
  • IS_MANAGER 列中的值只能是“Y”或“N”,这并非许多个不同的值。

余下的候选项:

  • ID
  • NAME
  • OFFICE_NUMBER
查询
  • 因为针对这个表发出的查询会将 ID 列中的值与另一个表中某一列的值进行比较,所以 ID 列应该包括在分布键中。

建议:

  • ID

余下的候选项:

  • NAME
  • OFFICE_NUMBER
常规
  • 因为常规指导方针是尽量减少所包括的列,并且由于这里没有信息表明在分布键中需要 OFFICE_NUMBER 列或 NAME 列,所以不考虑这两列。

分布键:(ID)