我对内存中表的理解是,它将在内存中创建,并且尽可能少地使用磁盘(如果使用磁盘的话)。我假设我有足够的RAM来容纳该表,或者至少容纳其中的大部分。我不想使用显式函数来装载表(如pg_prewarm),我只希望在发出CREATE TABLE
或CREATE TABLE AS select statement
命令后,表默认就在那里,除非内存已满或我另有指示。
7年前,一个类似的问题在这里被问到PostgreSQL equivalent of MySQL memory tables?,它已经收到了2个答案,其中一个有点晚(4年后)。
一个答案是创建一个RAM磁盘并为其添加表空间。或者使用一个UNLOGGED表。或者等待全局临时表。但是,我没有特殊的硬件,我只有普通的RAM -所以我不知道如何去做。我可以使用UNLOGGED特性,但据我所知,仍然涉及相当多的磁盘交互(这是我正在努力减少的)而且我不确定表是否会默认加载到内存中,而且,我看不出全局临时空间是如何关联的,我对它们的理解是,它们只是可以共享的空间中的表。
另一个答案是推荐一个内存中的列存储引擎。然后使用一个函数来加载内存中的所有内容。我使用这种方法的问题是,被引用的引擎看起来很旧,没有维护过,我找不到任何其他的引擎。而且,我希望我不必显式地求助于使用'load into memory'函数,而是默认情况下所有内容都会发生。
我只是想知道如何在7年后的Postgres 12中获得内存中的表。
2条答案
按热度按时间cx6n0qe31#
Postgres没有内存中的表,我现在也没有任何关于这个主题的任何重要工作的信息。如果你需要这个功能,你可以使用一个特殊的内存中的数据库,比如REDIS,MEMCACHED或MonetDB。这些数据库有FDW驱动程序。所以你可以在一个特殊的数据库中创建内存中的表,你可以通过外部表从Postgres使用这些表。
当只有MyISAM引擎时,MySQL内存表是必需的,因为这个引擎在IO方面的功能非常原始,而MySQL没有自己的缓冲区。(与其他数据库一样,使用现代形式的连接),并且使用MySQL内存表的许多参数都过时了。与旧的MySQL相比,Postgres有自己的缓冲区,并且不会绕过文件系统缓存,所以所有的内存都可以用来存储你的数据,你什么都不用做。十年前,我们不得不使用MySQL内存引擎来获得足够好的性能。但是在迁移到Postgres之后,我们在没有内存表的情况下获得了更好的性能。
如果你有很多内存,那么Postgres可以默认使用它--通过文件系统缓存。
7fyelxc52#
由于此问题特定于***Postgres***
没有内存中的表,只有内存中的视图
Materialize view
,它也可以刷新。