Индексация Greenplum не используется в запросе - PullRequest
0 голосов
/ 27 июля 2011

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

Ex:

Explain select * from T where C='xxx'

При этом выполняется поиск во всех сегментах последовательно, без учета созданного мной индекса.

Я использовал следующие флаги

enable_seqscan = off
enable_bitmapscan = off
enable_indexscan = on

Я что-то упустил? Пожалуйста, объясните?

Спасибо Ganesh.R

Ответы [ 4 ]

1 голос
/ 16 ноября 2012

w / o explain analyze довольно трудно сказать, почему, но несколько моментов:

  • GP использует очень высокий random_page_cost и seq_page_cost равен 1. Значение по умолчанию для random_page_cost равно 100, что полностью не поощряетоптимизатор для использования сканирования индекса
  • enable_seqscan = off не полностью отключает сканирование seq.Сканирование seq просто очень тяжело
    штрафуется
  • , если таблица мала (100 - 10 тыс. записей), возможно, будет быстрее читать ее последовательно и вообще игнорировать индекс
1 голос
/ 27 июля 2011

Возможно, оптимизатор запросов по какой-либо причине считает, что индекс лучше не использовать.Кроме того, вам может потребоваться сделать ANALYZE для таблицы, если статистические метаданные устарели.См. эту статью (или другим нравится ) для получения более подробной информации.

0 голосов
/ 31 мая 2013

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

Основная причина этой проблемы, вероятно, заключается в том, что alter table TABLE add partition... не автоматически создает индексы, которые вы определили для TABLE.Существует два решения:

  • create index INDEXNAME on PARTITIONTABLENAME(ROWLIST..) после добавления раздела.Поиск в системном представлении pg_partitions и получить PARTITIONTABLENAME!Это не то же самое, что PARTITIONNAME.
  • Задержка create index на вашем столе до точки, где вы добавили все необходимые вам разделы.Это связано с тем, что создание индекса для таблицы автоматически создает индексы для всех существующих разделов.

Кстати, удаление индекса в таблице не приводит к удалению индексов в разделах.

Извините, я не могу дать вам никаких ссылок на Руководство администратора GP, так как я либо слеп, либо неправ, или Руководство администратора полностью игнорирует этот вопрос.

0 голосов
/ 04 ноября 2011

В отличие от традиционных СУБД, индекс не может быть предпочтительным способом доступа к данным в Greenplum.

Greenplum настроен "из коробки", чтобы предпочесть сканирование таблиц, а не сканирование по индексу, и вы должны сделать много настроек для его изменения.Вы можете установить дополнительные параметры, чтобы оптимизатор GP мог выбирать индексы, включая set enable_nestloop on, cpu_index_tuple_cost и другие.Обратитесь к Приложению D Руководства администратора GP для полного набора настраиваемых параметров.

Кроме того, как вы распределяете данные?Это может повлиять на выбор оптимизатора для обработки вашего запроса.

...