1

データベース内のすべてが正常に実行されていました-読み取り、書き込み、多くのアクティビティ。

foos次に、テーブルに列を追加したいと思いました。foosテーブルが使用できなくなりました。クエリを実行しているコードを終了し、システム内のロックを調べました。以下のクエリが 15 日間ロックされていることがわかりました。その後、テーブルを変更するクエリがあり、その後、foosテーブルに関係するさらに多くのクエリがありました。

このクエリが 15 日間停止する原因は何ですか? これは 9.1.3 にあります

select generate_report, b.count from
   (select count(1), date_trunc('hour',f.event_happened_at) from
       foos as f, bars as b
       where age(f.event_happened_at) <= interval '24 hour' and f.id=b.foo_id and b.thing_type='Dog' and b.thing_id=26631
       group by date_trunc('hour',f.event_happened_at)) as e
   right join generate_report(date_trunc('hour',now()) - interval '24 hour',now(),interval '1 hour')
   on generate_report = b.date_trunc
   order by generate_report;

更新:からの情報pg_stat_activity

| | backend_start | xact_start | query_start | 待っている |
-------+---------+----------+------------------+-- --------------+--------------------------------+----------------- -------
| | 2012-11-19 18:38:40.029818+00 | 2012-11-19 18:38:40.145172+00 | 2012-11-19 18:38:40.145172+00 | ふ |

更新:説明の出力:

Merge Left Join  (cost=14135.74..14138.08 rows=1000 width=16)
  Merge Cond: (generate_report.generate_report = (date_trunc('hour'::text, f.event_happened_at)))
  ->  Sort  (cost=12.97..13.47 rows=1000 width=8)
        Sort Key: generate_report.generate_report
        ->  Function Scan on generate_report  (cost=0.00..3.00 rows=1000 width=8)
  ->  Sort  (cost=14122.77..14122.81 rows=67 width=16)
        Sort Key: (date_trunc('hour'::text, f.event_happened_at))
        ->  HashAggregate  (cost=14121.93..14122.17 rows=67 width=8)
              ->  Hash Join  (cost=3237.14..14121.86 rows=67 width=8)
                    Hash Cond: (b.foo_id = f.id)
                    ->  Index Scan using index_bars_on_thing_type_and_thing_id_and_baz on bars b  (cost=0.00..10859.88 rows=10937 width=4)
                          Index Cond: (((thing_type)::text = 'Dog'::text) AND (thing_id = 26631))
                    ->  Hash  (cost=3131.42..3131.42 rows=30207 width=12)
                          ->  Seq Scan on foos f  (cost=0.00..3131.42 rows=30207 width=12)
                                Filter: (age((('now'::text)::date)::timestamp without time zone, event_happened_at) <= '24:00:00'::interval)
4

1 に答える 1

1

投稿したpg_stat_activityからの情報によると、このクエリはまだ実行されているようです (待機中 = f)。これは、ロックがまだ解除されていないことを意味します。

クエリを調べて、クエリの構造や生成しているクエリ プランに問題がないかどうかを確認することをお勧めします。15 日間は明らかに長すぎます。実行時間の長いクエリのほとんどは、問題と見なされるまでに 10 分もかからないはずです。

それを支援するために、テーブル DDL、いくつかのサンプル データ、および各テーブルの行数のアイデアを投稿する必要があります。これはおそらく新しい質問として提示するのが最適ですが、いつでもこの質問を編集できます。

于 2012-12-05T18:05:05.897 に答える