我目前正在使用更大的維基百科 - 轉儲派生PostgreSQL數據庫;它包含大約40 GB的數據。該數據庫使用Suse Linux Enterprise Server 10在HP Proliant ML370 G5服務器上運行;我通過由簡單的D-Link路由器管理的專用網絡從我的筆記本電腦查詢它。我將靜態DHCP(專用)IP分配給筆記本電腦和服務器。PosgreSQL查詢優化和Postmaster過程'
不管怎樣,我的筆記本電腦,使用的pgAdmin III,我送了一些SQL命令/查詢;其中一些是CREATE INDEX,DROP INDEX,DELETE,SELECT等。有時我發送一個命令(如CREATE INDEX),它會返回,告訴我查詢完美執行等等。但是,postmaster進程分配給了這樣一個命令似乎仍然在服務器上休眠。現在,我並不介意這一點,因爲我對自己說,PostgreSQL維護一個準備處理查詢的郵件管理員池。然而,如果這個過程耗盡了6 GB的9.4 GB分配的內存,我擔心(現在這樣做)。現在,也許這是一個保存在[共享]內存中的數據緩存,以防其他查詢碰巧需要使用相同的數據,但我不知道。
另一件事是困擾我。
我有2個表格。一個是頁面表;我在page_id列中有一個索引。另一個是頁面鏈接表,其中有pl_from列,該列在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索引來做它的事情......但它是一個固執的優化器,我可能是錯的。
有什麼想法?
其實,這就是我想爲它看起來像我最好的鏡頭。如果有效,我會公佈結果。謝謝! – 2009-01-05 21:52:12