优化在数据库更新向导中生成的SQL查询

本文介绍了向Adobe Campaign中的现有架构添加整数字段的问题,尤其是当记录已存在时。 要解决此问题,请通过将四个命令(如本文讨论的)合并为一个来优化SQL查询。 这应该确保高效的操作,而不会出现性能问题或死锁。

描述 description

环境

  • Adobe Campaign
  • Adobe Campaign Classic

问题/症状

在大多数Adobe Campaign版本(包括Gold Standard 9032版本)中,在向现有架构添加新列时,您可能会遇到多个问题。

本文旨在解决与以下内容相关的一个特定问题:

  • 在记录已存在时向现有架构添加整数字段。
  • 将应用程序生成的SQL查询优化为Postgres SQL的高效查询。

解决方法 resolution

添加整数列时,将生成与以下内容类似的SQL语句:

ALTER TABLE NmsRecipient ADD <column_name> SMALLINT;
UPDATE NmsRecipient SET <column_name> = 0;
ALTER TABLE NmsRecipient ALTER COLUMN <column_name> SET Default 0;
ALTER TABLE NmsRecipient ALTER COLUMN i<column_name> SET NOT NULL;

这里的问题是,在数据库中并行执行四个命令,这可能会导致性能问题或死锁。
解决方案是将这四个命令合并为一个,然后仍然进行如下所示的更改:

ALTER TABLE NmsRecipient ADD iFichierLiveDataCliqueurs SMALLINT NOT NULL SET Default 0 ;

它执行所有必需的更改,添加列,设置默认值,设置NOT NULL,并根据NOT NULL约束将现有记录的值设置为​ 0

注释:

如果需要添加多个整数列,请逐一添加它们,然后针对每个更改运行数据库向导。

这是为了确保顺利运行,因为语句还将所有 现有 记录更新为​ 0,这可能需要一些时间,具体取决于记录数量。

原因

例如,如果您有一个现有的收件人表或任何其他已拥有超过100万条记录的表,就会发生这种情况。

如果您现在需要向该表中添加一列(数据类型为Integer)。 在这种情况下,您可以在模式定义中添加该列,并希望在数据库中提交更改。

更新数据库时,数据库遇到死锁,或查询阻塞其他操作。

这主要是由于根据数据库向导生成的SQL命令将所有记录更新为​ 0

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f