各DBにおけるANALYZEコマンドの使い方。
各DBにおけるANALYZEコマンドの使い方
各DBにおけるANALYZEコマンドの用途と使いどころについて調べてみた。特に、MySQL, PostgreSQL, Hive, Redshiftについて。
ANALYZEコマンドとは
どのDBでもだいたい意味は同じで、テーブルのインデックス統計情報を更新するコマンドをANALYZEコマンドと呼ぶ。統計情報を更新することで、実行計画が最適化される効果がある。
統計情報の更新というとクエリをブロックするのが心配になるが、ブロックするかどうかは各DBの実装による。
各DBにおけるANALYZEコマンド
特に、手動で実行する必要があるのか、他のクエリをブロックするのか、について。
MySQL(特にInnoDB)
クエリをブロックする心配はほぼない。サンプリングで統計情報を更新することで処理を非常に軽くしているため。
明示的にANALYZEコマンドを実行する必要はほぼない。InnoDBを使っていれば特定の条件下で自動で統計情報が更新されるため。
参考:大人のためのInnoDBテーブルとの正しい付き合い方。
PostgreSQL
読み取りロックがかかるため、読み込みはできるが書き込みができない状態となる。大きなテーブルではサンプリングを行うこともある。
公式ドキュメントでは毎日実行することを推奨しているが、ANALYZE(とVACUUM)を自動でやってくれる設定もあるらしい。
参考:定常的なバキューム作業
Hive
ANALYZEコマンドはあるものの、インデックスを使うことがそもそも少ないため必要性があるのか不明。
Redshift
情報ソース(AWS公式ドキュメントとデータベース徹底攻略)によって微妙に書いてることが違うんだけど、ANALYZEコマンドはクエリの実行計画に対してかなり効果があるらしい、自動でやる設定もあるっちゃある、フルテーブルスキャンになるためそれなりに重くなる点に注意が必要、という感じらしい。
参考リンク
MySQL 5.1 リファレンスマニュアル ANALYZE TABLE 構文
PostgreSQL 7.2.3 リファレンスマニュアル ANALYZE
PostgreSQL 9.2.4文書 定常的なバキューム作業
データベース徹底攻略 (WEB+DB PRESS plus)