172 похожих чатов

Всем привет! Подскажите, как получить количество записей в таблице, не

забивая память селектом?

37 ответов

12 просмотров

Свою память?

Ilya Anfimov
Свою память?

И свою тоже ) Но вообще про оперативку...

Алексей Крапивницкий
И свою тоже ) Но вообще про оперативку...

Ты считаешь, что когда субд делает count, она все записи в оперативку считывает?

Dmitriy Sviridov
Ты считаешь, что когда субд делает count, она все ...

Втупил тут, сорян )) Тогда сопутствующий вопрос - если несколько сотен миллионов записей в таблице - насколько быстрым будет select count и есть ли что то более быстрое?

Алексей Крапивницкий
Втупил тут, сорян )) Тогда сопутствующий вопрос - ...

Если ты решил считать total для пагинатора, то так не надо

central hardware
Just Google it

В некоторых случаях лучше промолчать.

Alexey Bulgakov
а зачем? какая цель?

У меня есть длительный фоновый процесс расчета и записи этих сотен миллионов, хотелось бы получать количество уже записанных на текущий момент.

Примерное значение есть кажется в pg_stat_all_tables. Может быть в другой системной вьюхе, но не суть. Ну и это действительно «примерное» число с кучей оговорок.

Alexey Bulgakov
вот в нем и считайте

Есть и такой вариант. Но пока рассматриваю оба, смотрю как удобнее будет.

Алексей Крапивницкий
Есть и такой вариант. Но пока рассматриваю оба, см...

другого точного варианта нет. считать запросом - это боль причем бессмысленная

Алексей Крапивницкий
Есть и такой вариант. Но пока рассматриваю оба, см...

Если вы пишете данные в приложении, то ведь приложение знает, сколько оно данных в БД передало

Dmitriy Sviridov
Если вы пишете данные в приложении, то ведь прилож...

Да там с передачей этих данных немного геммор. Но раз вариант с count однозначно хуже - значит лучше этот геммор в аппе решить.

Dmitriy Sviridov
Ты считаешь, что когда субд делает count, она все ...

Считывает-считывает. Другой вопрос, что в памяти постгреса они не задержываются -- но вполне остаются занимать место в кэшэ ОС.

Алексей Крапивницкий
Втупил тут, сорян )) Тогда сопутствующий вопрос - ...

Есть разные методы оцэнки количества записей. Есть pg_stat_all_tables и pg_class -- из спецыально собираемой статистики, либо из autovacuum. Это, понятно, только для всей таблицы (и подвержэно некоторым систематическим ошыбкам). Есть возможность использовать TABLESAMPLE -- чтобы пройтись только по части таблицы. Наконец, можно настроить точный подсчёт -- триггером на insert/update/delete. Есть дажэ расшырение, которое что-то такое предлагает https://github.com/sraoss/pgsql-ivm

Алексей Крапивницкий
Да там с передачей этих данных немного геммор. Но ...

Вам надо прогресс операции мониторить? Тогда вот вам вариант околобесплатной передачи данной инфы: периодически (раз в N записей, подбирая N таким образом, чтобы эти записи генерились за 10+ секунд) выполняйте в сессии, в которой вставляете записи запрос set application_name = your_app_name: <NNN>'; где <NNN> - число обработанных записей. Затем просто в pg_stat_activity находите нужную сессию и считываете <NNN>.

Radist
Вам надо прогресс операции мониторить? Тогда вот в...

Мы просто в базу пишем сколько записей обработано, каждые 10%

Radist
Вам надо прогресс операции мониторить? Тогда вот в...

Да, такой вариант тоже смотрю, правда в отдельную таблу

central hardware
Мы просто в базу пишем сколько записей обработано,...

Это хорошо работает только если не в одной транзакцыи всё пишэтся.

Ilya Anfimov
Это хорошо работает только если не в одной транзак...

Ну обновлять сотни тысяч строк в одной транзакции это такое себе, человек отчёт час ждал а в итоге ошибка, не хорошо

central hardware
Ну обновлять сотни тысяч строк в одной транзакции ...

Хмм, а если по бизнесу транзакция такая? Т.е. (рил стори) обновляем порядка 1 млн строк, загружая новые цены. Нужно, чтобы они вступили в действие все сразу. Загрузка «в лоб» в один поток занимает около 2ч. Городить дополнительный столбец «версия» в этой таблице (и, извините, ключ «текущая версия» в redis) который и переключать после завершения?

central hardware
Цены должны иметь историчность

А они и имеют, кстати, исторически (sic!) реализовано, что хранится одна текущая в основной таблице + пачка старых в отдельной специальной таблице (собственно, эти таблицы за годы работы и составляют основной объём БД).

Павел Сутырин
Хмм, а если по бизнесу транзакция такая? Т.е. (рил...

Примерно в таком случае делал отдельную табличку с версией и активностью, и прост вставлял строки. В конце уже активировал.

Павел Сутырин
А они и имеют, кстати, исторически (sic!) реализов...

ну так грузите цены частями, если дата начала действия цены есть

Павел Сутырин
Хмм, а если по бизнесу транзакция такая? Т.е. (рил...

Я позволю здесь себе тупой вопрос — а если никаких больше апдейтов, кроме таких заливок, в этой таблице не бывает, то сильно ли навредит (читателям) наша пишущая транзакция хотя бы и на 2ч? Дело даже еще вот чем облегчается — там и читателей-то особо нет, в этой таблице, кроме пакетной выгружалки цен раз в 15 минут в отдельную структуру (не спрашивайте), из которой их и читают потом все остальные потребители.

Alexey Bulgakov
ну так грузите цены частями, если дата начала дейс...

Ну кстати, в половине случаев просят залить «сегодня, чтобы вступило завтра», т.е. дата начала смысл имеет. И ставить её в некотором будущем. А если приспичило — пакетом перекинуть чуть раньше.

Павел Сутырин
Я позволю здесь себе тупой вопрос — а если никаких...

Если весь кластер только читают, помимо этих двух таблиц, то не навредит. В противном случае будет мешать работе autovacuum.

Павел Сутырин
Хмм, а если по бизнесу транзакция такая? Т.е. (рил...

В постгресе норм более-менее. Только невакуумированные записи (во всех таблицах) и блокировки (на запись, только в обновлённых таблицах) накапливаются, пока идёт транзакцыя. Чаще всего на миллион записей это не так страшно. И на полчаса задержка -- тожэ. Иногда бывает, что за минуты (десятки минут) какая-нибудь маленькая, но нагружэнная таблица в разы распухает и скорость меняется в худшую сторону.

Павел Сутырин
Хмм, а если по бизнесу транзакция такая? Т.е. (рил...

И да, версии для цэн -- полезны, конечно. Как таковые, без учёта дажэ проблем СУБД.

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

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта