Navicat Monitor 3 のクエリアナライザー画面の上部には、待ち時間が最も長いクエリを示すチャートがあります:
遅延クエリは全てのクラッシュを引き起こしてしまう可能性があるため、遅延クエリを特定することが重要です。
スロークエリを特定したら修正するだけでなく、クエリの実行時間を全体的に制限することも戦略の1つとして考えられます。PostgreSQLなどのプロフェッショナルグレードのデータベースでは、statement_timeout変数を使用して、データベース全体またはユーザーごとにクエリ実行時間を制限する設定があります。このブログでは、Navicat 16 For PostgreSQLでこの重要なデータベース変数を操作する方法を学びます。
データベースレベルでのstatement_timeout変数の設定
データベースのデフォルトのステートメントタイムアウトを設定することは、すばらしい出発点です。これにより、データベースに接続するアプリケーションやユーザーは、それ以上長くクエリを実行することがなくなります。適切なデフォルトは30秒または60秒ですが、必要に応じてそれより長くすることもできます。ここでは、60秒の値を設定するステートメントを示します:
ALTER DATABASE mydatabase SET statement_timeout = '60s';
Navicat 16 For PostgreSQLでは、メインメニューからツール > サーバー監視 > PostgreSQLを選択して、statement_timeoutを表示できます。これは変数タブにあります:
実際、statement_timeout変数は多数あるため、検索ツールを使用して正確に特定した以下のしれません。すべてを強調トグルボタンをクリックすると、一致した変数を識別しやすくなります。
もちろん、Showステートメントも同様に機能します:
特定のユーザーのクエリタイムアウトの設定
さらに細かく制御するためには、特定のユーザー(ご存知のとおり、常にデータベース全体を選択するユーザー)にクエリタイムアウト値を設定できます。これは、statement_timeoutを含む多くのデータベース変数を設定できるALTER ROLEステートメントを使用して実現されます。
これを試してみるために、“guest”という名前の新しいユーザーロールを作成してみましょう:
これで、次のようにALTER ROLEステートメントを使用してクエリの実行時間を制限できるようになります:
ALTER ROLE guest SET statement_timeout='5min';
pg_rolesテーブルに問い合わせて、statement_timeoutに関する情報(設定された方法を含む)を取得できます:
rollconfig値は配列なので、ネストを解除して行ごとに1つの設定を取得できます:
PostgreSQLでのクエリタイムアウトの設定に関する最終的な考え方
遅延クエリはデータベースのパフォーマンスを最低レベルまで低下させる可能性があるため、遅延クエリを特定できることが重要です。そのために、Navicat Monitor 3のクエリアナライザー画面の上部に長時間実行クエリチャートがあります。
もう1つのアプローチは、クエリがタイムアウトになるまで実行できる時間を制限することです。今日のブログで見たように、PostgreSQLでは、これはデータベース、セッション、さらには個々のロールレベルで実行できます。
statement_timeout変数をまだ設定していない場合は、できるだけ早く設定することをお勧めします。これは、データベースインスタンスの健全性と可用性を維持できるようにするための適切なデータベースチューニングの1つのコンポーネントにすぎません。
Navicat 16 For PostgreSQLを試してみることに興味がありますか?完全に機能するアプリケーションを こちらからダウンロードして、14日間の無料トライアルを入手できます。