タグ付けされた質問 「postgresql-performance」

PostgreSQLクエリのパフォーマンスの問題

4
PostgreSQLテーブルの行のサイズを測定する
PostgreSQLテーブルがあります。素晴らしくて速いのselect *に対し、非常に遅いselect idです。行のサイズが非常に大きく、転送に時間がかかっているか、または他の要因である可能性があります。 すべてのフィールド(またはほとんどすべてのフィールド)が必要なので、サブセットを選択するだけでは簡単に修正できません。必要なフィールドの選択がまだ遅いです。 以下に、テーブルスキーマから名前を除いたものを示します。 integer | not null default nextval('core_page_id_seq'::regclass) character varying(255) | not null character varying(64) | not null text | default '{}'::text character varying(255) | integer | not null default 0 text | default '{}'::text text | timestamp with time zone | integer | timestamp with time …

6
「最新の対応する行」を効率的に取得するにはどうすればよいですか?
非常に一般的なクエリパターンがありますが、効率的なクエリを作成する方法がわかりません。別のテーブルの行の「後ではなく最新の日付」に対応するテーブルの行を検索したい。 inventoryたとえば、特定の日に保有する在庫を表すテーブルがあります。 date | good | quantity ------------------------------ 2013-08-09 | egg | 5 2013-08-09 | pear | 7 2013-08-02 | egg | 1 2013-08-02 | pear | 2 そして、「価格」と言うテーブルは、特定の日に財の価格を保持します date | good | price -------------------------- 2013-08-07 | egg | 120 2013-08-06 | pear | 200 2013-08-01 | egg | 110 …

2
WHERE句は、記述された順に適用されますか?
大きなテーブル(3700万行)を調べるクエリを最適化しようとしていますが、クエリで操作が実行される順序について質問があります。 select 1 from workdays day where day.date_day >= '2014-10-01' and day.date_day <= '2015-09-30' and day.offer_id in ( select offer.offer_day from offer inner join province on offer.id_province = province.id_province inner join center cr on cr.id_cr = province.id_cr where upper(offer.code_status) <> 'A' and province.id_region in ('10' ,'15' ,'21' ,'26' ,'31' , …

2
大規模なINを使用したPostgresクエリの最適化
このクエリは、フォローしている人が作成した投稿のリストを取得します。フォローできる人の数に制限はありませんが、ほとんどの人は1000人未満をフォローしています。 このスタイルのクエリでは、明らかな最適化は"Post"ID をキャッシュすることですが、残念ながら今のところその時間はありません。 EXPLAIN ANALYZE SELECT "Post"."id", "Post"."actionId", "Post"."commentCount", ... FROM "Posts" AS "Post" INNER JOIN "Users" AS "user" ON "Post"."userId" = "user"."id" LEFT OUTER JOIN "ActivityLogs" AS "activityLog" ON "Post"."activityLogId" = "activityLog"."id" LEFT OUTER JOIN "WeightLogs" AS "weightLog" ON "Post"."weightLogId" = "weightLog"."id" LEFT OUTER JOIN "Workouts" AS "workout" ON …

2
範囲タイプの正確な等価性に起因する不適切なクエリプランの処理方法
tstzrange変数の正確な等価性が必要な更新を実行しています。〜1M行が変更され、クエリには〜13分かかります。の結果はここでEXPLAIN ANALYZE見ることができ、実際の結果はクエリプランナーが推定した結果とは大きく異なります。問題は、インデックススキャンで単一の行が返されることを期待していることです。t_range これは、範囲タイプの統計が他のタイプの統計とは異なる方法で保存されるという事実に関連しているようです。pg_stats列のビューを見ると、n_distinctis -1であり、他のフィールド(most_common_valsなどmost_common_freqs)は空です。 ただし、t_rangeどこかに統計が保存されている必要があります。完全に同等ではなくt_rangeで「within」を使用する非常に類似した更新の実行には約4分かかり、実質的に異なるクエリプランを使用します(こちらを参照)。一時テーブルのすべての行と履歴テーブルのかなりの部分が使用されるため、2番目のクエリプランは理にかなっています。さらに重要なことは、クエリプランナーがのフィルタに対してほぼ正しい行数を予測することt_rangeです。 の分布t_rangeは少し珍しいです。このテーブルを使用して別のテーブルの履歴状態を保存していますが、他のテーブルへの変更は大きなダンプで一度に発生するため、の値はあまり多くありませんt_range。の一意の値のそれぞれに対応するカウントはt_range次のとおりです。 t_range | count -------------------------------------------------------------------+--------- ["2014-06-12 20:58:21.447478+00","2014-06-27 07:00:00+00") | 994676 ["2014-06-12 20:58:21.447478+00","2014-08-01 01:22:14.621887+00") | 36791 ["2014-06-27 07:00:00+00","2014-08-01 07:00:01+00") | 1000403 ["2014-06-27 07:00:00+00",infinity) | 36791 ["2014-08-01 07:00:01+00",infinity) | 999753 t_range上記のdistinctのカウントは完了しているため、カーディナリティは〜3Mです(このうち〜1Mは、いずれかの更新クエリの影響を受けます)。 クエリ1のパフォーマンスがクエリ2よりもはるかに低いのはなぜですか?私の場合、クエリ2が適切な代替品ですが、正確な範囲の均等性が本当に必要な場合、Postgresでよりスマートなクエリプランを使用するにはどうすればよいですか? インデックス付きのテーブル定義(無関係な列の削除): Column | Type | Modifiers ---------------------+-----------+------------------------------------------------------------------------------ history_id | integer | not null default nextval('gtfs_stop_times_history_history_id_seq'::regclass) …

4
同じ値で行を更新すると、実際に行が更新されますか?
パフォーマンス関連の質問があります。マイケルという名のユーザーがいるとしましょう。次のクエリを実行します。 UPDATE users SET first_name = 'Michael' WHERE users.id = 123 同じ値に更新されている場合でも、クエリは実際に更新を実行しますか?もしそうなら、どうすればそれを防ぐことができますか?

1
日付によるインデックスの最適化
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 PostgreSQL 9.0.8にはオブジェクトの大きなテーブル(1500万行以上)があり、そのために古いフィールドをクエリしたいと思います。 スケーラビリティと同時実行性を目的として、クエリを数百万で除算し、数日前の日付のupdated_atフィールドを使用してすべてのデータをフェッチしたい。 100万のIDで多くのインデックスとクエリを試しましたが、HerokuのRoninハードウェアで100秒未満のパフォーマンスを得ることができないようです。 これを可能な限り効率的にしようとしていない提案を探しています。 TRY#1 EXPLAIN ANALYZE SELECT count(*) FROM objects WHERE (date(updated_at)) < (date(now())-7) AND id >= 5000001 AND id < 6000001; INDEX USED: (date(updated_at),id) 268578.934 ms TRY#2 EXPLAIN ANALYZE SELECT count(*) FROM objects WHERE ((date(now()) - (date(updated_at)) > 7)) AND id >= …

1
インデックス:ノードの数が同じ場合の整数と文字列のパフォーマンス
PostgreSQL(9.4)データベースを使用してRuby on Railsでアプリケーションを開発しています。私のユースケースでは、アプリケーションの全体のポイントはモデル上の非常に特定の属性を検索するため、テーブルの列は非常に頻繁に検索されます。 私は現在、使用するかどうかを決定していますintegerタイプを、または単に(例えば、一般的な文字列型を使用character varying(255)、Railsのではデフォルトである私は、性能差がインデックスにどうなるかわからないよう、列に対して)。 これらの列は列挙型です。可能な値の量に対して固定サイズがあります。ほとんどの列挙の長さは5を超えません。これは、アプリケーションの存続期間中、インデックスが多少固定されることを意味します。したがって、整数と文字列のインデックスはノードの数が同じになります。 ただし、インデックス付けされる文字列の長さは約20文字で、メモリ内では整数の約5倍になります(整数が4バイトで、文字列が1文字あたり1バイトの純粋なASCIIの場合、これは成り立ちます)。私は、データベースエンジンがインデックスのルックアップを行う方法を知りませんが、それが一致するまで、それは「スキャン」の文字列に必要がある場合は、正確にそして本質的には、手段は、文字列検索が遅くなる整数のルックアップよりも5倍になるということ。整数ルックアップに一致するまでの「スキャン」は20ではなく4バイトになります。これが私が想像していることです。 ルックアップ値は(整数)4です。 スキャン.................. FOUND | レコードを取得しています... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... | ルックアップ値は(string) "some_val"(8バイト)です。 走査................................................. ....................................見つかった| レコードを取得しています... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 …


1
INSERTのみを受け取るテーブルでVACUUMを実行する価値はありますか?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 3年前に移行され ました。 2015年のre:Inventのトークで、AWSは更新または削除の後だけでなく、挿入後にもバキュームを実行する必要があると述べました。講演の関連部分は次のとおりです。 http://www.youtube.com/watch?v=tZXp19q8RFo&t=16m2s ブロックが挿入のみを受信した場合でも、ブロックに対して実行する必要があるクリーンアップがあり、このクリーンアップは、ブロックが最初に選択されたとき(読み取りを遅くする)またはバキューム中に実行できます。これは本当ですか?もしそうなら、正確にどのようなクリーンアップを行う必要がありますか?

1
log_min_duration_statement設定は無視されます
Postgresql 9.1Ubuntuで実行しています。正確なPostgresqlバージョンは9.1+129ubuntu1、パッケージマネージャーが示すとおりです。 アクティブに使用されている2つのデータベースがあり、それらはリモートサーバーから使用されます。 実行時間が長いクエリを記録したい。だから私は/etc/postgresql/9.1/main/postgresql.confファイルに次のパラメータを設定します log_min_duration_statement = 10000 log_statement = 'mod' そのため、Postgresqlは10秒以上かかるクエリをログに記録します。 しかし、私reloadがpostgres構成を行うと、Postgresqlはlog_statement値に適合するすべてのクエリのログを記録し始めます。確実に持続時間を100秒に設定したこと log_min_duration_statement = 100000 しかし、Postgresqlはlog_statement、値に関係なく、log_min_duration_statement値に適合するすべてのクエリのログを記録し続けます。 ロギングを停止log_statementするnoneように設定する。 構成に関して私が見逃したものはありますか?

1
なぜこのLEFT JOINがLEFT JOIN LATERALよりもパフォーマンスがそれほど悪いのですか?
次の表があります(Sakilaデータベースから取得)。 film:film_idはpkeyです 俳優:actor_idはpkeyです film_actor:film_idとactor_idは、映画/俳優のfkeyです 特定の映画を選択しています。この映画では、すべての俳優がその映画に参加することも望んでいます。これには2つのクエリがあります。1つのクエリLEFT JOINと1 つのクエリですLEFT JOIN LATERAL。 select film.film_id, film.title, a.actors from film left join ( select film_actor.film_id, array_agg(first_name) as actors from actor inner join film_actor using(actor_id) group by film_actor.film_id ) as a on a.film_id = film.film_id where film.title = 'ACADEMY DINOSAUR' order by film.title; select film.film_id, film.title, …

2
PostgreSQLでGINインデックスを使用するときにORDER BYソートを高速化する方法は?
私はこのようなテーブルを持っています: CREATE TABLE products ( id serial PRIMARY KEY, category_ids integer[], published boolean NOT NULL, score integer NOT NULL, title varchar NOT NULL); 製品は複数のカテゴリに属する​​ことができます。category_ids列は、すべての製品のカテゴリのIDのリストを保持します。 典型的なクエリは次のようになります(常に単一のカテゴリを検索します): SELECT * FROM products WHERE published AND category_ids @> ARRAY[23465] ORDER BY score DESC, title LIMIT 20 OFFSET 8000; スピードアップするには、次のインデックスを使用します。 CREATE INDEX idx_test1 ON products …

2
多くの列といくつかのテーブル-パフォーマンスの面で
はい、私はデータの正規化が(現状のまま)私の優先事項であることを認識しています。 私は列の車両データを格納する65個の列を持つテーブルを持っている:used_vehicle、color、doors、mileage、priceなど、合計65インチ 今、私はそれを分割して持つことができるVehicleテーブル、VehicleInterior、VehicleExterior、VehicleTechnical、VehicleExtra(すべての一対一のメインとVehicleテーブル)。 約500万行(車両)があるとします。 上SELECTでのWHERE句:パフォーマンスが(どちらの場合は、上の少なくともインデックスを付けて検索するほうが良いでしょうIDs): Vehicle 65列のテーブルまたは VehicleテーブルJOINSに関連するすべてのデータを返すために、他の4つのテーブル(すべてで5万行)にVehicle? (データベースエンジンごとに、PostgreSQLやMySQLを検討してください)。 以前の経験から得られた詳細な洞察を本当に感謝しますか?

2
大きなテーブルでのインデックススキャンが遅い
PostgreSQL 9.2を使用すると、比較的大きなテーブル(2億を超える行)でクエリが遅くなるという問題が発生します。クレイジーなことは何もしていません。単に歴史的な価値を加えているだけです。以下は、クエリとクエリプランの出力です。 私のテーブルレイアウト: Table "public.energy_energyentry" Column | Type | Modifiers -----------+--------------------------+----------------------------------------------------------------- id | integer | not null default nextval('energy_energyentry_id_seq'::regclass) prop_id | integer | not null timestamp | timestamp with time zone | not null value | double precision | not null Indexes: "energy_energyentry_pkey" PRIMARY KEY, btree (id) "energy_energyentry_prop_id" btree (prop_id) …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.