172 похожих чатов

Ребят, подскажите плиз Есть такой запрос select id,

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
Я вроде сделал индекс, но он не подтягивается почему-то
Подскажите почему так? И вообще возможно-ли внутри оконной функции использовать индексы?

5 ответов

22 просмотра

Сужу сугубо по плану Раз сортировка делается на диске, а не за счёт индекса

вас более опытные товарищи все равно попросят \d таблицы привести. Но я вижу, что на таблице в 50млн строк вы пытаетесь выбрать 40 млн и отсортировать их по id, updated_at (что уже наводит на мысли). Seq scan у вас там есть, но вы же огромную таблицу почти без фильтра пытаетесь вычитать. Он будет там и с индексом и без скорее всего. Проблема скорее всего не в том, что у вас индекс не используется, а в том, что вы много данных пытаетесь отсортировать. Ну и work_mem ваш тут было бы полезно узнать

Ворк мем 256 МБ

операции на диске идут потому что у вас в память все не влезает. Вот по-вашему external merge Disk который пишет вам система влезет в ваши 256Мб?

Нет, конечно Но увеличивать до 20 ГБ, тоже, как я думаю, не совсем целесообразно

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта