Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Производительность запроса count / 9 сообщений из 9, страница 1 из 1
13.09.2005, 17:02
    #33267025
kka
kka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса count
Имеем таблицу в которой храниться около 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
13.09.2005, 20:17
    #33267437
Производительность запроса count
пройдись поиском по "Count" и "индекс". Обсуждалось. ПРоблема в специфике индексов постгреса ( кажеца - в специфике индексов для версий - строится индекс для всех записей, а актуальность ("не удаленность") проверяется только в самой записи.
...
Рейтинг: 0 / 0
14.09.2005, 09:16
    #33267829
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса count
А как еще можно посчитать количество записей в таблице, нежели чем полным перебором?
И как к этому делу индекс привесить?

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

Я бы сказал - вообще в специфике индексов в любой БД. Индекс - это некая штука, которая позволяет тебе быстро найти ОДНУ конкретную строку. А число строк с индексом не связано.
...
Рейтинг: 0 / 0
14.09.2005, 09:36
    #33267877
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса count
Кувалдин РоманА как еще можно посчитать количество записей в таблице, нежели чем полным перебором?Триггерами (при изменении кол-ва строк в таблице) поддерживать [системную] таблицу (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
14.09.2005, 10:45
    #33268085
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса count
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
14.09.2005, 11:19
    #33268238
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса count
Еще можно попробывать делать ANALYZE перед запросом.
Может поможет :)
Опять же где-то проскакивала ссылка на статью по типу "Настройка производительности Postgres" и там этот вопрос поднимался. На сколько я помню - что приблизительное количество строк можно получить из таблиц статистики. Сразу после ANALYZE это значение будет почти всегда точным.
Почти - это если в промежутке кто-то успеет вставить лимон-другой записей :)
...
Рейтинг: 0 / 0
14.09.2005, 11:31
    #33268298
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность запроса 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 ...;Зависит от задачи. Если что-то ОЛАПовидное, то буду.

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

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

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


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