データベース更新ウィザードで生成された SQL クエリの最適化
この記事では、特にレコードが既に存在する場合に、Adobe Campaignの既存のスキーマに整数フィールドを追加する問題を扱います。 これを解決するには、(この記事で説明したように) 4 つのコマンドを 1 つに集約して SQL クエリを最適化します。 これにより、パフォーマンスの問題やデッドロックのない効率的な操作が保証されます。
説明 description
環境
- Adobe Campaign
- Adobe Campaign Classic
問題/症状
Gold Standard 9032 のビルドを含むほとんどのAdobe Campaign ビルドでは、既存のスキーマに新しい列を追加する際に複数の問題が発生する場合があります。
この記事では、次の項目に関連する 1 つの具体的な問題について説明します。
- レコードが既に存在する場合、既存のスキーマに整数フィールドを追加します。
- アプリケーションで生成された 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;
この場合の問題は、データベースで並行して実行される 4 つのコマンドがあり、パフォーマンスの問題やデッドロックの原因となる可能性があることです。
解決策は、これらの 4 つのコマンドを 1 つに集約し、引き続き次と同じ変更を行うことです。
ALTER TABLE NmsRecipient ADD iFichierLiveDataCliqueurs SMALLINT NOT NULL SET Default 0 ;
列の追加、デフォルトの設定、NOT NULL の設定、NOT NULL 制約による既存レコードの値の 0 の設定など、必要なすべての変更を行います。
メモ:
追加する必要がある整数列が複数ある場合は、1 つずつ追加し、変更ごとにデータベースウィザードを実行します。
これは、ステートメントによってすべての 既存の レコードが 0 に更新されるので、スムーズな操作を保証するためです。レコードの数によっては、時間がかかる場合があります。
原因
これは、例えば、既存の受信者テーブルや、既に 100 万を超えるレコードがある他のテーブルがある場合に発生する可能性があります。
これで、そのテーブルに 1 つの列を追加する必要がある場合、データ型は Integer です。 その場合は、スキーマ定義にその列を追加し、データベース内の変更をコミットします。
データベースの更新中に、データベースでデッドロックが発生するか、クエリで他の操作がブロックされています。
これは主に、データベースウィザードで生成された SQL コマンドに基づいて 0 に対するすべてのレコードが更新されることが原因です。