检测约束违规
ANALYZE_CONSTRAINTS
分析和报告给定架构中的表约束违规。您可以使用 ANALYZE_CONSTRAINTS
来分析单个表、表中的特定列或架构中的所有表。您通常针对未强制执行主键、唯一性或检查约束的表使用此函数。您还可以使用 ANALYZE_CONSTRAINTS
来检查外键的引用完整性。
在最简单的用例中,ANALYZE_CONSTRAINTS
是包含两个步骤的过程:
-
针对所需的表运行
ANALYZE_CONSTRAINTS
。ANALYZE_CONSTRAINTS
报告所有约束违规。 -
使用报告来修复违规。
您还可以在以下情况下使用 ANALYZE_CONSTRAINTS
:
-
分析已强制执行约束的表。
-
检测由
COPY
操作引入的约束违规,并在提交复制事务之前解决它们。
分析已强制执行约束的表
如果对表强制执行约束,而且 DML 操作返回约束违规,则 Vertica 会在回退操作之前报告有限数量的约束违规。当您尝试加载大量包含多个约束违规(例如,键值重复)的数据时,这可能会出现问题。在这种情况下,按如下方式使用 ANALYZE_CONSTRAINTS
:
-
针对目标表暂时禁用所有约束的强制执行。
-
运行 DML 操作。
-
操作返回后,对表运行
ANALYZE_CONSTRAINTS
。ANALYZE_CONSTRAINTS
报告所有约束违规。 -
使用报告来修复违规。
-
对表重新启用约束强制执行。
在 COPY 事务中使用 ANALYZE_CONSTRAINTS
使用 ANALYZE_CONSTRAINTS
来检测和解决由
COPY
操作引入的约束违规,如下所示:
-
使用
COPY...NO COMMIT
将源数据复制到目标表中。 -
调用
ANALYZE_CONSTRAINTS
以检查目标表及其未提交的更新。 -
如果
ANALYZE_CONSTRAINTS
报告约束违规,则回退复制事务。 -
使用报告修复违规,然后重新执行复制操作。
有关使用 COPY...NO COMMIT
的详细信息,请参阅使用事务暂存加载。
分布约束分析
ANALYZE_CONSTRAINTS
作为原子操作运行 — 也就是说,它在计算指定范围内的所有约束之后才会返回。例如,如果您对表运行 ANALYZE_CONSTRAINTS
,则该函数仅在针对列数据计算所有列约束后才返回。如果表中包含大量带有约束的列,并且包含非常大的数据集,则 ANALYZE_CONSTRAINTS
可能会耗尽所有可用内存并返回内存不足错误。同时对多个表或整个数据库运行 ANALYZE_CONSTRAINTS
会增加这种风险。
您可以通过将配置参数 MaxConstraintChecksPerQuery 设置为正整数(默认值为 ‑1)来最大程度地降低内存不足错误所带来的风险。例如,如果此参数设置为 20,并且您对包含 38 个列约束的表运行 ANALYZE_CONSTRAINTS
,则该函数会将其工作分成两个单独的查询。 ANALYZE_CONSTRAINTS
创建一个临时表来加载和编译来自两个查询的结果,然后返回复合结果集。
MaxConstraintChecksPerQuery 只能在数据库级别进行设置,并且会产生一定的开销。设置后,提交到由 ANALYZE_CONSTRAINTS
创建的临时表会导致所有挂起的数据库事务自动提交。将此参数设置为合理的数值(例如 20)应该可以最大限度地减少对性能的影响。