powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Тормозит UPDATE
7 сообщений из 7, страница 1 из 1
Тормозит UPDATE
    #39396066
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем, привет!

Есть таблица reg.person, в ней есть поле stat integer.
Кол-во записей в reg.person 5 миллионов, с пустым stat - 3 миллиона.
Никаких foreign key или index на поле stat нет, как и нет триггеров на таблице.
И при всем при этом запрос выполняется бесконечно

Код: plsql
1.
update reg.person set stat = 0  where stat is null



pg_locks говорит:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
locktype	database	relation	page	tuple	virtualxid	transactionid	classid	objid	objsubid	virtualtransaction	pid	mode	granted	fastpath
relation	16393	121091								2/28	3308	RowExclusiveLock	t	t
relation	16393	121090								2/28	3308	RowExclusiveLock	t	t
relation	16393	121089								2/28	3308	RowExclusiveLock	t	t
relation	16393	121088								2/28	3308	RowExclusiveLock	t	t
relation	16393	121087								2/28	3308	RowExclusiveLock	t	t
relation	16393	121086								2/28	3308	RowExclusiveLock	t	t
relation	16393	121079								2/28	3308	RowExclusiveLock	t	t
relation	16393	86942								2/28	3308	RowExclusiveLock	t	t
relation	16393	72758								2/28	3308	RowExclusiveLock	t	t
relation	16393	72751								2/28	3308	RowExclusiveLock	t	t
virtualxid					2/28					2/28	3308	ExclusiveLock	t	t
relation	16393	11673								3/256	4208	AccessShareLock	t	t
virtualxid					3/256					3/256	4208	ExclusiveLock	t	t
transactionid						3043382				2/28	3308	ExclusiveLock	t	f


где 3308 - это как раз мой запрос


explain говорит:
Код: plsql
1.
2.
3.
4.
QUERY PLAN
Update on person  (cost=0.00..238154.27 rows=4855165 width=931)
  ->  Seq Scan on person  (cost=0.00..238154.27 rows=4855165 width=931)
        Filter: (stat IS NULL)



Что я уже попробовал и мне не помогло:
- удалял все без исключения индексы
- создавал индекс по stat
- добавлял новое поле и пытался в него вставить новое значение
- делал vacuum analyze
- перезагружал весь сервер и службу Постгрес в отдельности
- отключал обращение к Постгрес из вне

В общем, люди, помогите!

---
Postgres 9.5,
OS Windows Server 2008R2,
ОЗУ 32Гб
Размер БД 5Гб
...
Рейтинг: 0 / 0
Тормозит UPDATE
    #39396182
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BazzzВсем, привет!

Есть таблица reg.person, в ней есть поле stat integer.
Кол-во записей в reg.person 5 миллионов, с пустым stat - 3 миллиона.
Никаких foreign key или index на поле stat нет, как и нет триггеров на таблице.
И при всем при этом запрос выполняется бесконечно

Код: plsql
1.
update reg.person set stat = 0  where stat is null



Размер БД 5Гб

Бесконечно это сколько?

На медленных дисках я бы ожидал время выполнения 1-2 часа (если у вас не ssd или не хороший рейд).
Попробуйте во время выполнения посмотреть на дисковую нагрузку.

PS: еще может быть полезно поднять max_wal_size гигов до 8 хотя бы и checkpoint_timeout До 60 минут.
PPS: посмотреть в pg_stat_activity в каком состоянии запрос и не стоит ли у него waiting=true (что вряд ли судя по тому что вы в локах показали).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Тормозит UPDATE
    #39396218
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bazzz- создавал индекс по stat - ?????
- добавлял новое поле и пытался в него вставить новое значение

OS Windows Server 2008R2,
ОЗУ 32Гб
Размер БД 5Гб

1. а смысл создавать индекс по этому полю, если там больше половины нулл?
2. в новое поле тоже должно быстрее работать, чем бесконечность
...
Рейтинг: 0 / 0
Тормозит UPDATE
    #39397908
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BazzzВсем, привет!

Есть таблица reg.person, в ней есть поле stat integer.
Кол-во записей в reg.person 5 миллионов, с пустым stat - 3 миллиона.
Никаких foreign key или index на поле stat нет, как и нет триггеров на таблице.
И при всем при этом запрос выполняется бесконечно

Код: plsql
1.
update reg.person set stat = 0  where stat is null






Bazzz,
делайте update кусками по, скажем, 10000 записей.



Код: plsql
1.
2.
3.
4.
5.
6.
7.
update reg.person 
set stat = 0 
 where reg. person.PK in (
select reg.person.PK from reg. person
where stat is null
limit 10000
)
...
Рейтинг: 0 / 0
Тормозит UPDATE
    #39398050
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
create index person_id_ stat_is_null_ix on reg.person set using btree (id) where stat is null;
...
Рейтинг: 0 / 0
Тормозит UPDATE
    #39398055
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
косякнул в коде так как на быструю руку, но смысл понятен думаю-)
...
Рейтинг: 0 / 0
Тормозит UPDATE
    #39398059
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- создавал индекс по stat
самое вероятное что у вас это поле неселективное, поэтому и не прокатило
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Тормозит UPDATE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]