F.46. plantuner

Модуль plantuner добавляет поддержку указаний для планировщика, позволяющих отключать или подключать определённые индексы при выполнении запроса.

F.46.1. Объяснение

Это можно считать хорошей или плохой возможностью, но иногда управлять планировщиком очень интересно (давать указания оптимизатору частично отключать его алгоритмы), однако в настоящее время это невозможно в Postgres Pro (и в PostgreSQL). При этом Oracle, например, поддерживает более 120 вариантов таких указаний; также их поддерживает и Microsoft SQL Server.

Первая версия plantuner даёт возможность скрыть определённые индексы от планировщика Postgres Pro, чтобы он их не использовал.

Очень часто возникают ситуации, когда разработчик хотел бы временно отключить определённые индексы, не удаляя их, либо, наоборот, принудить планировщик использовать некоторый индекс.

Кроме того, с некоторой нагрузкой Postgres Pro бывает слишком пессимистичным в отношении только что созданных таблиц и считает, что в них содержится гораздо больше строк, чем есть на самом деле. Если же переменная GUC plantuner.fix_empty_table имеет значение true, модуль будет обнулять число страниц/кортежей в таблице, которая не содержит никаких блоков в файле.

F.46.2. Синтаксис

plantuner.disable_index — Список индексов, которые не будет видеть планировщик

plantuner.enable_index — Список индексов, которые будет видеть планировщик, даже если они скрыты параметром plantuner.disable_index.

F.46.3. Пример

Чтобы включить этот модуль, вы можете либо загрузить разделяемую библиотеку 'plantuner' в сеансе psql либо указать её в параметре 'shared_preload_libraries' в postgresql.conf.

=# LOAD 'plantuner';
=# create table test(id int);
=# create index id_idx on test(id);
=# create index id_idx2 on test(id);
=# \d test
     Table "public.test"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | integer |
Indexes:
    "id_idx" btree (id)
    "id_idx2" btree (id)
=# explain select id from test where id=1;
                              QUERY PLAN
-----------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=4.34..15.03 rows=12 width=4)
   Recheck Cond: (id = 1)
   ->  Bitmap Index Scan on id_idx2  (cost=0.00..4.34 rows=12 width=0)
         Index Cond: (id = 1)
(4 rows)
=# set enable_seqscan=off;
=# set plantuner.disable_index='id_idx2';
=# explain select id from test where id=1;
                              QUERY PLAN
----------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=4.34..15.03 rows=12 width=4)
   Recheck Cond: (id = 1)
   ->  Bitmap Index Scan on id_idx  (cost=0.00..4.34 rows=12 width=0)
         Index Cond: (id = 1)
(4 rows)
=# set plantuner.disable_index='id_idx2,id_idx';
=# explain select id from test where id=1;
                               QUERY PLAN
-------------------------------------------------------------------------
 Seq Scan on test  (cost=10000000000.00..10000000040.00 rows=12 width=4)
   Filter: (id = 1)
(2 rows)
=# set plantuner.enable_index='id_idx';
=# explain select id from test where id=1;
                              QUERY PLAN
-----------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=4.34..15.03 rows=12 width=4)
   Recheck Cond: (id = 1)
   ->  Bitmap Index Scan on id_idx  (cost=0.00..4.34 rows=12 width=0)
         Index Cond: (id = 1)
(4 rows)
      

F.46.4. Авторы

Разработку осуществили Фёдор Сигаев (teodor@sigaev.ru) и Олег Бартунов (oleg@sai.msu.su).

Эта работу спонсировал проект Nomao (http://www.nomao.com).