约束强制执行和性能

在某些情况下,强制执行约束会显著影响整体系统性能。当对需要频繁进行并发批量更新的大型事实表强制执行约束时尤其如此。每个调用约束强制执行的更新操作都要求 Vertica 检查每个表行是否存在所有约束违规。因此,对具有大量数据的表强制执行多个约束可能会导致显著延迟。

为了最大限度地减少因强制执行约束而产生的开销,请忽略对经常更新的大型表强制执行约束。您可以通过在非高峰时段运行 ANALYZE_CONSTRAINTS 来评估这些表是否出现约束违规。

约束强制执行的多个方面会对系统性能产生特定的影响。这些包括:

表锁定

如果针对表强制执行约束,Vertica 在 DML 操作期间会在该表上设置插入/验证 (IV) 锁定,同时进行验证。一次只有一个会话可以获取该表上的 IV 锁定。只要会话持有这个锁定,其他会话就不能访问该表。长时间加载容易导致性能瓶颈,尤其是当多个会话尝试同时加载同一个表时。有关详细信息,请参阅约束强制执行和锁定

强制执行的约束投影

为了强制执行主键和唯一约束,Vertica 创建了用于验证数据的特殊投影。根据锚表中的数据量,创建投影可能会产生巨大的系统开销。

事务回退

Vertica 针对每个 SQL 语句验证强制执行的约束,并回退遇到约束违规的每个语句。您无法将约束强制执行延迟到事务提交后再执行。因此,如果多个 DML 语句包含一个事务,Vertica 会分别验证每个语句以确保符合约束,并回退任何未通过验证的语句。它仅在其中的所有语句都返回后才提交事务。

例如,您可能在一个针对其中一列强制执行 UNIQUE 的表上通过单个事务发出十条 INSERT 语句。如果第六条语句尝试在该列中插入重复值,则会回退该语句。但是,可以提交其他语句。