私は現在、より大きなwikipedia-dumpから派生したPostgreSQLデータベースを使用しています。約40GBのデータが含まれています。データベースは、Suse Linux EnterpriseServer10を搭載したHPProliantML370G5サーバーで実行されています。単純なD-Linkルーターによって管理されているプライベートネットワークを介してラップトップからクエリを実行しています。ラップトップとサーバーの両方に静的DHCP(プライベート)IPを割り当てました。
とにかく、私のラップトップから、pgAdmin IIIを使用して、いくつかのSQLコマンド/クエリを送信します。これらのいくつかは、CREATE INDEX、DROP INDEX、DELETE、SELECTなどです。コマンド(CREATE INDEXなど)を送信すると、クエリが完全に実行されたことなどを通知するコマンドが返されます。ただし、このようなコマンドに割り当てられたポストマスタープロセスはコマンドはサーバー上でスリープ状態のままになっているようです。さて、私はこれを本当に気にしません。PostgreSQLはクエリを処理する準備ができているポストマスターのプールを維持していると自分自身に言います。それでも、このプロセスが9.4GBの割り当てられたRAMのうち6GBを消費する場合、私は心配します(そして今のところそうします)。これは、別のクエリで同じデータを使用する必要が生じた場合に備えて、[共有]メモリに保持されるデータのキャッシュである可能性がありますが、わかりません。
もう一つは私を悩ませています。
私は2つのテーブルを持っています。1つはページテーブルです。page_id列にインデックスがあります。もう1つは、page.page_id列の何も参照しないか変数を参照するpl_from列を持つpagelinksテーブルです。page_id列とは異なり、pl_fromには(まだ)インデックスがありません。テーブルの規模と実行可能な解決策を見つける必要性についてのアイデアを与えるために、ページテーブルには1340万行(不要なものを削除した後)があり、ページリンクテーブルには2億9300万行があります。
次のコマンドを実行して、ページリンクテーブルの役に立たない行を削除する必要があります。
DELETE FROM pagelinks USING page WHERE pl_from NOT IN (page_id);
したがって、基本的には、ページテーブルにないページからのすべてのリンクをページリンクテーブルから削除したいと思います。ネストされたループやシーケンシャルスキャンを無効にした後でも、クエリオプティマイザは常に次の「解決策」を提供します。
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インデックスを使用することを望んでいるように思えます...しかしそれは頑固なオプティマイザーであり、私は間違っているかもしれません。