gpt4 book ai didi

sql - 执行此查询时,是否所有记录都加载到物理内存中?

转载 作者:行者123 更新时间:2023-11-29 12:22:24 25 4
gpt4 key购买 nike

我有一个表,其中有数百万条记录。该表的总大小仅为 6-7 GB。该表是我的应用程序日志表。这张 table 增长得非常快,这是有道理的。现在我想将记录从日志表移动到备份表中。这是场景,这是我的问题。

Table Log_A
Insert into Log_b select * from Log_A;
Delete from Log_A;

我正在使用 postgres 数据库。问题是

执行此查询时,Log_A 中的所有记录是否都加载到物理内存中?注意:我的上述两个查询都在存储过程中运行。如果否,那么它将如何运作?

我希望这个问题适用于所有数据库。

我希望有人能给我一些想法。

最佳答案

在 PostgreSQL 中,这可能会执行顺序扫描,将一些记录加载到 shared_buffers 中,插入它们,写出脏缓冲区,然后继续。

所有的记录都将通过主存,但它们不必一次都在内存中。因为它们都是使用正常的缓冲读取(pread)从磁盘读取的,所以它影响操作系统磁盘缓存,可能将其他数据推出缓存。

其他数据库可能有所不同。有些人可以在处理 INSERT 之前执行整个 SELECT(尽管如果有认真的人这样做我会感到惊讶)。有些确实使用O_DIRECT 读取或原始磁盘I/O 来避免操作系统缓存影响,因此缓冲区缓存效果可能不同。不过,如果有任何数据库依赖于将整个 SELECT 加载到内存中,我会感到惊讶。

当您想查看 PostgreSQL 正在做什么以及如何做时,EXPLAINEXPLAIN (BUFFERS, ANALYZE) 命令非常有用。参见 the manual .

您可能会发现 writable common table expressions为此目的很有趣;它使您可以在一条语句中完成所有这些工作。在这个简单的案例中,可能没有什么好处,但在更复杂的数据迁移中可能是一个巨大的胜利。

顺便说一句,确保运行包含在 BEGINCOMMIT 中的那对查询。

关于sql - 执行此查询时,是否所有记录都加载到物理内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12939735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com