Queryプランの分析
Postgresには、クエリの実行速度を把握するための強力なツールがあります。EXPLAIN
で簡単なSQLステートメントを実行すれば、特定のクエリに時間がかかる理由をデータベースに尋ねることができます。例えば、Slackモデルで、コンソールの Data
ページの SQL
タブで以下のクエリを実行できます。
EXPLAIN (FORMAT JSON, ANALYZE, BUFFERS)SELECT *FROM channelWHERE name = 'daily-standup';
上の例では、 Total Cost
、 Planning Time
、Execution Time
や、その他のメトリックスのデータを含んだ JSON
応答が返ってきます。これらのメトリックスは、クエリにかかる時間や、最適化が必要な部分を把握するのに役立ちます。例えばプランタイプで Seq Scan
(シーケンシャルスキャン)が返ってきます。その場合、大規模なデータセットを扱ったときに比較的時間がかかる可能性があります。
PostgreSQLインデックス
Postgresインデックスは、頻繁にクエリされるカラムの処理を向上させる方法の一つです。そのコンセプトは本の索引に似ています。追加のメタデータを管理することで、検索対象のデータへのより迅速なアクセスを可能にします。
例えば、名前をクエリしてチャネルを選択する大量の要求をデータベースが受信したとします。
SELECT * FROM channel WHERE name = 'daily-standup';
API Explorerで以下のクエリを実行します。
query {channel {idname}}
次に Analyze
ボタンをクリックします。
シーケンシャルスキャンがあることが分かります。この場合、データベースに大量のレコードがあると比較的時間がかかる可能性があります。
対策として、チャネルテーブルのネームカラムにインデクッスを作成します。
HasuraコンソールのDataタブに移動して、再度 SQL
タブに移動します。
以下のステートメントを実行します。
CREATE INDEX channel_name_index ON channel (name);
これでデータベースがクエリ結果をより迅速に検索できるようになるため、これらのクエリに対するパフォーマンスが大幅に向上します。
- Build apps and APIs 10x faster
- Built-in authorization and caching
- 8x more performant than hand-rolled APIs