Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Можно ли посчитать к-во записей быстро, пусть не точное, приблизительное, скажем если там 11 234 567, а я получу 11 100 000, то это меня устроит, важно масштаб и скорость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 12:30 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
SELECT reltuples FROM pg_class WHERE relname = 'tablename'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 12:34 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
untitledSELECT reltuples FROM pg_class WHERE relname = 'tablename'; шайтан! :-) в чем "приблизительность" количества? у меня совпало сейчас, но юзеров нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 12:38 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
это значение, которое было вычислено после analyze ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 12:40 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
untitledэто значение, которое было вычислено после analyze т.е. это будет не приблизительное значение, оно может отличаться на порядки, в зависимости от того как давно выполнялся analyze. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 12:44 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
теоретически да. но при включенном автовакууме это значение всегда будет более-менее правильным. даже если автовакуума нет, то хорошим решением будет раз в сутки делать vacuum analyze, что, в том числе, обновит эту таблицу с количеством записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 12:50 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
если нужно именно то, что написано - т.е. каунты _без условий_ - то кажется LeXa NalBat (мои извинения, ежли путаю) неоднократно рекомендовал вести свои таблички на триггерах. Все упирается в соотношение цена(решения)/частота пользования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 12:56 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
assaесли нужно именно то, что написано - т.е. каунты _без условий_ - то кажется LeXa NalBat (мои извинения, ежли путаю) неоднократно рекомендовал вести свои таблички на триггерах. Все упирается в соотношение цена(решения)/частота пользования. да, понимаю, но для таблицы с 10 млн записей триггеры дороговаты будут... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 13:14 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
между прочим один умный человек мне советовал делать не count(*), а count(primary_key) :) обосновывал он свою позицию использованием индексированного поля и скоростью работы с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 13:37 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Rastafarraмежду прочим один умный человек мне советовал делать не count(*), а count(primary_key) :) обосновывал он свою позицию использованием индексированного поля и скоростью работы с ним. Сделайте explain и убедитесь, что разницы никакой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 14:03 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Nick Gazaloff Rastafarraмежду прочим один умный человек мне советовал делать не count(*), а count(primary_key) :) обосновывал он свою позицию использованием индексированного поля и скоростью работы с ним.Сделайте explain и убедитесь, что разницы никакой.Да, даже скорее всего выполнение через IndexScan будет медленнее, чем SeqScan, потому что при IndexScan постгрес все равно будет залезать в таблицу. Но кажется тут проводили тесты, что count(1) немного быстрее из-за меньшей ширины выбираемых полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 14:41 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Winnipuhда, понимаю, но для таблицы с 10 млн записей триггеры дороговаты будут...не понял. если вы в триггере напишете "селект каунт()"- то да. а если триггера - "дифференциальные" - то цена зависит не от колич-ва записей, а от частоты вставки/удаления. Нет? Т.е. надо сравнить возрастание нагрузки при вставке/удалении с частотой выполнения "селект-каунтов". Вот на табличку с ежедневной массовой заливкой и очисткой я бы поостерегся, что да, то да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 16:15 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
count любого поля будет все равно SeqScan из-за такой реализации в ПГ агрегатных ф-й. Winnipuh Если в таблице есть уникальный числовой ключ типа генерируемы по sequence, то max(key) даст точное количество записей и будет пользовать индекс по этому полю. Если нет, то только через tuples ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 16:57 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
alex_v13count любого поля будет все равно SeqScan из-за такой реализации в ПГ агрегатных ф-й. Winnipuh Если в таблице есть уникальный числовой ключ типа генерируемы по sequence, то max(key) даст точное количество записей и будет пользовать индекс по этому полю. Если нет, то только через tuples вопрос: если в таблице 1000 записей, max(key) = 1000 потом удалили 900, max(key) = 1000 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 17:12 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Winnipuh alex_v13count любого поля будет все равно SeqScan из-за такой реализации в ПГ агрегатных ф-й. Winnipuh Если в таблице есть уникальный числовой ключ типа генерируемы по sequence, то max(key) даст точное количество записей и будет пользовать индекс по этому полю. Если нет, то только через tuples вопрос: если в таблице 1000 записей, max(key) = 1000 потом удалили 900, max(key) = 1000 ?гм. вот можно например вести таблицу вообще без удалений (и апдейтов) (т.е. полный аудит внутри самой себя - все лежит внутри. есть 2 поля- "ключа" - 1 - "эффективный", и 2-й - собственно счетчик всего), тогда предложенное alex_v13 вполне сработает. но как же аккуратно надо все расписывать (через обновляемые вью - наипростейшее решение). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 17:23 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
можно создать два сиквенса - количество внесенных и удаленных, и брать разницу между ними, но лучше сделать отдельную таблицу для статистики и изменять при помощи триггеров в ней значения. этот подход хорош тем, что можно одновременно вести подсчет по различным заранее известным критериям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 17:23 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
alex_v13count любого поля будет все равно SeqScan из-за такой реализации в ПГ агрегатных ф-й. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 17:26 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
untitledможно создать два сиквенса - количество внесенных и удаленных, и брать разницу между ними, но лучше сделать отдельную таблицу для статистики и изменять при помощи триггеров в ней значения. этот подход хорош тем, что можно одновременно вести подсчет по различным заранее известным критериям . надо подумать, что будет в случае одновременно активно работающих 100 юзерах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 17:30 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Winnipuh надо подумать, что будет в случае одновременно активно работающих 100 юзерах ну понятно что сначала нужно выяснить необходимость этого. если требуется выводить что-то вроде "на нашем сайте больше 5000 зарегистрированных пользователей" то вполне достаточно брать результаты analyze и не заморачиваться ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 17:54 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat Это такой план на 8.2.4 ? У меня на 8.1.3 таблички по 50 млн записей со всеми ииндексами, но такой план ни-ни. Winnipuh При активной работе пользователей приводящей с частым обновлениям данных в таблицах уменьшение интервала автовакума сильно улучшает общую картину с производительность, а также reltuples становится сильно ближе действительному числу записей. Тот метод который я предожил содержит ряд условностей (выше о них написали) и нужен только если нужно именно точное значение числа записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 18:49 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
alex_v13Это такой план на 8.2.4 ? У меня на 8.1.3 таблички по 50 млн записей со всеми ииндексами, но такой план ни-ни.8.1.9 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2007, 09:27 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
alex_v13 LeXa NalBat Это такой план на 8.2.4 ? У меня на 8.1.3 таблички по 50 млн записей со всеми ииндексами, но такой план ни-ни. 1. У LeXa явно стоит enable_seqscan=false. 2. В данном случае подобный план ничего не улучшает. рекомендую сравнить время выполнения запроса с WHERE (выставив условие, в которое заведомо попадает вся таблица) и без него. Без WHERE будет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2007, 13:19 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Nick Gazaloff1. У LeXa явно стоит enable_seqscan=false.нет Nick Gazaloff2. В данном случае подобный план ничего не улучшает.улучшает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Nick Gazaloffрекомендую сравнить время выполнения запроса с WHERE (выставив условие, в которое заведомо попадает вся таблица) и без него. Без WHERE будет быстрее.зачем нужно условие where, в которое попадает вся таблица? конечно в этом случае без where будет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2007, 13:36 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
А зачем нужно считать строки с 100-й по 200-ю? И не надо говорить, что count здесь использует индекс. Индекс использует WHERE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2007, 18:55 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Nick GazaloffА зачем нужно считать строки с 100-й по 200-ю?Чтобы узнать кол-во строк в таблице, удовлетворяющих некоторому условию. Например, кол-во моделей сотовых телефонов в товарном каталоге: "where category_id='mobile'". Nick GazaloffИ не надо говорить, что count здесь использует индекс. Индекс использует WHERE.Я бы не сказал, что "count использует индекс" и "индекс использует WHERE" - понятные и математически точные формулировки. Я привел пример опровеграющий утверждение alex_v13 "count любого поля будет все равно SeqScan из-за такой реализации в ПГ агрегатных ф-й". На словах это опровержение сформулировал бы так: для вычисления count постгрес может использовать план отличный от SeqScan, причем это даст выигрыш в скорости выполнения запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 10:35 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat По видимому, разработчики ПГ наконец услышали глас юзеров своей базульки и таки научили планировщик таким элементарным финтам, как использование существующего primary key для count. Я только пока не могу перебраться на версию старше 8.1.3 - импорт/экспорт базы в ~100 ГБ с последующим vacuum analyze это дофига времени... Бизнес не ждет. До нового года откладываю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 11:36 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
alex_v13 LeXa NalBat По видимому, разработчики ПГ наконец услышали глас юзеров своей базульки и таки научили планировщик таким элементарным финтам, как использование существующего primary key для count. Попробую сформулировать максимально математично. Для отработки count() PG должен просмотреть ВСЕ записи попадающие под условие count(). Если эти записи целесообразно получать из индекса (например условие в WHERE), то он может исопльзоться, если нет (SELECT count(*) FROM my_big_table_gigi) - то будет SEQSCAN. В любом случае, будет проверена КАЖДАЯ строчка. И сама аггрегатная функция count() не может использовать индекс. Он может быть использован только для получения строк. Аггрегатные функция max/min - могут использовать индекс. Напомню, в индексе PG нет условий видимости записи для текущей транзакции, как следствие - индекс не может использоваться для определения точного количества строк. Что не мешает использовать его для других, не связанных с подсчетом строк задач в рамках этого же запроса. ЗЫ Вроде похоже на правду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 15:44 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Теория-то понятна и очевидна: я же написал "использование существующего primary key для count", а не "count по индексу" :) Так что все справедливо. Но вот 8.1.3 для count по таблицам любого размера выдает у меня SeqScan, в то время как 8.2.4 таки выдает IndexScan. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 16:17 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
alex_v13Теория-то понятна и очевидна: я же написал "использование существующего primary key для count", а не "count по индексу" :) Так что все справедливо. Но вот 8.1.3 для count по таблицам любого размера выдает у меня SeqScan, в то время как 8.2.4 таки выдает IndexScan. Ничего не понял :( стихи? провел тест уважаемого LeXa NalBat : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ну и в чем разницо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:03 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Возможно дело в специфике моей базы - маленькие таблицы с большим количеством UPDATE и очень большие с массовыми INSERT - т.е. или много версий записей или много данных не влезающих в память - понятно, что планировщик выбирает SeqScan. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:24 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Andrey Daeronну и в чем разницо?OFFTOPIC cost=4.85..4.86 cost=10.50..10.51 8.2.4 в два раза медленнее :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:26 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
А 8.2.4 я проверял на свеже-восстановленной из дампа базе, после VACUUM FULL ANALYZE в которой лишних версий записей и пустых страниц нема - отсюда разница. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:28 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
alex_v13или много данных не влезающих в памятьПамять тут ни при чем. Ни для SecScan, ни для IndexScan она не нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:37 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat Andrey Daeronну и в чем разницо?OFFTOPIC cost=4.85..4.86 cost=10.50..10.51 8.2.4 в два раза медленнее :-) вот-вот!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:47 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat alex_v13или много данных не влезающих в памятьПамять тут ни при чем. Ни для SecScan, ни для IndexScan она не нужна. Тогда в shared_buffers оставим как есть по умолчанию, не помню сколько - 1000? Выбор плана завист не только от предполагаемой ПГ ситуации с данным в таблице, но и от доступных ресурсов, чему я был свидетелем неоднократно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 17:54 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
alex_v13Тогда в shared_buffers оставим как есть по умолчанию, не помню сколько - 1000?Возможно, для некоторой, при этом большой и серьезной, задачи большой shared_buffers не нужен. alex_v13Выбор плана завист не только от предполагаемой ПГ ситуации с данным в таблице, но и от доступных ресурсов, чему я был свидетелем неоднократно.Насколько я понял из доки, выбор плана зависит исключительно от статистики по таблицам и параметров описанных в главе 17.6. доки. На тест, иллюстрирующий вляние параметра shared_buffers (или других) на план запроса, хотелось бы взглянуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 18:10 |
|
||
|
select count(*) from t - как быстрее получить прибл.к-во
|
|||
|---|---|---|---|
|
#18+
Например, вот цитата из доки: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. авторa higher value makes it more likely index scans will be used, a lower value makes it more likely sequential scans will be used. Это я так понимаю ключевое место всей фразы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 18:20 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=2005087]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
87ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
4ms |
| others: | 245ms |
| total: | 431ms |

| 0 / 0 |
