PostgreSQL: COUNT (*) использует последовательное сканирование, а не индекс

Почему PostgreSQL последовательно сканирует таблицу для запроса COUNT(*), хотя есть очень маленький и проиндексированный первичный ключ?

10 голосов | спросил Adam Matan 5 PMpTue, 05 Apr 2011 12:17:33 +040017Tuesday 2011, 12:17:33

1 ответ


14

официальные страницы wiki дают ответ на этот вопрос:

  

[...] Причина, по которой это происходит медленно, связана   к реализации MVCC в   PostgreSQL. Тот факт, что несколько   транзакции могут видеть разные состояния   данных означает, что не может быть   простой способ для «COUNT (*)»   суммировать данные по всей таблице;   PostgreSQL должен пройти через все строки,   в каком-то смысле. Это обычно приводит к   в режиме последовательного сканирования   информация о каждой строке в   Таблица. [...]

Кроме того, вы можете попробовать ANALYZE , чтобы перестроить информацию для планировщика запросов ,

Вы должны получить более высокую производительность, используя COUNT(an uniquly indexed field), но если это очень большое, seq-сканирование - единственный способ сделать это.

Если вам нужны очень быстрые цифры и вы не боитесь запросить схему, вы можете сделать следующее

SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass

Но не полагайтесь на эти значения, поскольку это всего лишь «оценочное» (хотя часто и точное) количество кортежей в таблице.

ответил DrColossos 5 PMpTue, 05 Apr 2011 12:48:25 +040048Tuesday 2011, 12:48:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132