Your statement seems obvious to me. But what I see doesn't seem like a
conscious choice. It turns out that it is better to have a lighter
general-purpose index than to strive to create a target covering index for
a certain kind of operation.

DROP INDEX IF EXISTS bpd.index_class_prop_id_prop_inherit;
CREATE INDEX IF NOT EXISTS index_class_prop_id_prop_inherit
    ON bpd.class_prop USING btree
    (id_prop_inherit ASC NULLS LAST, timestamp_class_inherit ASC NULLS LAST)
    TABLESPACE pg_default;



DROP INDEX IF EXISTS bpd.index_class_prop_id_prop_inherit_covering;
CREATE INDEX IF NOT EXISTS index_class_prop_id_prop_inherit_covering
    ON bpd.class_prop USING btree
    (id_prop_inherit ASC NULLS LAST, timestamp_class_inherit ASC NULLS LAST)
    INCLUDE(id, id_class, inheritance)
    TABLESPACE pg_default;

Uchet=# SELECT relid, indexrelid, schemaname, relname, indexrelname,
idx_scan, idx_tup_read, idx_tup_fetch
Uchet-#
Uchet-#     FROM bpd.cfg_v_stat_all_indexes WHERE indexrelname LIKE
'index_class_prop_id_prop_inherit%';
 relid | indexrelid | schemaname |  relname   |               indexrelname
               | idx_scan | idx_tup_read | idx_tup_fetch
-------+------------+------------+------------+-------------------------------------------+----------+--------------+---------------
 17572 |      40036 | bpd        | class_prop |
index_class_prop_id_prop_inherit          |        0 |            0 |
      0
 17572 |      40037 | bpd        | class_prop |
index_class_prop_id_prop_inherit_covering |     7026 |         7026 |
      0
(2 rows)


DROP INDEX IF EXISTS bpd.index_class_prop_id_prop_inherit_covering;

CREATE INDEX IF NOT EXISTS index_class_prop_id_prop_inherit_covering
    ON bpd.class_prop USING btree
    (id_prop_inherit ASC NULLS LAST, timestamp_class_inherit ASC NULLS LAST)
    INCLUDE(id, id_class, inheritance)
    TABLESPACE pg_default;

DROP INDEX IF EXISTS bpd.index_class_prop_id_prop_inherit;

CREATE INDEX IF NOT EXISTS index_class_prop_id_prop_inherit
    ON bpd.class_prop USING btree
    (id_prop_inherit ASC NULLS LAST, timestamp_class_inherit ASC NULLS LAST)
    TABLESPACE pg_default;

Uchet=# SELECT relid, indexrelid, schemaname, relname, indexrelname,
idx_scan, idx_tup_read, idx_tup_fetch FROM bpd.cfg_v_stat_all_indexes WHERE
indexrelname LIK
E 'index_class_prop_id_prop_inherit%';
 relid | indexrelid | schemaname |  relname   |               indexrelname
               | idx_scan | idx_tup_read | idx_tup_fetch
-------+------------+------------+------------+-------------------------------------------+----------+--------------+---------------
 17572 |      40049 | bpd        | class_prop |
index_class_prop_id_prop_inherit          |     6356 |         6356 |
      0
 17572 |      40048 | bpd        | class_prop |
index_class_prop_id_prop_inherit_covering |        0 |            0 |
      0
(2 rows)
--
Regards, Dmitry!


пн, 20 июн. 2022 г. в 00:08, David G. Johnston <david.g.johns...@gmail.com>:

> On Sun, Jun 19, 2022 at 12:06 PM Дмитрий Иванов <firstdis...@gmail.com>
> wrote:
>
>> Good afternoon.
>> I have a query parser question. If there are two kinds of queries using
>> an indexed field. In this case, one view is limited to this field, the
>> second one uses a number of fields included in the index by the include
>> directive. It makes sense to have two indexes, lightweight and containing
>> include. Or will the plan rely on the nearest suitable index without
>> considering its weight?
>>
>>
> The system should avoid the larger sized index unless it will sufficiently
> benefit from the Index Only Scan that such a larger covering index is
> supposed to facilitate.
>
> David J.
>

Reply via email to