household_id,
device_id,
package_id,
status,
payment_type,
ownership_type,
price,
msisdn,
virtual_msisdn,
transaction_id,
code,
confirmation_count,
code_sent_at,
device_type,
device_display_type,
device_client_version,
device_samsung_duid,
created_at,
updated_at,
code_valid_until,
msisdn_data,
meta,
valid_from,
valid_to,
moboperator,
rate_plan,
billing_id,
inplat_payment_id,
meta::jsonb ->> 'discount_id'::text AS discount_id,
meta::jsonb ->> 'promocode_id'::text AS promocode_id,
household_package_id
from (
select o.*,
row_number() over (partition by id order by id, updated_at desc) as rn
from tv_bmp.orders o
where 1=1
and o.valid_to = '9999-12-31 00:00:00'::timestamp without time zone
or o.valid_to = '2222-12-31 00:00:00'::timestamp without time zone) o1
where rn = 1
Его план:
Subquery Scan on o1 (cost=9348546.09..10970121.98 rows=231158 width=693) (actual time=94045.042..208921.213 rows=39916161 loops=1)
Filter: (o1.rn = 1)
Rows Removed by Filter: 9095872
-> WindowAgg (cost=9348546.09..10388758.71 rows=46231672 width=637) (actual time=94045.028..132101.539 rows=49012033 loops=1)
-> Sort (cost=9348546.09..9464125.27 rows=46231672 width=629) (actual time=94045.017..105937.806 rows=49012033 loops=1)
Sort Key: o.id, o.updated_at DESC
Sort Method: external merge Disk: 18137688kB
-> Index Scan using orders_valid_to_idx on orders o (cost=0.56..2703764.57 rows=46231672 width=629) (actual time=0.017..31535.563 rows=49012033 loops=1)
Planning time: 0.220 ms
Execution time: 212127.598 ms
Проблемный момент заключается в этом месте Sort Method: external merge Disk: 18137688kB
Я вроде сделал индекс, но он не подтягивается почему-то
Подскажите почему так? И вообще возможно-ли внутри оконной функции использовать индексы?
Сужу сугубо по плану Раз сортировка делается на диске, а не за счёт индекса
вас более опытные товарищи все равно попросят \d таблицы привести. Но я вижу, что на таблице в 50млн строк вы пытаетесь выбрать 40 млн и отсортировать их по id, updated_at (что уже наводит на мысли). Seq scan у вас там есть, но вы же огромную таблицу почти без фильтра пытаетесь вычитать. Он будет там и с индексом и без скорее всего. Проблема скорее всего не в том, что у вас индекс не используется, а в том, что вы много данных пытаетесь отсортировать. Ну и work_mem ваш тут было бы полезно узнать
Ворк мем 256 МБ
операции на диске идут потому что у вас в память все не влезает. Вот по-вашему external merge Disk который пишет вам система влезет в ваши 256Мб?
Нет, конечно Но увеличивать до 20 ГБ, тоже, как я думаю, не совсем целесообразно
Обсуждают сегодня