select query does not pick up the right index

From: Abadie Lana <Lana(dot)Abadie(at)iter(dot)org>
To: "pgsql-performance(at)lists(dot)postgresql(dot)org" <pgsql-performance(at)lists(dot)postgresql(dot)org>
Subject: select query does not pick up the right index
Date: 2019-01-02 16:28:41
Message-ID: c2d19232595246018b277ebcd59a0046@iter.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Hi all
I would appreciate any hints as this problem looks to me rather strange...I tried to google it but in vain.
select t.name, c.smpl_time,c.nanosecs,c.float_val,c.num_val,c.str_val,c.datatype,c.array_val from sample c, channel t where t.channel_id=c.channel_id and t.name='BUIL-B36-VA-RT-RT1:CL0001-2-ABW' order by c.smpl_time desc limit 5;
takes 20mn to execute because it picks up the wrong index...see explain analyse below. I would expect this query to use the (channel_id,smpl_time) but it uses the smpl_time index.
I have run analyse on the sample table. I have set default_statistics_target = 1000

When I removed this index, then the query goes down to a few seconds...

Any ideas, why the planner is not taking the right index?
Postgresql server is 10.5.1 running on RHEL 7.4

More details about the table and explain...
Thanks for your help
Lana

\d+ sample
Table "public.sample"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
-------------+-----------------------------+-----------+----------+-------------+----------+--------------+-------------
channel_id | bigint | | not null | | plain | |
smpl_time | timestamp without time zone | | not null | | plain | |
nanosecs | bigint | | not null | | plain | |
severity_id | bigint | | not null | | plain | |
status_id | bigint | | not null | | plain | |
num_val | integer | | | | plain | |
float_val | double precision | | | | plain | |
str_val | character varying(120) | | | | extended | |
datatype | character(1) | | | ' '::bpchar | extended | |
array_val | bytea | | | | extended | |
Indexes:
"sample_time_1_idx" btree (channel_id, smpl_time)
"sample_time_all_idx" btree (smpl_time, channel_id)
"smpl_time_qa_idx" btree (smpl_time)
Child tables: sample_buil,
sample_ctrl,
sample_util

\d+ sample_buil
Table "public.sample_buil"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
-------------+-----------------------------+-----------+----------+-------------+----------+--------------+-------------
channel_id | bigint | | not null | | plain | |
smpl_time | timestamp without time zone | | not null | | plain | |
nanosecs | bigint | | not null | | plain | |
severity_id | bigint | | not null | | plain | |
status_id | bigint | | not null | | plain | |
num_val | integer | | | | plain | |
float_val | double precision | | | | plain | |
str_val | character varying(120) | | | | extended | |
datatype | character(1) | | | ' '::bpchar | extended | |
array_val | bytea | | | | extended | |
Indexes:
"sample_time_b1_idx" btree (smpl_time, channel_id)
"sample_time_b_idx" btree (channel_id, smpl_time)
"smpl_time_bx0_idx" btree (smpl_time)
Inherits: sample
Child tables: sample_buil_month,
sample_buil_year

\d+ sample_buil_month
Table "public.sample_buil_month"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
-------------+-----------------------------+-----------+----------+-------------+----------+--------------+-------------
channel_id | bigint | | not null | | plain | |
smpl_time | timestamp without time zone | | not null | | plain | |
nanosecs | bigint | | not null | | plain | |
severity_id | bigint | | not null | | plain | |
status_id | bigint | | not null | | plain | |
num_val | integer | | | | plain | |
float_val | double precision | | | | plain | |
str_val | character varying(120) | | | | extended | |
datatype | character(1) | | | ' '::bpchar | extended | |
array_val | bytea | | | | extended | |
Indexes:
"sample_time_bm_idx" btree (channel_id, smpl_time)
"sample_time_mb1_idx" btree (smpl_time, channel_id)
"smpl_time_bx1_idx" btree (smpl_time)
Check constraints:
"sample_buil_month_smpl_time_check" CHECK (smpl_time >= (now() - '32 days'::interval)::timestamp without time zone AND smpl_time <= now())
Inherits: sample_buil

css_archive_3_0_0=# explain analyze select t.name, c.smpl_time,c.nanosecs,c.float_val,c.num_ val,c.str_val,c.datatype,c.array_val from sample c, channel t where t.channel_id=c.channel_i d and t.name='BUIL-B36-VA-RT-RT1:CL0001-2-ABW' order by c.smpl_time desc limit 5;
QUERY PLAN

--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
-------------
Gather (cost=1004.71..125606.08 rows=5 width=150) (actual time=38737.443..1220277.244 rows
=3 loops=1)
Workers Planned: 1
Workers Launched: 1
Single Copy: true
-> Limit (cost=4.71..124605.58 rows=5 width=150) (actual time=38731.488..1220117.046 ro
ws=3 loops=1)
-> Nested Loop (cost=4.71..240130785.25 rows=9636 width=150) (actual time=38731.4
86..1220117.040 rows=3 loops=1)
Join Filter: (c.channel_id = t.channel_id)
Rows Removed by Join Filter: 322099471
-> Merge Append (cost=4.71..235298377.47 rows=322099464 width=125) (actual
time=0.681..943623.198 rows=322099474 loops=1)
Sort Key: c.smpl_time DESC
-> Index Scan Backward using smpl_time_qa_idx on sample c (cost=0.12.
.8.14 rows=1 width=334) (actual time=0.010..0.010 rows=0 loops=1)
-> Index Scan Backward using smpl_time_bx0_idx on sample_buil c_1 (co
st=0.42..3543026.23 rows=1033169 width=328) (actual time=0.122..723.286 rows=1033169 loops=1
)
-> Index Scan Backward using smpl_time_cmx0_idx on sample_ctrl c_2 (c
ost=0.42..2891856.90 rows=942520 width=328) (actual time=0.069..712.386 rows=942520 loops=1)
-> Index Scan Backward using smpl_time_ux0_idx on sample_util c_3 (co
st=0.43..11310958.12 rows=5282177 width=328) (actual time=0.066..3688.980 rows=5282177 loops
=1)
-> Index Scan Backward using smpl_time_bx1_idx on sample_buil_month c_
4 (cost=0.43..49358435.15 rows=14768705 width=82) (actual time=0.070..9341.396 rows=1476870
5 loops=1)
-> Index Scan Backward using smpl_time_bx2_idx on sample_buil_year c_5
(cost=0.56..1897430.89 rows=50597832 width=328) (actual time=0.068..139840.439 rows=505978
34 loops=1)
-> Index Scan Backward using smpl_time_cmx1_idx on sample_ctrl_month c
_6 (cost=0.44..55253292.21 rows=18277124 width=85) (actual time=0.061..14610.389 rows=18277
123 loops=1)
-> Index Scan Backward using smpl_time_cmx2_idx on sample_ctrl_year c_
7 (cost=0.57..2987358.31 rows=79579072 width=76) (actual time=0.067..286316.865 rows=795790
75 loops=1)
-> Index Scan Backward using smpl_time_ux1_idx on sample_util_month c_
8 (cost=0.57..98830163.45 rows=70980976 width=82) (actual time=0.071..60766.643 rows=709809
80 loops=1)
-> Index Scan Backward using smpl_time_ux2_idx on sample_util_year c_9
(cost=0.57..3070642.94 rows=80637888 width=83) (actual time=0.069..307091.673 rows=8063789
1 loops=1)
-> Materialize (cost=0.00..915.83 rows=1 width=41) (actual time=0.000..0.00
0 rows=1 loops=322099474)
-> Seq Scan on channel t (cost=0.00..915.83 rows=1 width=41) (actual
time=4.683..7.885 rows=1 loops=1)
Filter: ((name)::text = 'BUIL-B36-VA-RT-RT1:CL0001-2-ABW'::text)
Rows Removed by Filter: 33425
Planning time: 31.392 ms
Execution time: 1220277.424 ms
(26 rows)

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Justin Pryzby 2019-01-02 16:45:25 Re: select query does not pick up the right index
Previous Message Pavel Stehule 2018-12-31 17:33:30 Re: [HACKERS] proposal: schema variables