我目前正在使用更大的 wikipedia-dump 派生 PostgreSQL 数据库;它包含大约 40 GB 的数据。该数据库在装有 Suse Linux Enterprise Server 10 的 HP Proliant ML370 G5 服务器上运行;我通过一个简单的 D-Link 路由器管理的专用网络从我的笔记本电脑查询它。我为笔记本电脑和服务器分配了静态 DHCP(私有)IP。
无论如何,从我的笔记本电脑上,使用 pgAdmin III,我发送了一些 SQL 命令/查询;其中一些是 CREATE INDEX、DROP INDEX、DELETE、SELECT 等。有时我发送一个命令(如 CREATE INDEX),它返回,告诉我查询已完美执行等。但是,分配给这样一个命令似乎仍然在服务器上休眠。现在,我真的不介意这一点,因为我对自己说 PostgreSQL 维护着一个准备处理查询的 postmaster 池。然而,如果这个过程占用了 6 GB 的 9.4 GB 分配的 RAM,我会担心(目前确实如此)。现在也许这是保存在[共享]内存中的数据缓存,以防另一个查询碰巧需要使用相同的数据,但我不知道。
另一件事困扰着我。
我有 2 张桌子。一是页表;我在其page_id列上有一个索引。另一个是具有 pl_from 列的pagelinks表,该列在page.page_id列中没有引用任何内容或变量;与page_id列不同,pl_from还没有索引。为了让您了解表的规模以及我找到可行解决方案的必要性,页表有 1340 万行(在我删除了我不需要的行之后),而pagelinks表有 2.93 亿行。
我需要执行以下命令来清理pagelinks表中一些无用的行:
DELETE FROM pagelinks USING page WHERE pl_from NOT IN (page_id);
所以基本上,我希望摆脱来自不在页表中的页面的所有链接的pagelinks表。即使在禁用嵌套循环和/或顺序扫描之后,查询优化器也总是给我以下“解决方案”:
Nested Loop (cost=494640.60..112115531252189.59 rows=3953377028232000 width=6)
Join Filter: ("outer".pl_from <> "inner".page_id)"
-> Seq Scan on pagelinks (cost=0.00..5889791.00 rows=293392800 width=17)
-> Materialize (cost=494640.60..708341.51 rows=13474691 width=11)
-> Seq Scan on page (cost=0.00..402211.91 rows=13474691 width=11)
似乎这样的任务需要几个星期才能完成;显然,这是不可接受的。在我看来,我宁愿它使用page_id索引来做它的事情......但它是一个顽固的优化器,我可能错了。