检测约束违规

ANALYZE_CONSTRAINTS 分析和报告给定架构中的表约束违规。您可以使用 ANALYZE_CONSTRAINTS 来分析单个表、表中的特定列或架构中的所有表。您通常针对未强制执行主键、唯一性或检查约束的表使用此函数。您还可以使用 ANALYZE_CONSTRAINTS 来检查外键的引用完整性。

在最简单的用例中,ANALYZE_CONSTRAINTS 是包含两个步骤的过程:

  1. 针对所需的表运行 ANALYZE_CONSTRAINTSANALYZE_CONSTRAINTS 报告所有约束违规。

  2. 使用报告来修复违规。

您还可以在以下情况下使用 ANALYZE_CONSTRAINTS

  • 分析已强制执行约束的表。

  • 检测由 COPY 操作引入的约束违规,并在提交复制事务之前解决它们。

分析已强制执行约束的表

如果对表强制执行约束,而且 DML 操作返回约束违规,则 Vertica 会在回退操作之前报告有限数量的约束违规。当您尝试加载大量包含多个约束违规(例如,键值重复)的数据时,这可能会出现问题。在这种情况下,按如下方式使用 ANALYZE_CONSTRAINTS

  1. 针对目标表暂时禁用所有约束的强制执行。

  2. 运行 DML 操作。

  3. 操作返回后,对表运行 ANALYZE_CONSTRAINTSANALYZE_CONSTRAINTS 报告所有约束违规。

  4. 使用报告来修复违规。

  5. 对表重新启用约束强制执行。

在 COPY 事务中使用 ANALYZE_CONSTRAINTS

使用 ANALYZE_CONSTRAINTS 来检测和解决由 COPY 操作引入的约束违规,如下所示:

  1. 使用 COPY...NO COMMIT 将源数据复制到目标表中。

  2. 调用 ANALYZE_CONSTRAINTS 以检查目标表及其未提交的更新。

  3. 如果 ANALYZE_CONSTRAINTS 报告约束违规,则回退复制事务。

  4. 使用报告修复违规,然后重新执行复制操作。

有关使用 COPY...NO COMMIT 的详细信息,请参阅使用事务暂存加载

分布约束分析

ANALYZE_CONSTRAINTS 作为原子操作运行 — 也就是说,它在计算指定范围内的所有约束之后才会返回。例如,如果您对表运行 ANALYZE_CONSTRAINTS,则该函数仅在针对列数据计算所有列约束后才返回。如果表中包含大量带有约束的列,并且包含非常大的数据集,则 ANALYZE_CONSTRAINTS 可能会耗尽所有可用内存并返回内存不足错误。同时对多个表或整个数据库运行 ANALYZE_CONSTRAINTS 会增加这种风险。

您可以通过将配置参数 MaxConstraintChecksPerQuery 设置为正整数(默认值为 ‑1)来最大程度地降低内存不足错误所带来的风险。例如,如果此参数设置为 20,并且您对包含 38 个列约束的表运行 ANALYZE_CONSTRAINTS,则该函数会将其工作分成两个单独的查询。 ANALYZE_CONSTRAINTS 创建一个临时表来加载和编译来自两个查询的结果,然后返回复合结果集。

MaxConstraintChecksPerQuery 只能在数据库级别进行设置,并且会产生一定的开销。设置后,提交到由 ANALYZE_CONSTRAINTS 创建的临时表会导致所有挂起的数据库事务自动提交。将此参数设置为合理的数值(例如 20)应该可以最大限度地减少对性能的影响。