Возможно, проблема в вашей базе данных.Как я уже сказал, у вашего первого запроса, похоже, нет проблем.Я могу заключить, что проблема не в запросе.
Возможно, WAL (вход в систему с предварительной записью) слишком велик, и вам нужно перезапустить сервер postgreSQL service (не просто перезапустить сервер, нослужбы также).
Возможно, вам нужно поработать над индексированием для ваших таблиц.
Вы можете запустить EXPLAIN ANALYZE
, чтобы увидеть, что может пойти не так.
BEGIN;
EXPLAIN ANALYZE UPDATE tableA a set columnA = (SELECT SUM(column_that_I_need_to_count) FROM tableB b WHERE st_contains(a.geom, b.geom)
ROLLBACK;
BEGIN
и ROLLBACK
предназначены для того, чтобы отменить изменения и просто посмотреть, что происходит.
Поскольку вы говорите, что ваш запрос никогда не заканчивается, вы должны позволить ему выполняться как час или два ипосмотрите, что говорит EXPLAIN ANALYZE
, если он продолжает работать ... ну ... в вашей базе данных определенно что-то не так.
Кроме этого, вашему SUM
может потребоваться GROUP BY
, потому чтоесли нет, он установит одинаковое значение для всех строк.
Для вашей второй попытки.Правильный способ сделать это:
WITH counted AS(
SELECT a.id as id_counted,SUM(b.column_that_I_need_to_count) AS counted_rows
FROM tableA a, tableB b
WHERE st_contains(a.geom, b.geom) GROUP BY a.id
)UPDATE tableA
SET columnA = counted_rows
FROM counted
WHERE id = id_counted;
Наконец, как говорит @Emilio Platzer, если вам нужно считать, вместо SUM
вы должны использовать COUNT
... но, возможно, вам нуженSUM
... не знаю.