Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34757704&tid=2005087]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 361ms |

| 0 / 0 |
