Я выполняю простое естественное соединение на двух больших столах.
- полигонов содержит 68 000 строк (45 МБ)
- roadshydro содержит около 2 миллионов строк (210 МБ).
Означает ли это, что ядро базы данных создает набор данных из 68 000 * 2 миллионов строк при внутреннем естественном объединении? Если это так, то объем требуемой памяти должен составлять 45 * 210 МБ, что намного больше, чем у моей системы (всего 1,5 ГБ).
Когда я выполнил этот запрос, через 5 минут моя система вылетает (аварийное завершение работы). Разве он не может обработать 250 МБ данных в базе данных? Чем тогда полезны базы данных?
"I am modifying the above Question to clear the doubts of readers. 29-02-2012 today."
Кажется, многие мои друзья запутались, потому что я упомянул слово «естественное соединение» в вопросе выше. Реальный пространственный запрос, который я использовал:
select p.OID , r.OID
from poygons as p , roadshydro as r
Where st_intersects(p.the_geom , r.the_geom) ;
где таблицы полигонов и роудшидро имеют по два поля: OID, the_geom. Очевидно, что это перекрестное произведение двух таблиц, а не Natural Join по какому-то общему ключу.
Я отслеживаю потребление основной памяти, когда выполняю вышеуказанный запрос. Ничего не происходит Там нет ни малейшего количества потребления памяти, и при этом я не получаю никакой информации, но загрузка процессора составляет почти 100%. Кажется, база данных вообще не выполняет никаких вычислений. Однако, если я удалю предложение where из запроса, потребление основной памяти постепенно станет слишком высоким (через 5-6 минут), что приведет к сбою системы и внезапному отключению компьютера. Это то, что я испытываю. Что такого особенного в удалении предложения where? почему postgres не может выполнить запрос !! Удивлен таким поведением.