Создание таблицы в памяти в PostgreSQL? - PullRequest
1 голос
/ 08 марта 2020

Мое понимание таблицы в памяти - это таблица, которая будет создана в памяти и будет использовать диск как можно меньше, если вообще будет. Я предполагаю, что у меня достаточно оперативной памяти, чтобы вместить таблицу или, по крайней мере, большую ее часть. Я не хочу использовать явную функцию для загрузки таблиц (например, pg_prewarm) в память, я просто хочу, чтобы таблица была там по умолчанию, как только я выдаю CREATE TABLE или CREATE TABLE AS select statement, если память не заполнена или если я указать иначе. Меня не особо волнует запись на диск.

7 лет go, аналогичный вопрос был задан здесь PostgreSQL эквивалент MySQL таблиц памяти? . Он получил 2 ответа, и один из них немного запоздал (4 года спустя).

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

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

Мне просто интересно, как теперь получить таблицы в памяти в Postgres 12, 7 лет спустя.

1 Ответ

1 голос
/ 08 марта 2020

Postgres не имеет таблиц в памяти, и у меня нет никакой информации о серьезной работе над этим topi c. Если вам нужна эта функция, вы можете использовать специальные базы данных в памяти, такие как REDIS, MEMCACHED или MonetDB. Есть драйверы FDW для этих баз данных. Таким образом, вы можете создавать таблицы в памяти в специализированной базе данных и работать с этими таблицами из Postgres через сторонние таблицы.

MySQL таблицы памяти были необходимы, когда был только механизм MyISAM, потому что этот механизм имеет очень примитивная работа с IO и MySQL не имела собственных буферов. Теперь MySQL имеет движок InnoDB (с современной формой соединений, как и другие базы данных), и множество аргументов для использования таблиц MySQL в памяти устарели. По сравнению со старым MySQL Postgres имеет собственные буферы и не обходит кеши файловой системы, поэтому вся память доступна для ваших данных, и вам ничего не нужно делать. Десять лет go мы должны были использовать MySQL движок памяти, чтобы иметь достаточно хорошую производительность. Но после перехода на Postgres у нас была лучшая производительность без необходимой работы с таблицами памяти.

Если у вас много памяти, то Postgres может использовать ее по умолчанию - через кеш файловой системы.

...