Отказ от ответственности
Я очень мало использовал PostgreSQL.Я отвечаю, основываясь на своих знаниях об использовании индексов SQL Server и планах выполнения.Я прошу у богов PostgreSQL пощады, если я что-то не так.
Оптимизаторы запросов являются динамическими
Вы сказали, что ваш план запросов изменился с вашей разработки на производственную среду.Этого следовало ожидать.Оптимизаторы запросов предназначены для генерации оптимального плана выполнения на основе текущих условий данных.При других условиях оптимизатор может решить, что более эффективно использовать сканирование таблицы по сравнению со сканированием индекса.
Когда было бы более эффективно использовать сканирование таблицы по сравнению со сканированием индекса?
SELECT A, B
FROM someTable
WHERE A = 'SOME VALUE'
Допустим, у вас есть некластеризованный индекс для столбца A
.В этом случае вы фильтруете по столбцу A
, который потенциально может использовать индекс.Это было бы эффективно, если индекс достаточно избирателен - в основном, сколько различных значений составляют индекс?База данных хранит статистику по этой информации о селективности и использует эту статистику при расчете затрат для планов выполнения.
Если в таблице миллион строк, но только 10 возможных значений для A
, то ваш запрос скорее всеговернуть около 100К строк.Поскольку индекс не является кластеризованным, и вы возвращаете столбцы, не включенные в индекс, B
, необходимо выполнить поиск для каждой возвращаемой строки.Эти поиски являются поисками с произвольным доступом, которые намного дороже, чем последовательное чтение, используемое при сканировании таблицы.В определенный момент для базы данных становится более эффективным просто выполнять сканирование таблицы, а не сканирование индекса.
Это всего лишь один сценарий, есть много других.Трудно понять, не зная больше о том, на что похожи ваши данные, как выглядят ваши индексы и как вы пытаетесь получить к ним доступ.
Чтобы ответить на оригинальный вопрос :
Будет ли PostgreSQL воздерживаться от использования индексов, если они (или таблица) слишком велики?Нет. Более вероятно, что для доступа к данным PostgreSQL будет менее эффективно использовать индекс по сравнению с использованием сканирования таблицы.
Часто задаваемые вопросы PostgreSQL затрагивают эту тему (см .: Почему мои запросы медленные? Почему они не используют мои индексы? ): https://wiki.postgresql.org/wiki/FAQ#Why_are_my_queries_slow.3F_Why_don.27t_they_use_my_indexes.3F