以下に、グループバイ句問題を使用した説明計画に関連する詳細な説明を示します。
テーブル: 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句に問題がありますか?