потеря индексации в postgresql - PullRequest
0 голосов
/ 13 мая 2018

Я сталкиваюсь с редкой ситуацией при создании и удалении индексов для таблицы, скажем, что мы создаем следующую таблицу:

create table my_table(id serial primary key, label text);

Поскольку в этой таблице содержится первичный ключ , мынаш первый индекс, в дополнение к этому давайте добавим еще один:

create index my_index on my_table(label);

А теперь некоторые данные ...

insert into my_table (label) values ('alpha');
insert into my_table (label) values ('beta');
insert into my_table (label) values ('sigma');
insert into my_table (label) values ('sigma');
insert into my_table (label) values ('alpha');
insert into my_table (label) values ('gamma');

На данный момент у нас есть два индекса, которые отлично работают, так как мыможно увидеть на следующем sql объясняет

explain analyze select * from my_table where label = 'alpha';

Bitmap Heap Scan on my_table  (cost=4.20..13.67 rows=6 width=36) 
                              (actual time=0.022..0.022 rows=2 loops=1)
  Recheck Cond: (label = 'alpha'::text)
  Heap Blocks: exact=1
  ->  Bitmap Index Scan on my_index  (cost=0.00..4.20 rows=6 width=0) 
                                     (actual time=0.016..0.016 rows=2 loops=1)
        Index Cond: (label = 'alpha'::text)
Planning time: 0.084 ms
Execution time: 0.046 ms

Проблема заключается в том, что если я коснусь индексов в этой точке, либо добавив третий или воссоздав my_index Iполучить боль последовательное сканирование , например:

drop index my_index;
create index my_index on my_table(label);

-- executing the same search againg
explain analyze select * from my_table where label = 'alpha';

Seq Scan on my_table  (cost=0.00..1.08 rows=1 width=36) 
                      (actual time=0.025..0.026 rows=2 loops=1)
  Filter: (label = 'alpha'::text)
  Rows Removed by Filter: 4
Planning time: 0.111 ms
Execution time: 0.036 ms

Насколько я понимаю, всякий раз, когда я создаю индекс, данные в таблице должны индексироваться , блокируя все операции записи всреднее время - , и это почему-то не происходит, я игнорирую, кто-нибудь знает, почему это так?

Заранее спасибо,

1 Ответ

0 голосов
/ 13 мая 2018

Невозможно сделать какие-либо выводы об использовании индексов в таблице с несколькими строками. Подготовьте тестовые данные по крайней мере с несколькими сотнями тысяч строк, например ::1001

drop table if exists my_table cascade;
create table my_table(id serial primary key, label text);
create index my_index on my_table(label);
insert into my_table (label)
select generate_series(1, 500000)::text

Обновите статистику таблицы перед применением объяснения:

vacuum analyze my_table;

Выполнить объяснение:

explain analyze select * from my_table where label = '123456';

                                                     QUERY PLAN                                                     
--------------------------------------------------------------------------------------------------------------------
 Index Scan using my_index on my_table  (cost=0.42..8.44 rows=1 width=10) (actual time=0.288..0.290 rows=1 loops=1)
   Index Cond: (label = '123456'::text)
 Planning time: 80.753 ms
 Execution time: 0.476 ms
(4 rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...