GeneXusが生成したアプリケーションで数千、数万件のレコードを一括で更新する実装時に、パフォーマンスが悪いということがありました。
問題のコード
1 2 3 4 5 6 |
For Each Test Where TestType = 1 TestText = &TestText TestDateTime = Now() EndFor |
よく見かけるようなコードだと思いますが、どこが悪いかお分かりでしょうか。
改善後のコード
1 2 3 4 5 6 7 |
&Now = Now() For Each Test Where TestType = 1 TestText = &TestText TestDateTime = &Now EndFor |
違いとしては変数に現在日時に代入し、変数を項目属性に代入しています。
コードとしてはほとんど違いがありませんが、パフォーマンスは大きく改善しました。
改善後のコードでは実行されるUpdate文は1回のみですが、問題のコードでは更新対象のレコードの数だけ実行されます。
これは問題のコードでは、1レコードの更新毎に現在日時をアプリケーションが取得する、というプログラムが生成されてしまうからです。
まとめ
更新対象のレコード数が多い場合には、普段の実装方法でパフォーマンスが悪くないかを検討し、場合によっては実装方法を変更する必要があります。