毎日実行される更新ステートメントでいっぱいの大きなスクリプトを書いています。この更新の一部は、他の行に影響を与えません。
何にも影響しない更新ステートメントはあまり良い習慣ではないと思いますが、私の質問は次のとおりです。
- これはパフォーマンスにどの程度影響しますか?? これは、select ステートメントを使用して、select が何かを取得したときにのみ更新することとは大きく異なりますか?
ありがとう、ティアゴ
毎日実行される更新ステートメントでいっぱいの大きなスクリプトを書いています。この更新の一部は、他の行に影響を与えません。
何にも影響しない更新ステートメントはあまり良い習慣ではないと思いますが、私の質問は次のとおりです。
ありがとう、ティアゴ
何よりもまず、SELECT とそれに続く UPDATE は、並行性の下ではほとんどの場合正しくありません。SERIALIZABLE 分離レベルで実行しない限り、SELECT と UPDATE の間で行が変更されないという保証はありません。
第 2 に、更新する行がある場合、SELECT + UPDATE のコストは定義上、単なる UPDATE よりも高くなります。
最後に、更新する行がない場合、UPDATE によってそれらを見つけるコストは、SELECT によってそれらを見つけるコストと同じであることが多いため、何も得られません。「常に」ではなく「頻繁に」と言ったのは、クエリ オプティマイザーが更新と選択に対して異なる戦略を検討する可能性があり、更新のスキャンが読み取りのスキャンとは異なるロック (同時実行) ルールの下で発生するためです。
理にかなっているのは、100% 正確でなくても、高価な UPDATE を回避できる非常に安価な SELECT を持つことです。SELECT と UPDATE の間の条件は大きく異なる可能性があります (SELECT は行が存在しないはずですが、UPDATE は実行されていれば行が見つかったはずです) と false の数を取得しない限り、陽性率は低いです (SELECT は行があると言いますが、より正確で高価な UPDATE チェックでは実際には何も見つかりません)。
最終的に、これは最適化の問題であり、すべての最適化の問題は を測定することから始まります。最初に高価な UPDATEを見つけてから、変更を開始します。