0

以下のクエリを実行すると

explain
select count(*) over() as t_totalcnt,  max(hits) over() as t_maxhits,  max(bytes) over() as t_maxbytes, * 
from 
(
    select category,sum(hits) as hits,sum(bytes) as bytes 
    from (
        select "5mintime",category,hits,bytes,appid, 0 as tmpfield
       from web_categoryutfv1_24hr_ts_201209 
       where "5mintime" >='2012-09-12 00:00:00' and "5mintime" < '2012-09-19 00:00:00'
    ) as tmp  
    where "5mintime" >='2012-09-12 00:00:00' 
    and "5mintime" <= '2012-09-18 23:59:59' 
    and appid in ('') group by category order by hits desc 
) as foo 
limit 10;

以下の出力が得られます

  Limit  (**cost=31.31..31.61** rows=10 width=580)
  ->  WindowAgg  (**cost=31.31..32.03** rows=24 width=580)   
  ->  Subquery Scan foo  (cost=31.31..31.61 rows=24 width=580)
     ->  Sort  (**cost=31.31..31.37** rows=24 width=31)
        Sort Key: (sum(web_categoryutfv1_24hr_ts_201209.hits))
               ->  HashAggregate  (**cost=30.39..30.75** rows=24 width=31)
                    ->  Seq Scan on web_categoryutfv1_24hr_ts_201209  (cost=0.00..27.60 rows=373 width=31)
            Filter: (("5mintime" >= '2012-09-12 00:00:00'::timestamp without time zone) 
                   AND ("5mintime" < '2012-09-19 00:00:00'::timestamp without time zone)
                   AND ("5mintime" >= '2012-09-12 00:00:00'::timestamp without time zone)
                   AND ("5mintime" <= '2012-09-18 23:59:59'::timestamp without time zone)
                   AND ((appid)::text = ''::text))

説明タグなしで上記のクエリを実行したとき。ここでは cost=31.31..31.61 ですが、1 秒で出力が得られます。

説明計画でのコストキーワードの意味を理解するのを手伝ってください。説明計画でのコストキーワードの単位を意味しますか?

4

1 に答える 1

1

コストは、クエリプランナーによる、操作の難易度または実行にかかる時間の見積もりです。これは、いくつかのマシンレベルのパラメーター(たとえば、ディスクシークとストリーミング読み取りにかかる時間)と、各行の大きさ、行の数、値の分布などのテーブルレベルの情報に基づいています。各列に。単位はなく、結果のコスト値は任意です。コストは、PostgreSQLがクエリの実行方法を理解するために使用するメトリックです。クエリを実行し、コストが最も低いプランを選択するための無数の方法を検討します。コスト計算の詳細については、PlannerCostConstraintsを参照してください。

デフォルト設定を使用していると仮定すると、シーケンシャルスキャンのコストがこれほど低いことは、PostgreSQLがそのテーブルに多くの行がないと考えていることを示唆しています。実行に1秒かかるという事実は、実際、そのテーブルに多くの行があることを示しています。と言うことで、そのテーブルの新しい統計を収集するようにPostgreSQLに指示できますANALYZE web_categoryutfv1_24hr_ts_201209。プロセスはpg_autovacuumとにかく定期的に統計を収集する必要がありますが、古いバージョンのPostgreSQLを使用しているか、しばらく実行されていないか、誰が知っているかです。とにかく、手作業でやり直しても害はありません。

PostgreSQLがテーブルが小さいと判断した場合、テーブル全体のシーケンシャル読み取りは、インデックススキャンとそれに続く一連のランダム読み取りよりも高速であるため、インデックスを使用するよりもシーケンシャルスキャンを優先します。一方、PostgreSQLがテーブルが大きいと判断した場合、インデックスによって多くの行を除外できると仮定すると、5mintimeおよび/またはのインデックスを参照する方が高速になる可能性があります。appidそのようなインデックスがない場合は、作成することを検討してください。

最後にもう1つEXPLAIN、という名前の兄がいEXPLAIN ANALYZEます。EXPLAINPostgreSQLが選択するクエリプランとその決定を導いたコストを示しながら、EXPLAIN ANALYZE実際にクエリを実行し、各コンポーネントの実行にかかった時間を示します。詳細については、 EXPLAINを参照してください。

于 2012-09-20T17:22:47.737 に答える