В настоящее время я работаю с базой данных PostgreSQL, полученной из wikipedia-dump; он содержит около 40 ГБ данных. База данных работает на сервере HP Proliant ML370 G5 с Suse Linux Enterprise Server 10; Я запрашиваю его со своего ноутбука через частную сеть, управляемую простым маршрутизатором D-Link. Я назначил статические DHCP (частные) IP-адреса как ноутбуку, так и серверу.
В любом случае, с моего ноутбука, используя pgAdmin III, я отправляю некоторые команды / запросы SQL; некоторые из них: CREATE INDEX, DROP INDEX, DELETE, SELECT и т. д. Иногда я отправляю команду (например, CREATE INDEX), она возвращает сообщение о том, что запрос был выполнен отлично и т. д. Однако процесс postmaster назначен такому Кажется, команда остается спящей на сервере. Теперь я не против этого, поскольку говорю себе, что PostgreSQL поддерживает пул мастеров, готовых обрабатывать запросы. Тем не менее, если этот процесс израсходует 6 ГБ из этого 9,4 ГБ, выделенного ОЗУ, я беспокоюсь (и это происходит на данный момент). Теперь, возможно, это кэш данных, который хранится в [общей] памяти на случай, если другой запрос потребует использовать те же данные, но я не знаю.
Еще одна вещь беспокоит меня.
У меня есть 2 таблицы. Одним из них является таблица page ; У меня есть индекс в столбце page_id . Другой - это таблицы pagelinks , в которых есть столбец pl_from , который не ссылается ни на что, или на переменную в столбце page.page_id ; в отличие от столбца page_id , pl_from не имеет индекса (пока). Чтобы дать вам представление о масштабе таблиц и необходимости найти жизнеспособное решение, в таблице page содержится 13,4 млн строк (после того, как я удалил те, которые мне не нужны), а ссылки на страницы таблица имеет 293 млн.
Мне нужно выполнить следующую команду, чтобы очистить таблицу pagelinks некоторых ее бесполезных строк:
DELETE FROM pagelinks USING page WHERE pl_from NOT IN (page_id);
Так что, в общем, я хочу избавить таблицу pagelinks от всех ссылок, приходящих со страницы, не входящей в таблицу page . Даже после отключения вложенных циклов и / или последовательных проверок оптимизатор запросов всегда дает мне следующее «решение»:
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 для своей цели ... но это упрямый оптимизатор, и я могу ошибаться.