Настройка производительности: создание индекса для логического столбца

Я написал демон-процессор, который будет извлекать строки из одной базы данных и вставлять их в другую для синхронизации. Он будет извлекать строки на основе флага индикации boolean sync_done.

В моей таблице сотни тысяч строк. Если я выберу все строки с помощью sync_done is false, вызовет ли это какие-либо проблемы с производительностью базы данных? Должен ли я применять индексацию для этого столбца sync_done для повышения производительности, поскольку извлекаются только строки со значением sync_done false?

Скажем, у меня есть 10000 строк. Из них 9500 уже синхронизированы (sync_done is true) и не будут выбраны.

Пожалуйста, предложите, как я могу поступить.


person Pavunkumar    schedule 19.08.2012    source источник


Ответы (4)


Для такого запроса лучше всего подойдет частичный индекс.

CREATE INDEX ON tbl (id) WHERE sync_done = FALSE;

Однако для такого случая использования для начала могут быть предпочтительнее другие методы синхронизации:

person Erwin Brandstetter    schedule 19.08.2012

Я предлагаю вам не индексировать таблицу (логическое значение является полем с низкой кардинальностью), а вместо этого разбить ее по логическому значению.

См.: http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

person Johan    schedule 19.08.2012

Таблица с записями и логическим полем должна быть способом сделать это.

Вот кое-что, что, я думаю, может вам помочь...

Растровый индекс

Альтернатива растрового индекса в PostgreSQL

person Bharat Sinha    schedule 19.08.2012
comment
Postgresql теперь поддерживает растровые индексы. - person mlissner; 26.08.2015
comment
@mlissner: Вероятно, это недоразумение. В Postgres нет растровых индексов. Postgres поддерживает сканирование растрового индекса метода доступа к индексу для многих различных типов индексов. . - person Erwin Brandstetter; 25.01.2017
comment
Но он поддерживает фильтры Блума, которые можно использовать в подобных случаях. - person DylanYoung; 02.11.2018

Индекс, безусловно, поможет, но вместо опроса, который может создать проблемы с нагрузкой и параллелизмом, если ваша база данных интенсивно используется, возможно, стоит рассмотреть метод уведомления, такой как amqp или подход на основе очереди триггера/базы данных вместо Slony или Skytools Londiste. Я использовал как Slony, так и Londiste для репликации на основе триггеров и нашел оба превосходными. Я предпочитаю Londiste, так как его намного проще настроить и управлять им (и если у вас есть простой вариант использования, придерживайтесь более старой ветки 2.).

person Gavin    schedule 19.08.2012