Tihiroの頭を休めるIT教室

少しだけ頭使って後は根性

PostgreSQLでTruncateのあとにInsertしてSelectする前にAnalyzeする。

伝えたいこと

データの入れ替えなんかで、既存のデータをTruncateしてInsertした後は、Selectする前にAnalyzeしましょうというお話。

なぜかというと

Truncateによって統計情報がクリアされるから。統計情報がクリアされた状態でSelectしても正しい実行計画は作れない。

Insertした後にうまい具合にANALYZEが自動実行されればよいのですが、データ入れ替え作業の一環として手動ANALYZEしておく方が無難です。

別の視点から

Truncateが駄目ならDeleteすればいいじゃない。って話にはなりません。なぜなら、Deleteすると不要行(廃止行)が増えてしまうからです。不要行が増えると、ファイルサイズも大きくなって、結局のところVacuumが自動で実行されます。

TruncateしてInsertした後に、Analyzeを忘れてしまうようなペネロペみたいなうっかりさんはTruncateしてからInsertじゃなくて、DeleteしてからInsertでもよいかもしれませんね。