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

Друзья, подскажите плз. Есть таблица очень маленькая, записей в 20-30. Но по

ней происходит очень-очень много чтений.
И explain показывает, что происходит seq scan.
Можно ли закэшировать эту таблицу, чтобы данные в большинстве случаев брались из кэша?

26 ответов

22 просмотра

Она и так закэшырована. Ну, скорее всего. Данные из кэша (shared_buffers) вымываются по LRU -- если с прошлого чтения все shared_buffers не повыкидывались -- то останутся там.

если там записей 20-30, чего там кешировать то ? вот и постгрес видимо так же думает, что ему сканить все быстрее, чем читать индекс)

И да, "почему происходит seq scan" -- это другой вопрос (в данном случае -- вполне очевидный).

Так вот, seq scan -- потому, что b-tree index lookup это относительно сложная процэдура. Во много раз более сложная, чем тупо взять tuple из странички. Потому 30 туплов быстрее просто взять, чем пытаться их как-то искать по индэксу (там, кстати, тожэ одна страничка будет, из которой, скорее всего, придётся этих туплов вытащить штук 5 чтобы найти нужный).

whois- Автор вопроса
Сергей Кравчук
если там записей 20-30, чего там кешировать то ? в...

Да, похоже на то. Но меня смущает то, что иногда, когда очень много запросов, то происходит торможение. При чем время запроса может увеличиваться до 400 мс. А на графике я вижу "свечу". При чем, в статистике локов нет.... Я подумал, вдруг можно как-то в оперативку / shared ...что-то там положить

Ilya Anfimov
Она и так закэшырована. Ну, скорее всего. Данные и...

Насколько я помню, seq scan не через shared buffers проходит или не всегда через него. Для этого ограниченный ring buffer используется.

whois- Автор вопроса
Ilya Anfimov
Так вот, seq scan -- потому, что b-tree index look...

Это и так очевидно. Я говорю, что мне нужно еще быстрее!

Milkhael
Насколько я помню, seq scan не через shared buffer...

Вообще не помню никакого ring buffer в postgres. А seq scan происходит всегда через shared buffers, разумеется -- никаких других методов поднять страницу, лежащую на диске у postgres просто нет.

whois
Это и так очевидно. Я говорю, что мне нужно еще бы...

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

whois- Автор вопроса
whois
Да, похоже на то. Но меня смущает то, что иногда, ...

Но вообще да, с предсказуемостью скорости и realtime у постгреса не очень всё хорошо.

whois- Автор вопроса
Ilya Anfimov
Уж не в моменты checkpoint ли?

Кстати, в этом направлении я не смотрел...

Ilya Anfimov
Вообще не помню никакого ring buffer в postgres. А...

Вы не помните, а он есть) но используется для больших таблиц, что не случай автора.

whois- Автор вопроса
Ilya Anfimov
Уж не в моменты checkpoint ли?

А как проверить, что это checkpoint?

А на хосте, где PG стоит ничего другого не запущено?

whois- Автор вопроса
Milkhael
А на хосте, где PG стоит ничего другого не запущен...

Да, запущено. Параллельно несколько баз) Я тоже предположил, что они афектят. Но я не админ и не дба. Вот гадаю

whois
Да, запущено. Параллельно несколько баз) Я тоже пр...

Ну это плохо, конечно. PG использует страничный кэш операционной системы. Поэтому несколько баз могут афектить друг друга. Одна бд может загрязнять страничный кэш своими данными и вытеснять страницы другой бд, что приведет в дальнейшем к чтению с диска, а не из страничного кэша

Milkhael
Ну это плохо, конечно. PG использует страничный кэ...

А общих страниц у двух кластеров априори не должно быть

whois
А как проверить, что это checkpoint?

Есть параметр log_checkpoints.

Milkhael
Ну это плохо, конечно. PG использует страничный кэ...

Но на маленьку таблицу можно поставить грелочку, чтобы из shared_buffers её никогда не выкидывало!

> Но по ней происходит очень-очень много чтений. А откуда Вы получили вот эту информацию, конкретно?

whois- Автор вопроса
Ilya Anfimov
Но на маленьку таблицу можно поставить грелочку, ч...

тут уж зависит от многих факторов и "никогда" врядли можно гарантировать

Milkhael
тут уж зависит от многих факторов и "никогда" вряд...

К сожалению да. Надо, надо брать себя за шкирку и писать расшырение, которое memloчит указанные страницы!

Milkhael
тут уж зависит от многих факторов и "никогда" вряд...

Точнее, прибивает их в shared buffers в первую очередь. Мемлочить -- во вторую, там несложно ужэ.

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
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
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта