

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# よくある質問
<a name="faq"></a>

クエリパフォーマンスのチューニングに関して頻繁に寄せられる質問に対する回答を見つけます。

## EXPLAIN とは
<a name="q-1"></a>

`EXPLAIN` は、クエリプランを生成するために PostgreSQL クエリ (`SELECT`、`UPDATE`、`INSERT`、`DELETE`) の前に付加するキーワードです。PostgreSQL クエリプランは、データベースがクエリを実行する方法の詳細を表示します。このプランには、テーブルスキャンの順序、インデックスの使用状況、および結合に関する情報が含まれます。

クエリプランを使用して、潜在的なボトルネックを特定し、クエリを最適化し、全体的なパフォーマンスを向上させます。クエリプランを確認するときは、次の要素を考慮してください。
+ テーブルアクセスアプローチ
+ 結合アプローチ
+ フィルター条件
+ ソートオペレーション
+ インデックスの使用状況
+ 並列処理
+ 統計
+ コスト見積もり
+ 各ステップから取得した行
+ データのディストリビューション

[EXPLAIN](https://www.postgresql.org/docs/current/using-explain.html) の詳細については、PostgreSQL ドキュメントを参照してください。

## EXPLAIN ANALYZE とは
<a name="q-2"></a>

クエリの前に を付加`EXPLAIN ANALYZE`してクエリを実行すると、PostgreSQL はクエリを実行し、クエリプランとランタイム統計の両方を返します。実際のランタイム、各ステップで処理された行、およびその他の関連情報が、クエリプランとともに表示されます。クエリの実行は分析中のデータベースのパフォーマンスに影響を与える可能性があるため、本番データベース`EXPLAIN ANALYZE`での の使用は慎重に行う必要があります。

[EXPLAIN ANALYZE ](https://www.postgresql.org/docs/current/sql-explain.html#:~:text=The%20ANALYZE%20option%20causes%20the,of%20rows%20it%20actually%20returned.)の詳細については、PostgreSQL ドキュメントを参照してください。

## PostgreSQL での照合とは
<a name="q-3"></a>

PostgreSQL では、照合は文字列の比較とソート方法を決定するための一連のルールです。照合では、言語固有のルールと変換を考慮して、比較で文字が考慮される順序を定義します。

[照合](https://www.postgresql.org/docs/current/collation.html#:~:text=The%20collation%20feature%20allows%20specifying,be%20changed%20after%20its%20creation.)の詳細については、PostgreSQL ドキュメントを参照してください。

## CTE とは
<a name="q-4"></a>

PostgreSQL データベースでは、共通テーブル式 (CTE) は参照できる名前付き一時結果セットです。CTEsは、複雑なロジックを小さな名前付き単位に分割することで、より読みやすくモジュール化された SQL クエリを作成する方法を提供します。

[CTEs](https://www.postgresql.org/docs/current/queries-with.html)、PostgreSQL ドキュメントを参照してください。

## PostgreSQL の関数のカテゴリは何ですか？
<a name="1-5"></a>

すべての PostgreSQL 関数にはボラティリティ分類があり、その可能性は `VOLATILE`、`STABLE`、または です`IMMUTABLE`。
+ **VOLATILE** – `VOLATILE`関数は、データベースの変更など、何でも実行できます。同じ引数を持つ連続した呼び出しに対して異なる結果を返すことができます。オプティマイザは、そのような関数の動作について仮定しません。揮発性関数を使用するクエリは、値が必要な行ごとに関数を再評価します。
+ **STABLE** – `STABLE`関数はデータベースを変更できません。1 つのステートメント内のすべての行に対して同じ引数を指定して、同じ結果を返すことが保証されます。この分類を使用すると、オプティマイザは 1 回の呼び出しに対して関数の複数の呼び出しを最適化できます。特に、インデックススキャン条件にこのような関数を含む式を使用すると安全です。（インデックススキャンでは、各行で 1 回ではなく 1 回だけ比較値が評価されるため、インデックススキャン条件で`VOLATILE`関数を使用することは有効ではありません）。
+ **IMMUTABLE** – `IMMUTABLE`関数はデータベースを変更できず、同じ引数を永遠に持つと、同じ結果を返すことが保証されます。この分類を使用すると、クエリが定数引数で関数を呼び出すときに、オプティマイザは関数を事前に評価できます。例えば、 のようなクエリは、整数加算演算子の基になる関数が とマークされるため`SELECT ... WHERE x = 4`、 を見れば簡略化`SELECT ... WHERE x = 2 + 2`できます`IMMUTABLE`。

`VOLATILE` は、`CREATE FUNCTION`コマンドがカテゴリを指定しない場合のデフォルトです。[関数タイプ](https://www.postgresql.org/docs/16/sql-createfunction.html) の詳細については、PostgreSQL ドキュメントを参照してください。