Postgresqlの操作でSQL文の実行効率を表示する
説明コマンドは、データベースのパフォーマンスを解決するための最初の推奨コマンドです、パフォーマンスの問題のほとんどは簡単にこのコマンドで解決することができます、説明は、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をより支持していただければと思います。もし、間違いや不十分な考察があれば、遠慮なくアドバイスしてください。
関連
-
Postgresqlの高度なアプリケーションは、セルのアイデアをマージするの詳細
-
単語をソートするカスタム関数とそれをPostgreSQLで使用する(実装コード)
-
PostgreSQLでバッファキャッシュにデータを読み込む方法
-
PostgreSQLのユーザーログイン失敗時の自動ロック解決策
-
PostgreSQLで文字列が対象の文字列を含むかどうかを判断する様々な方法
-
PostgreSQLがバキュームテーブルの情報を収集する必要があることを発見する方法
-
pgAdmin for postgreSQLでサーバーのデータをバックアップする方法
-
Postgresqlのセルフインクリメントidをキーにした場合の重複問題の解決
-
PostgreSQLで時間指定タスクを実装する4つの方法
-
PostgreSQLにおけるVACUUMコマンドの使用方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PostgreSQLのJSONBのマッチングと交差の問題について
-
postgresql 重複データ削除 ケーススタディ
-
PostgreSQLのテーブルをパーティション分割する3つの方法
-
Postgresqlへのリモートアクセスの設定方法(ファイアウォールの設定またはOFFが必要です。)
-
GROUP BY句での定数使用に関するPostgreSQLの特別な制限について説明します。
-
Postgresqlのデータは、2つのフィールドを追加し、一意の操作を統合する
-
postgreSQLのクエリ結果に自己インクリメントシーケンス演算が追加されました。
-
PostgreSQLはバッチ実行のためにSQLをファイルに実装しています。
-
PostgreSQLの自己インクリメント構文使用上の注意点
-
PostgreSqlのhash_code関数の使用法