各DBにおけるANALYZEコマンドの使い方

各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コマンドはあるものの、インデックスを使うことがそもそも少ないため必要性があるのか不明。

参考:Statistics in Hive



Redshift

情報ソース(AWS公式ドキュメントデータベース徹底攻略)によって微妙に書いてることが違うんだけど、ANALYZEコマンドはクエリの実行計画に対してかなり効果があるらしい、自動でやる設定もあるっちゃある、フルテーブルスキャンになるためそれなりに重くなる点に注意が必要、という感じらしい。



参考リンク


大人のためのInnoDBテーブルとの正しい付き合い方。

MySQL 5.1 リファレンスマニュアル ANALYZE TABLE 構文

PostgreSQL 7.2.3 リファレンスマニュアル ANALYZE

PostgreSQL 9.2.4文書 定常的なバキューム作業

Statistics in Hive

Amazon Redshift テーブルを分析する

データベース徹底攻略 (WEB+DB PRESS plus)


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール