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 ГБ, тоже, как я думаю, не совсем целесообразно
Обсуждают сегодня