[pgsql-jp: 41594] Re: order by での indexの利用について

TAKATSUKA Haruka harukat @ postgresql.jp
2014年 3月 14日 (金) 15:32:02 JST


高塚です。

とりあえず、set enable_hashjoin TO off; で merge join にさせると
どうなるかを試したいですね。

On Fri, 14 Mar 2014 15:00:06 +0900 (JST)
prod2011 @ yahoo.co.jp wrote:

> 
> 
> こんにちは。Prodです。
> 
> 花田様、高塚様
> ご返信ありがとうございます。
> 
> こちらからの返信が遅くなり、申し訳ございません。
> 
> また、提示したSQLですが、簡略した時に、
> 簡略化しすぎてしまい、別物の状態になってしまっておりました。
> あらためて、SQLを張り付けさせていただきます。
> 大変申し訳ございません。深くお詫びいたします。
> 
> --SQL------------------------------------
> 
> 
>   SELECT
>         a.col1
>     ,   a.col2
>     ,   a.col3
>     ,   a.col4
>     ,   a.col5
>     ,   b.col6
>     ,   b.col7 ~ b.col39
>   FROMtable_a a
> 
> INNER JOIN table_b b ON a.col1 = b.col1
>  where a.col2 = '000001'
>         AND a.col3 = '1'
>         AND a.col4 >= '20110313'
>         AND a.col4 <= '20140313'
>  ORDER BY
>         a.col4
>         ,a.col5
>         ,b.col6
> offset 0 limit 500
> 
> --複合インデックスで以下を設定しております。
> table_a  :  table_a_index2 (col2,col3,col4,col5)
> table_b  :  pk_table_b     (col1,col6) ※こちらはテーブルのキー
> 
> ここで、order by のb.col6があるとき、ないとき、で全然速度がことなります。
> 目標としている速度は、2以内秒 です。
> 
> explain analyze 結果
> 
> -- order by に b.col6 があるとき
> QUERY PLAN
> Limit  (cost=238444.56..238445.81 rows=500 width=422) (actual time=11188.332..11189.201 rows=500 loops=1)
>   ->  Sort  (cost=238444.56..240878.37 rows=973526 width=422) (actual time=11188.329..11188.627 rows=500 loops=1)
>         Sort Key: a.col4, a.col5, b.col6
>         Sort Method: top-N heapsort  Memory: 145kB
>         ->  Hash Join  (cost=8309.25..189934.81 rows=973526 width=422) (actual time=412.471..8010.280 rows=1007366 loops=1)
>               Hash Cond: (b.col1 = a.col1)
>               ->  Seq Scan on table_b b  (cost=0.00..52933.17 rows=1054017 width=401) (actual time=0.008..2496.485 rows=1054298 loops=1)
>               ->  Hash  (cost=5596.00..5596.00 rows=143940 width=27) (actual time=412.280..412.280 rows=143942 loops=1)
>                     Buckets: 8192  Batches: 4  Memory Usage: 1851kB
>                     ->  Seq Scan on table_a a  (cost=0.00..5596.00 rows=143940 width=27) (actual time=0.007..222.787 rows=143942 loops=1)
>                           Filter: ((col4 >= 20110313) AND (col4 <= 20140313) AND ((col2)::text = '000001'::text) AND ((col3)::text = '1'::text))
> Total runtime: 11191.317 ms
> 
> 
> -- order by に b.col6 がないとき
> 
> QUERY PLAN
> Limit  (cost=0.00..1045.56 rows=500 width=422) (actual time=0.137..3.933 rows=500 loops=1)
>   ->  Nested Loop  (cost=0.00..2035757.68 rows=973526 width=422) (actual time=0.134..3.262 rows=500 loops=1)
>         ->  Index Scan using table_a_index2 on table_a a  (cost=0.00..169939.99 rows=143940 width=27) (actual time=0.110..0.205 rows=72 loops=1)
>               Index Cond: (((col2)::text = '000001'::text) AND ((col3)::text = '1'::text) AND (col4 >= 20110313) AND (col4 <= 20140313))
>         ->  Index Scan using pk_table_b on table_b b  (cost=0.00..12.87 rows=7 width=401) (actual time=0.009..0.018 rows=7 loops=72)
>               Index Cond: (col1 = a.col1)
> Total runtime: 4.541 ms
> 
> 
> テーブルの物理サイズです。
> 
> table_a 22257664
> 
> table_b 347283456
> 
(後略)
______________________________________________________________________
 日本PostgreSQLユーザ会  高塚 遙  http://www.postgresql.jp 
 〒171-0022 東京都豊島区南池袋2-32-8 8F  SRA OSS, Inc. 内
 TEL: 03-5979-2729  FAX: 03-5979-2702  E-Mail:harukat @ postgresql.jp



pgsql-jp メーリングリストの案内