Ознакомьтесь с документацией PostgreSQL о Использование EXPLAIN и Планирование запросов .Причина, по которой планировщик запросов предпочитает последовательное сканирование по сравнению с индексным сканированием в случае LIMIT 100
, заключается просто в том, что последовательное сканирование дешевле.
В запросе нет условия ORDER BY
, поэтому планировщикнормально с первыми 100 (случайными) строками, которые соответствуют условию фильтра.Сканирование индекса потребовало бы сначала прочитать страницы индекса, а затем прочитать страницы данных, чтобы получить соответствующие строки.При последовательном сканировании нужно только прочитать страницы данных, чтобы извлечь строки.В вашем случае статистика таблицы предполагает, что имеется достаточно (случайных) строк, соответствующих условию фильтра.Стоимость последовательного чтения страницы, чтобы получить 100 строк, считается дешевле, чем стоимость чтения индекса сначала, а затем извлечения фактических строк.Вы можете увидеть другой план при увеличении лимита или когда меньшее количество строк соответствует условию фильтра.
При настройках по умолчанию планировщик учитывает стоимость случайного чтения страницы ( random_page_cost ) четыреумножить стоимость последовательного чтения страницы ( seq_page_cost ).Эти параметры могут быть скорректированы для настройки планов запросов (например, когда вся база данных находится в ОЗУ, случайное чтение страницы не обходится дороже, чем последовательное чтение страницы, и предпочтительнее сканирование индекса).Вы также можете опробовать различные планы запросов, включив / отключив определенные виды сканирования, например:
set enable_seqscan = [on | off]
set enable_indexscan = [on | off]
Хотя возможно включить / отключить определенные виды сканирования в глобальном масштабе, это следует использовать только для объявлений.HOC для отладки или устранения неполадок для каждого сеанса.
Также запустите VACUUM ANALYZE words
перед тестированием планов запросов, в противном случае автоматический вакуум ( autovaccum ), запущенный между тестами, может повлиять на результаты.