1. ホーム
  2. データベース
  3. ポストグレスキュー

Postgresqlの操作でSQL文の実行効率を表示する

2022-01-19 08:17:47

説明コマンドは、データベースのパフォーマンスを解決するための最初の推奨コマンドです、パフォーマンスの問題のほとんどは簡単にこのコマンドで解決することができます、説明は、SQLステートメントの実行効率をチェックするために使用することができます、より良いインデックスを選択し、クエリ文を最適化することができます、より良い最適化文を記述します。

Explainのシンタックス

explain select ... from ... [where ...]

explain select * from dual;

簡単な例として、次のようなものがあります。

EXPLAIN SELECT * FROM tenk1;
               QUERY PLAN
----------------------------------------------------------------
   Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244)

EXPLAINで参照されるデータは。

1). 予想される起動時のオーバーヘッド(出力スキャンが始まるまでに消費される時間、例えばソートされたノードでラインアップを行う時間など)。

2). 予想される総オーバーヘッド。

3). この計画ノードの出力の予想行数.

4). この計画ノードの行の平均幅(バイト単位)の予想値.

ここで、オーバーヘッド(コスト)は、ディスク・ページ・アクセス数という単位で計算される。例えば、1.0はディスク・ページのシーケンシャル・リード1回分を表すことになる。上位ノードのオーバーヘッドは、そのすべての子ノードのオーバーヘッドを含むことになる。ここでの出力行数(rows)は、計画ノードが処理/スキャンした行数ではなく、通常はもう少し少なくなる。一般に、上位レベルで期待される行数は、クエリによって返される実際の行数に近くなります。

ここで、システムテーブルを元に以下のクエリを実行します。

SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1';

クエリーの結果から、tenk1テーブルには358ディスクページと10,000レコードがあることがわかりますが、コスト値を計算するためには、まだ別のシステムパラメーターの値を知る必要があります。

postgres=# show cpu_tuple_cost;
   cpu_tuple_cost
  ----------------
   0.01
  (1 row)
cost = 458(number of disk pages) + 10000(number of rows) * 0.01(cpu_tuple_cost system parameter value)

補足:postgresql SQL COUNT(DISTNCT FIELD)の最適化について

コンテキスト

ある期間のキーワードの総数を、nullも含めてすべて数える(統計は400w以上のデータがあり、テーブルサイズは600M)ので

sqlを書きます。

select count(distinct keyword) + 1 as count from statistics;

質問

バックグラウンドクエリですが、実行時間が38.6秒と遅いので、どのように最適化すればよいですか?

解決する

方法1(症状を治療する)

この実行のタイミングを計ってsqlの結果をキャッシュし、プログラムがキャッシュされた結果にアクセスすると、ページアクセスは速くなりますが、本質的にはsqlの実行が遅いという問題は解決されません。

方法2(治療法)

最適化sqlは、まず、なぜcount( distinct FIELD)が遅いのか、ここはもう繰り返さない、この記事を参照してください。 https://www.codedevlib.com/article/65680.htm

最適化されたコンテンツ。

select count( distinct FIELD ) from table

に変更します。

select count(1) from (select distinct FIELD from table) as foo;

比較する

explian anaylze sqlステートメントを使用して、実行プロセスを比較および表示することができます。

上記は私の個人的な経験ですが、参考にしていただき、BinaryDevelopをより支持していただければと思います。もし、間違いや不十分な考察があれば、遠慮なくアドバイスしてください。