database - 为什么 PostgreSQL 会吃掉我所有宝贵的 HD 空间?

标签 database linux postgresql configuration rdbms

我刚刚尽可能多地传输了有关维基百科(英文)的链接结构数据。基本上,我从维基百科的 latest dump repository 下载了一堆 SQL 转储。 .因为我使用的是 PostgreSQL 而不是 MySQL,所以我决定使用 pipeline shell commands 将所有这些转储加载到我的数据库中。 .

无论如何,其中一个表有 2.95 亿行:pagelinks 表;它包含所有内部 wiki 超链接。在我的笔记本电脑上,使用 pgAdmin III,我将以下命令发送到我的数据库服务器(另一台计算机):

SELECT pl_namespace, COUNT(*) FROM pagelinks GROUP BY (pl_namespace);

现在已经有一个小时左右了。问题是邮政局长似乎越来越多地占用了我非常有限的高清空间。我认为它现在吃掉了大约 20 GB。我以前玩过 postgresql.conf 文件,以便为其提供更多的性能灵 active (即让它使用更多资源),因为它使用 12 GB 的 RAM 运行。我认为我基本上将该文件的大多数字节和此类相关变量翻了四倍,认为它会使用更多 RAM 来完成它的工作。

但是,数据库似乎没有使用太多 RAM。使用 Linux 系统监视器,我可以看到 postmaster 正在使用 1.6 GB 的共享内存 (RAM)。无论如何,我想知道你们是否可以帮助我更好地理解它在做什么,因为我似乎真的不明白 PostgreSQL 如何使用 HD 资源

关于维基百科数据库的元结构,它们提供了很好的 schema可能对您有用,甚至您感兴趣。

请随时向我询问更多详情,谢谢。

最佳答案

可能是导致问题的 GROUP BY。为了进行分组,数据库必须对行进行排序以将重复项放在一起。索引可能无济于事。粗略计算:

假设每一行占用 100 字节的空间,即 29,500,000,000 字节,或大约 30GB 的存储空间。它无法在内存中容纳所有内容,因此您的系统会出现抖动,从而使操作速度减慢 1000 倍或更多。如果您的 HD 空间正在使用交换文件,它可能会消失在交换空间中。

如果您只需要执行一次此计算,请尝试将其分解为更小的数据子集。假设 pl_namespace 是数字,范围是 1-295,000,000,尝试这样的事情:

SELECT pl_namespace, COUNT(*)
FROM pagelinks
WHERE pl_namespace between 1 and 50000000
GROUP BY (pl_namespace);

然后对 50000001-100000000 等执行相同的操作。使用 UNION 将您的答案组合在一起,或者简单地使用外部程序将结果制成表格。忘记我写的关于索引对 GROUP BY 没有帮助的内容;在这里,索引将有助于 WHERE 子句。

关于database - 为什么 PostgreSQL 会吃掉我所有宝贵的 HD 空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/409727/

相关文章:

node.js - 从sequelize.js获取错误的对象名称,包括从数据到数据的JSON响应中的方法

java - 什么 Java 库可以将 PostgreSQL 数组文字映射到 Java 数组或列表?

java连接后端说明

php - Yii2 在运行时设置数据库连接

linux - 控制台上的 SSH 谷歌云权限被拒绝(公钥),并出现 google-cloud-sdk 文件错误

c++ - NCurses getch 总是返回 ERR (-1)

sql - 使用 gridview delete 命令从多个表中删除

mysql - 无法建立数据库错误。是什么原因造成的呢?

linux - 我如何发布包含符号的多部分/表单数据

postgresql - 在编码 'WIN1252' 中具有字节序列 0x9d 的字符在编码 'UTF8' 中没有等效项