0

以下に、グループバイ句問題を使用した説明計画に関連する詳細な説明を示します。

テーブル: web_categoryutfv1_24hr_ts_201209
列: "5mintime",category,hits,bytes,appid
行: 871
インデックス: "web_categoryutfv1_24hr_ts_201209_idx" btree ("5mintime")

次のクエリを実行しています。

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

t_totalcnt 変数から総行リターン 55 を取得しました。今、私はweb_categoryutfv1_24hr_ts_201209テーブルを分析し、もう一度説明して同じクエリを実行します

次の実行計画を取得します。

-> 制限 (コスト=31.31..31.61 行=10 幅=580)
-> WindowAgg (コスト=31.31..32.03行=24幅=580)
-> サブクエリ スキャン foo (cost=31.31..31.61 ***rows=24*** width=580)
      -> ソート (コスト=31.31..31.37行=24幅=31)
            ソートキー: (sum(web_categoryutfv1_24hr_ts_201209.hits))
            -> HashAggregate (コスト=30.39..30.75行=24幅=31)
                  -> web_categoryutfv1_24hr_ts_201209 の Seq Scan (cost=0.00..27.60 rows=373 width=31)
                      フィルタ: (("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'::タイム ゾーンなしのタイムスタンプ) AND ("5mintime" <= '2012-09-18 23:59:59'::タイムゾーンなしのタイムスタンプ) AND ((appid)::text = ''::text))

今、私は HashAggregate (cost=30.39..30.75 rows=24 width=31) を出力する説明計画を取得しました。これは、rows=24 を示していますが、実際には総行戻り値は 55 である必要があります。クエリから group by 句を削除すると、373 行が得られました計画の出力と実際のクエリの実行について説明します。

だから私は知りたいのですが、クエリのexplain planとgroup by句に問題がありますか?

4

1 に答える 1

1

実行計画に表示される行は見積もりです。それらが正しい大きさのどこかにある限り、問題はありません。それらが完全にずれている場合は、通常、統計が古くなっていることを意味します.

group by を削除すると、group by として予想される行数が減少することは理にかなっています。

だから私はそこに何の問題も見ません。

explain analyze実行計画で実績と実数を比較するために使用できます。

于 2012-09-21T07:05:15.443 に答える