powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Производительность запроса count
9 сообщений из 9, страница 1 из 1
Производительность запроса count
    #33267025
kka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем таблицу в которой храниться около 3.5 милионов записей.
В таблице есть один первичный ключ и кластерный btree индекс по нему (поле doc_id).
Почему запрос select count(*) from docs1 и select count(doc_id) from docs1 выполняються порядка 5 минут?
План запроса

tests=# explain select count(doc_id) from docs1;
QUERY PLAN
----------------------------------------------------------------------
Aggregate (cost=138072.83..138072.83 rows=1 width=4)
-> Seq Scan on docs1 (cost=0.00..128869.06 rows=3681506 width=4)
(2 rows)
То есть делаться полные перебор, почему?

Чего я делаю не так?



PostgreSQL 8.0.3 for Windows на Win2k3 SE, на машине 2*1gHz Xeon'а и 1Гб ОЗУ, винт ATA66 7200rpm.
...
Рейтинг: 0 / 0
Производительность запроса count
    #33267437
пройдись поиском по "Count" и "индекс". Обсуждалось. ПРоблема в специфике индексов постгреса ( кажеца - в специфике индексов для версий - строится индекс для всех записей, а актуальность ("не удаленность") проверяется только в самой записи.
...
Рейтинг: 0 / 0
Производительность запроса count
    #33267829
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как еще можно посчитать количество записей в таблице, нежели чем полным перебором?
И как к этому делу индекс привесить?

В постгресе ни одна агрегатная функция не использует индексов.
...
Рейтинг: 0 / 0
Производительность запроса count
    #33267842
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поиск рулитпройдись поиском по "Count" и "индекс". Обсуждалось. ПРоблема в специфике индексов постгреса ( кажеца - в специфике индексов для версий - строится индекс для всех записей, а актуальность ("не удаленность") проверяется только в самой записи.

Я бы сказал - вообще в специфике индексов в любой БД. Индекс - это некая штука, которая позволяет тебе быстро найти ОДНУ конкретную строку. А число строк с индексом не связано.
...
Рейтинг: 0 / 0
Производительность запроса count
    #33267877
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин РоманА как еще можно посчитать количество записей в таблице, нежели чем полным перебором?Триггерами (при изменении кол-ва строк в таблице) поддерживать [системную] таблицу (table_id,rows_count).

Кувалдин РоманВ постгресе ни одна агрегатная функция не использует индексов.В 8.1 min и max будут использовать индексы, ура! :)

http://developer.postgresql.org/docs/postgres/release.html#RELEASE-8-1

Automatically use indexes for MIN() and MAX() (Tom)

In previous releases, the only way to use an index for MIN() or MAX() was to rewrite the query as SELECT col FROM tab ORDER BY col LIMIT 1. Index usage now happens automatically.
...
Рейтинг: 0 / 0
Производительность запроса count
    #33268085
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat Кувалдин РоманА как еще можно посчитать количество записей в таблице, нежели чем полным перебором?Триггерами (при изменении кол-ва строк в таблице) поддерживать [системную] таблицу (table_id,rows_count).


Триггеры - в данном случае дополнительный механизм. Хочешь - делай сам системную таблицу, и реализуй его. В БД такую фичу засовывать нет надобности.
Тем более что count по какому-либо условию, которое отсеивает некоторые строки из таблицы, сделает твое значение ненужным. Будешь хранить все возможные count-ы?

select count(id) from table1 where id>100;
select count(id) from table1 where id<100;
select count(id) from table1 where id>200;
select count(id) from table1 where id>50;
select count(...) from table1 where ...;

Кувалдин РоманВ постгресе ни одна агрегатная функция не использует индексов.В 8.1 min и max будут использовать индексы, ура! :)

http://developer.postgresql.org/docs/postgres/release.html#RELEASE-8-1

Automatically use indexes for MIN() and MAX() (Tom)

In previous releases, the only way to use an index for MIN() or MAX() was to rewrite the query as SELECT col FROM tab ORDER BY col LIMIT 1. Index usage now happens automatically.[/quot]

Это называется "kernel hack". Кстати, min и max я всю жизнь так и делал. И не только в постгресе.
...
Рейтинг: 0 / 0
Производительность запроса count
    #33268238
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можно попробывать делать ANALYZE перед запросом.
Может поможет :)
Опять же где-то проскакивала ссылка на статью по типу "Настройка производительности Postgres" и там этот вопрос поднимался. На сколько я помню - что приблизительное количество строк можно получить из таблиц статистики. Сразу после ANALYZE это значение будет почти всегда точным.
Почти - это если в промежутке кто-то успеет вставить лимон-другой записей :)
...
Рейтинг: 0 / 0
Производительность запроса count
    #33268298
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин РоманТем более что count по какому-либо условию, которое отсеивает некоторые строки из таблицы, сделает твое значение ненужным. Будешь хранить все возможные count-ы?

select count(id) from table1 where id>100;
select count(id) from table1 where id<100;
select count(id) from table1 where id>200;
select count(id) from table1 where id>50;
select count(...) from table1 where ...;Зависит от задачи. Если что-то ОЛАПовидное, то буду.

Кувалдин РоманКстати, min и max я всю жизнь так и делал. И не только в постгресе.Теперь появится для нас замечательный повод поглупеть, и писать просто select min(...). :)
...
Рейтинг: 0 / 0
Производительность запроса count
    #33273229
опять я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин Роман поиск рулитпройдись поиском по "Count" и "индекс". Обсуждалось. ПРоблема в специфике индексов постгреса ( кажеца - в специфике индексов для версий - строится индекс для всех записей, а актуальность ("не удаленность") проверяется только в самой записи.

Я бы сказал - вообще в специфике индексов в любой БД.
не уверен. если бы, к примеру, индекс [каким-то раком] включал в себя только акутальные записи, то достаточно было бы прочитать только индекс, но не таблицу, что видимо было бы таки быстрее (просто по объему данных). Не помню точно, но кааца натыкался (в "сравнении") на упоминание об именно таком (т.е. позволяющем выяснить актуальность записи не тыкаясь в саму таблицу) устройстве индексов для какого-то из версионников.

Что касается каунта по условию - дык задействуй условие заведомо юзающее индекс, и будет тибе щасье.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Производительность запроса count
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]